ADB error : more than one device and emulator


안드로이드 디바이스를 연결하거나 지니모션(Geny Motion)을 쓰면서 ADB를 사용하다보면 위와 같은 에러가 나올 때가 있다.


이것은 디바이스나 에뮬레이터가 2개 이상있거나 하나도 없을 경우 나오는 에러로 판단된다.


만약 위와 같은 에러가 나온다면 해결 방법은 아래와 같다.




>adb devices

보면 엄청 많은 에뮬레이터가 있는 것을 볼 수 있다.

(분석하느라 껐다 컸다를 자주하다보니..)




만약 사용하고 있는 에뮬레이터나 디바이스가 어떤건지 알고 있으면 연결 시켜주면 된다.




필자는 뭔지 몰라서 다 연결 해보았다.

adb -s emulator-XXXX shell

adb connect localhost


하지만 아무것도 연결이 되지 않았다.

만약 여기서 해결 되는 분들은 그대로 하시면 되고 만약 필자와 같이 안된다면 아래를 더 보자




먼저 연결된 디바이스나 에뮬레이터를 전부 꺼준다.

>adb kill-server

위의 명령어로 전부 지우고

>adb devices

List of devices attached를 볼 수 있다.

그리고 다시 에뮬레이터를 실행하거나 디바이스를 연결하면


1개가 다시 생기는 것을 볼 수 있고


adb shell로 연결이 되는 것도 확인 할 수 있다.





아마 대부분은 이런 해결 방법으로 해결 될 수 있다고 생각된다.

나의 이러한 뻘짓이 다른 사람들에겐 도움이 되었으면 좋겠다.














참고 : http://www.keyables.com/2012/06/solution-for-adb-error-more-than-one.html


http://shloves.tistory.com/entry/adb-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EB%AC%B8%EC%A0%9C-%EC%8B%A4%ED%96%89-%EC%8B%9C%ED%82%A4%EC%A7%80-%EC%95%8A%EC%95%98%EB%8D%98-%EC%8B%A4%ED%96%89%EC%A4%91%EC%9D%B8-emulator5554-%EC%A2%85%EB%A3%8C%ED%95%98%EA%B8%B0











http://codeengn.com/challenges/smartapp/02 


정적분석을 위하여 위의 코드엔진 문제중 smartapp/02를 통해 분석을 해보겠다. 

그리고 이 포스팅은 전에 있던 포스팅에 설정된 것을 그대로 하니까 전 포스팅부터 읽으면 잘 될 수 있을 것이다.

02.zip



Geny Motion으로 먼저 어떤 앱인지 확인 해볼려고 한다.

그런데 시작부터 막힌다! 보통 지니모션을 사용한다면 드래그앤 드롭으로 바로 설치가 되어야 한다.

하지만 필자가 할 때 그냥 sdcard에 저장을 시켜버리고 설치를 안한다... 아래처럼

Files successfully copied to:/sdcard/Download/




그래서 확장자를 02.apk로 바꿔 드래그 앤 드롭해보니 아래와 같은 에러를 뿜으면서 안된다.

An Error occured while deploying the file. 30%




그럼 sdcard/Download/로 옮겨졌으니까 거기서 설치하면 될까 싶어서 해보았다.

app not installed라는 에러를 또 뿜으면서 안된다..하...

※여기서 File Manager로 파일 확장자 수정하는 방법은 Filezila를 통하여 수정하였다. Filezila를 사용하는 방법은 전 포스팅을 보면 될 것이다.



그래서 이번엔 adb로 설치를 해보았다.

오류를 보아하니 INSTALL_PARSE_FAILED_NO_CERTIFICATES라는 것을 확인했다.

CERTIFICATES는 인증서 관련인데 아마 앱에 인증이 안되어 있다고 볼 수 있다.



그래서 앱에 인증서를 추가했다.



C5-apk-sign.zip

앱(어플)에 인증을 추가하는 방법은 위 파일을 다운받아 풀고 폴더에 인증하고 싶은 앱을 넣고 위와 같은 명령어를 치면 된다.

Java -jar signapk.jar testkey.x509.pem testkey.pk8 2.apk 2(sign).apk

              [원본] [인증된 apk]




그리고 다시 adb install 2(sign).apk로 설치하니 됐다.




그럼 Findkey2가 설치된 것을 확인 할 수 있다.




FindKey:)  키를 찾으래요 



그럼 이제 Key를 찾아보자!

아까전에 받았던 apk를 .zip으로 바꿔 압축풀기를 해보자


그랬더니 XML파일과 DEX파일이 나왔다.


하지만 우리는 하나더 풀것이다.



apktool d 2(sign).apk



apktool로 디컴파일 한것에는 smali와 yml 파일을 볼 수 있다.

그냥 압축해제한 파일과는 좀 다르게 생긴 것을 알 수 있다.

그래서 압축해제한 파일과 apktool로 디컴파일한 파일을 가지고 분석해볼 것이다.




그리고 압축해제한 폴더에 classes.dex파일이 있는데 이것을 dex2jar로 푼다.



jar파일이 나온다.



여기서 JD-GUI를 사용하여 열면 아래와 같이 볼 수 있을 것이다.





아래 내용은 apktool로 디컴파일했던 xml이다. 압축해제한 xml은 보이지 않는다.

activity에 보면 MainActivity가 시작되는 것을 볼 수 있다.

※Activity, Service, Broadcast Receiver(방송수신자), Content Provider(콘텐츠 제공자)[인스턴스화 할 수 있는 4가지 컴포넌트로 구성]

Application은 이들 중 일부만 가질 수도 있고 여러 개를 가질 수도 있다.



다시 JD-GUI로 돌아와서 MainActivity를 찾아본다. 

MainActivity를 보니 하단에 있는 KeyString이 눈에 띄고 그 위에 if((makedate()=="2013-11-02-12:35:03") && (Volume() ==53)) 문장이

아주 아주 아주 핵심이 될거 같은 느낌이 많이 든다.



그럼 이제 smali를 보자

아까 apktool로 디컴파일한 곳에서 MainActivity.smali를 찾는다.


찾고나서 2013을 찾아보면 v1변수에 2013-11-02-12:35:03이 저장되어 있는 것을 볼 수 있고

그 아래에 

if-ne v0, v1, :cond_0

를 볼 수 있다.

if-ne v0, v1 :cond_0의 뜻은

v0과 v1이 틀리면 cond_0으로 jump 해야한다.


Cond_0으로 가면 return-void로 끝나게 된다.

Cond_0으로 틀리면 가니까 무조건 맞게하면 안 넘어 갈 수 있다.

따라서

if-ne v0, v1, :cond_0을

if-eq v0, v1, :cond_0로 바꾼다.


if-eq v0, v1 :cond_0은

v0과 v1이 같으면 cond_0으로 jump 해야한다.

로 해석 할 수 있으니까 말이다.




그럼 아까 if문에서 앞에껄 처리 했으니 뒤에 있던 volume==53 값을 보아야한다.


smali 코드에서는 16진법으로 나타나 있기때문에 0x35를 찾는다.

여기도 if-ne v0, v1, :cond_0 되어있다.

다르면 cond_0으로 넘어가게 되어 있으니 같으면 cond_0으로 넘어가게 한다.

volume값을 바꾸던지 if-ne을 바꾸면 된다.

필자는 if-ne를 바꿀 것이다.




바꾼 것을 저장하고 이제 다시 컴파일 해줄 차례이다. 디 컴파일된 경로로 가서

(임의로 '2(sign decom)'을 '2'로 바꿨다)

apktool b 2 -o 2(fix).apk

그러면 apk 파일이 나오는 것을 알 수 있다.




위 apk파일을 바로 옮겨서 실행해보면 안된다.

왜나면 아직 인증을 하지 않았기 때문이다.

아까 초반에 인증했던 것 처럼 인증을 해줘야 한다.





이제 해보자 만약에 꼬이는 걸 방지하기 위해 최초에 깔아뒀던 FindKey를 지우고 설치한다.



그리고 실행해보자!

확인 했을 때 키가 나오는 것을 알 수 있다.






앱 정적분석할 때 Smali Code와 java source로 분석했다.

만약 Smali Code만 가지고 분석할려면 시간이 많이 걸릴 것이다. 

따라서 다른 곳에서 정보를 많이 얻어서 찾으면 좀 더 수월해 보인다.

안드로이드는 정말 환경에 영향을 많이 받는 듯 싶다. 업데이트만 하면 안되고 분명히 저번엔 잘 됐는데 환경은 안바뀌고

시간만 지났는 데도 안되고 정말 예민한 친구인듯 하다...

이번 문제는 쉬우고 직관적으로 보였기 때문에 빨리 찾을 수 있었는데 어려운 문제나 실제로 쓰는 앱을 분석할려면

Java 언어에 대한 이해가 많이 필요해 보인다.

그리고 어플은 단지 소스만 바꾸는게 아니라 인증 과정까지 거쳐야 사용 할 수 있다. 









버프수트(Burp Suite)와 지니모션(GenyMotion)이 이미 설치 되어있다는 가정하에 진행됩니다.


지니모션과 버프수트는 다른 블로거들의 글에 아주 아주 자세히 설명되어 있습니다.



Burp Suite를 키시고 Proxy - > Option으로 가서 

Proxy Listeners에 Add를 누릅니다. 그리고 위와 같이

Bind to Port : 8888

Bind to address : All interfaces를 해줍니다.

여기서 Port 번호는 임의로 주셔도 되는데 안쓰는 Port를 하시는게 좋습니다.

일반적으로 8080을 많이 씁니다.



이것은 설정 안해주셔도 데이터보는데 지장은 없지만 

Server Responses도 같이 볼 수 있도록 설정하는 겁니다.

아까 위에서 Proxy Listeners에서 좀 내려오면 있습니다.




일단 Burp Suite에서 설정은 끝났고 이제 안드로이드에서 설정합니다.






설정(Settings)에 들어가서 WIFi -> WiredSSID를 꾹 누르거나 우클릭합니다.

그러면

Forget network

Modify network

창이 나오는데

Modify network를 누릅니다.



이런 화면이 나오면 잘 누르신겁니다.

Show advanced options를 누르면

Porxy settings과 IP settings가 나옵니다.

Proxy settings을 Manual로 바꿔주시고 IP Settings는 그대로 두거나 DHCP로 놔두시면 됩니다.



빨간색 사각형에는 여러분의 리얼 머신 IP주소를 넣고(실제 컴퓨터 IP입니다)

Proxy Port는 아까 Burp Suite에서 설정한 Port번호를 넣으시면 됩니다.



그리고 burp suite에서 한글을 보실려면 Options -> Display

HTTP Message Display를 한글 지원 가능한 폰트를 쓰면 됩니다.







그럼 이제 악의적인 사용하시지 마시고 연구하시면 됩니다!!






※ 앱과의 통신에서 중요한 정보는 꼭 풀수 없는 암호로 암호화하여 보내거나, 전송하면 안됩니다

평문으로 보내거나 허술한 암호로 암호화 할 경우 악의적인 사용자에 의해 중요정보가 탈취 될 수 있습니다!!








  1. 응엥 2018.10.07 10:54

    혹시 이론적으로
    유튜브나 넷플릭스 같은 앱의 패킷 데이터를 통신3사에서 QoS를 걸지 않는 벤치비 어플의 패킷 데이터로 바꾸면 속도제한 없이 이용할 수 있게 되는건가요?

이 글을 참고하여 악용하시면 안되요. 정보통신망법, 정보통신기반보호법에 의거 처벌 받을 수 있습니다.



ddms을 이용하여 실행 중인 안드로이드 앱 메모리를 덤프하여 비밀번호를 추출해 볼것이다.


따라서 ddms가 설치가 되어 있는지 확인을 해야한다.

설치 경로 : C:\android\sdk\tools\lib


이런 창이 실행 된다면 사용 할 수 있다. 필자는 환경 변수로 지정해놨기 때문에 어디서든 실행 시킬 수 있다.



먼저 알아보고자 하는 앱을 실행시키고 ddms을 실행시킨다. 그 후 앱에서 로그인을 해본다.




문둥문둥한 사각형에 해당되는 앱을 클릭하고 직사각형 부분을 클릭하면 hprof파일을 떨궈준다.

이 파일을 폴더 하나 만들어서 거기에 저장한다.



하지만 여기서 hprof파일이 표준이 아니어서 표준 형식으로 바꿔 줄 것이다.

hprof 표준 형식 프로그램 위치 : C:\android\sdk\platform-tools



hprof-conv [방금 떨군 파일] [표준형식으로 바꿀 이름]




위와 같이 하면 새로운 파일이 만들어 진 것을 볼 수 있다.

그럼 이제 이 파일을 가지고 메모리 분석을 해볼 것이다.

메모리 분석할 떈 MemoryAnalyzer64를 쓸것이다.

MemoryAnalyzer64.z01 MemoryAnalyzer64.z02 MemoryAnalyzer64.z03 MemoryAnalyzer64.z04 MemoryAnalyzer64.z05 MemoryAnalyzer64.z06 MemoryAnalyzer64.zip


MemoryAnalyzer 실행 모습



왼쪽 상단의 File -> Open Heap Dump -> 아까 형식 바꾼 파일



위와 같이 열린 것을 알 수 있다.




이제 분석하기 쉽게

상단 중앙에 있는 트리 형태를 클릭해주고

상단 오른쪽에 사각형 3개에서 Group by class loader를 누르면 위와 같이 나오는 것을 알 수 있다.

여기서 왼쪽 Attributes에서 Go to 하면 md5로 된 비밀번호를 확인 할 수 있었다.




아주 손쉽게 메모리 덤프를 뜨고 메모리에 있는 비밀번호를 추출 할 수 있었다. 그러므로 모바일 앱을 만들 땐

메모리 보안에도 신경써야 함을 알 수 있다. 

중요 정보는 꼭 AES-256 등 안전성이 검증된 암호화 방법을 써야 하며

루팅 탐지하여 루팅 되었을 때 앱 실행을 막는다거나 다른 보안적 조치가 필요하다.





  1. 해바라기 2017.07.28 05:40

    감사합니다!

/data/app에는 apk가 저장이 됨.


/data/data에는 설치 파일들이 있다.


※   /mnt/sdcard[해당 APP 이름]

     /data/app/apk(설치파일)

     /data/data/[해당 APP 이름] 

     /data/data/[해당 APP이름]/cache

     /data/data/[해당 APP이름]/database

     /data/data/[해당 APP이름]/shared_prefs

     /data/data/[해당 APP이름]/lib

     /data/data/[해당 APP이름]/files


보통 shared_prefs에 중요한 정보가 포함되어 있을 확률이 높다.

따라서 이 폴더로 들어가서 검색해보면 잘 나올 수 있다.





임의로 어떤 앱을 다운 받아서 분석해보았다.

분석할때 명령어들 중에서


find /data -mmin -(시간) print | grep com.ABCD.ADF.client ...

특정시간 시간 이전부터 현재까지 수정된 파일 찾기로 범위를 좁히거나 찾거나 



grep -r (중요필드) ./

필드명으로 찾을 수 있다.

비밀번호가 평문으로 저장되어 있음을 확인 할 수 있다.



※ 이러한 방법으로 단말기에 저장되어 있는 비밀번호를 알아 낼 수 있다.

그러므로 단말기에는 중요 정보를 저장하면 안되고 저장하더라도 풀 수 없는 암호화를 써서 저장을 해야 된다.


전 포스팅에서는 adb shell이 실행되는 거 까지 해보았다. 이번엔 안드로이드에 플레이스토어를 깔고 가상머신 세팅해 볼것이다.



.먼저 저번에 세팅한 디바이스와 좀 다를 것이다. 필자는 4.1.1 버전을 통해 해볼 것이다.


그리고 ARM Translation Installer 와 안드로이드 마켓을 설치 한다.

ARM Translation Installer는 ARM CPU를 에뮬레이터로 해주기 위한 모듈 이다.


Genymotion_ARM_Translation_v1.1.zip


위의 파일을 받고 드래그앤 드롭으로 설치한다.


그리고 안드로이드 마켓을 설치를 위해


http://www.teamandroid.com/gapps/


위의 링크에 들어가서 가상머신에 맞는 zip파일을 다운 받아서 똑같이 드래그앤 드롭으로 설치를 한다.

설치를 하고 나서 가상머신은 꼭 재부팅 해줘야한다.


gapps-jb-20121011-signed.zip <필자가 설치한 버전>

그러면 Google Play 스토어를 설치 된 것을 알 수 있다.


그리고 구글 플레이스토어에서 Superuser, SSHDRoid, busybox free, Google Korean Input을 설치한다.

Supueruser는 이미 있을 수도 있고

Google Korean Input은 한글 입력을 위한 도구

SSHDRoid는 후에 파일전송에 사용

busybox는 adb 명령어를 좀 더 다양하게 쓸 수 있도록 한다.


이제 원래 컴퓨터에서 FileZilla를 설치한다.


FileZilla_3.14.1_win64-setup.exe

https://filezilla-project.org/


이제 SSHDRoid와 파일질라를 통해 파일을 탐색, 옮길 수 있도록 해볼 것이다.


SSHDroid에서 오른쪽 상단에 있는 Start를 눌러서 실행을 시킨다.


그리고 호스트에서 CMD창을 연다.

>adb shell

# netcfg

명령어를 입력하면 위와 같은 결과값을 받을 수 있다.



아까 받은 결과 값중에 Mac값과 비교하여 파일 질라 호스트에 IP를 넣어주고

사용자명 : root

비밀번호 : admin

포트 : 22

설정하여 빠른 연결하면 Success한 것을 볼 수 있다.







안드로이드 SDK란?

안드로이드 애플리케이션의 개발, 테스트, 디버그를 수행 하는데 필요한 모든 API들과 도구를 포함하고 있는 소프트웨어 개발 킷

안드로이드 SDK 플러그인을 사용하여 Eclipse IDE에 적용 가능


안드로이드 SDK 주요 구성요소

안드로이드 API

- 네이티브 안드로이드 애플리케이션을 개발하기 위하여 사용한 것과 동일한 라이브러리


개발도구

- 안드로이드 응용 프로그램 개발, 즉 애플리케이션의 컴파일, 디버그, 테스트하는데 필요한 각종 도구

- Eclipse 상에서 개발하는 경우 이 도구들을 직접 다루지 않음


풍부한 문서

- 안드로이드 SDK의 각종 패키지, 클래스에 대한 설명

- Java의 경우 Java SDK Documentation과 유사


샘플코드

- 안드로이드 API 기능의 사용법을 나타낸 예제 프로그램 코드

- Eclipse 프로젝트에 추가하여 실행 가능


안드로이드 가상 기기(AVD)

AVD : Android Virtual Devices

SDK 1.5부터 에뮬레이터를 실행하기 위해 최소 1개의 AVD 필요

AVD로 인하여 여러 버전의 안드로이드 디바이스를 위한 애플리케이션을 각각의 버전과 SDK Add-On에 맞게 테스트 가능

예를들어 카메라가 있는 경우, 쿼티 자판이 있는 경우, 1.1SDK를 탑재한 단말, 1.5SDK를 탑재한 다바이스 등 여러 가지 구성을 가지고 있는 가상의 디바이스를 지원 가능하게 함

각 AVD 마다 하나의 안드로이드 에뮬레이터를 구동 할 수 있다.


안드로이드 디버그 브릿지(ADB)

ADB : Android Debug Bridge

안드로이드 에뮬레이터 혹은 안드로이드 단말기에 접속할 수 있도록 하는 클라이언트 및 서버 애플리케이션

에뮬레이터 혹은 안드로이드 단말기에 명령을 내리는 역할

애플리케이션의 설치/제거 작업 가능

안드로이드 단말기에나 에뮬레이터의 상태를 관리

안드로이드 단말기를 대상으로 할 경우 USB디버깅 모드가 활성화되어 있어야 함.




먼저 설치하기전에 Java JDK가 설치되어 있고 환경변수도 설정이 되어있어야한다. 이 부분에 대해선 이미 했다고 가정하에 진행하겠다. JDK 설치가 되어있고 환경변수도 제대로 지정되어있다면 아래와 같은 명령어들이 어디에서든 나올 것이다.


(*추가 JAVA JDK가 설치 안되어있어도 된다. 필자가 원래 있던 JDK로 하려다가 안되서 다시 했다 따라서 이 글 중간에 JDK설치, 환경변수 설정하는 방법도 포함 시켰다)




먼저 Android Studio를 설치한다. 

http://developer.android.com/sdk/

위 경로로 들어가서 플랫폼에 맞는 최신버전을 다운로드해서 쓰면된다. 공식 안드로이드 개발 도구 이나 속도가 느리고 호환성에 다소 문제가 발생할 수 있다.

필자는 위와 같은 경로로 지정해줬고 나머지는 Default으로 설치한다. 




이 화면은 설치 PC가 Intel 가상화 기술(VT-xx)이 지원되는 경우에만 해당된다.

Intel HAXM 설치 과정

기본 Default 설정되어있는 2GB 사용한다(시스템 메모리가 여유가 있으면 추가 설정)

메모리를 과다하게 설정할 경우 다른 프로그램이 느려질 수 있으므로 각 컴퓨터에 맞게 조절한다.



그럼 설치가 끝난 Android Studio를 실행해보자

실행해서 되면 정말 다행이다!


하지만 안될 경우가 있다.

(이번에 할때 ["Tools" ..... JDK rather than JRE]라는 오류나 [..... JAVA_HOME .....] 라는 오류가 떴다)

버전문제인지 경로문제인지 정확히는 모르겠지만

기존의 jdk와 관련된 환경변수들을 다 지운다.(C:\에 있는 기존의 JAVA는 안지워도 상관이 없다.)


jdk-7u75-windows-x64.z01 jdk-7u75-windows-x64.z02 jdk-7u75-windows-x64.z03 jdk-7u75-windows-x64.z04 jdk-7u75-windows-x64.z05 jdk-7u75-windows-x64.z06 jdk-7u75-windows-x64.z07 jdk-7u75-windows-x64.z08 jdk-7u75-windows-x64.z09 jdk-7u75-windows-x64.z10 jdk-7u75-windows-x64.z11 jdk-7u75-windows-x64.z12 jdk-7u75-windows-x64.zip

이 버전을 통해서 환경 설정을 다시 해보니 실행이 되었다.

환경 변수 설정은 아래와 같이 한다. 


시스템 변수에 위의 버전을 풀어둔 곳으로 새로 만들기로 만든다.


이건 직접 연관이 없고 나중에 쓸 경우이지만 위와 같이 변수이름: SDK, 변수값은 오른쪽에 나오는 것처럼 한다.


마지막으로 시스템 변수 Path의 맨 앞에 위와같이 넣어준다. JDK와 SDK사이에 ;(세미콜론)을 뺴먹으면 안된다.

그리고 적용하고 확인하면 실행 되는 것을 알 수 있고

확인 한번 누르면 아래와 같은 창이 나온다.



혹시 저와 같이 외장하드나 외장SD카드에 설치하신 분들이 있을 수도있는데

위와 같은 에러가 뜬다면 경로를 바꾸어서 다시 설치해야 될 듯 싶다.

(처음부터)



*********************************여기서부터 저와 같이 에러가 뜨신분들만 참고*********************************


경로를 

위 : C:\android\Android Studio

아래 : C:\android\sdk


 


아까전에 위와 같이 설정하였는데

지우시고 재설치하는데 경로를

JDK같은 경우 C:\android\JDK로 바꾸시고

SDK부분도 C:\android\apktool와 같이 경로를 다 바꾸면 된다.


*******************************************************************************************************************************



설치가 제대로 되었다면 위와 같은  화면이 뜨게 될 것이다.


그럼 위의 화면에서 Confiugure  -> SDK Manager를 누르면 아래와 같은 창이나오는데

맨위에 있는 Tools에서 Not Installed라고 되어 있는 tools을 설치한다.





이제 지니모션을 설치하러 간다.

http://www.genymotion.com

설치 할 때 회원가입이 필요하니 회원가입을 하고 다운로드하면 되겠다.

그리고 다운로드 할때는 With Virtual box로 설치한다.




로그인을하고 임의로 저 디바이스를 만들면 된다. 그리고 Start를 누르면 실행이 된다.



이런 화면이 뜬다면 다행이다!


만약에 자신의 OS가 Windows 10이라면 안뜰것이다.

지금 지니모션과 같이 설치되는 버츄얼박스는 구버전이라 Windows 10이 지원이 안된다.

만약에 실행이 되었다면 *** 부분은 넘어가도 되겠다.


************************************** Windows 10 사용자 **************************************


먼저 프로그램 삭제에서 Genymotion 과 Oracle VirtualBox를 지운다.


https://www.virtualbox.org/wiki/Downloads

가서 자신에게 맞는 최신버전을 다운받는다.


그리고 아까 다운로드하는 곳에서 With VirtualBox가 아닌 Without VirtualBox를 설치한다.

그리고 아까 Nexus를 다시 Add하여 실행시키면 될 것이다.


************************************** Windows 10 사용자 끝 **************************************



위에 안드로이드 창이 보인다면 CMD에서 adb shell을 실행시켜본다. 실행시켜서 위와 같이 나온다면 

지니모션으로 가서 Settings -> ADB -> SDK경로로 아래와 같이 지정해준다.

그리고 Genymotion을 재시작한다.



그리고 adb shell을 다시 입력한다.

위와 같이 커맨드창이 바뀐다면 성공이다.




다음 포스팅에는 플레이스토어를 깔고 안드로이드에서 설정하는 것을 해볼 것이다.







DEX파일이란 JAVA코드로 작성돼 컴파일된 클래스 파일을 DX(Android DX tool)도구를 사용해 변환한 파일이다. 이 과정에 java 바이트 코드들은 달빅 바이트 코드로 변환 되며 여러 클래스 파일에 들어있는 중복된 코드들을 재사용하기 때문에 JAR(Java Archive)파일에 비해 필요한 공간이 절반 정도로 줄어들게 된다.
이러한 성질을 이용하여 다양한 Java파일을 묶은 클래스 파일을 DEX형태로 바꾸는 것이다. 아래의 사진을 참고하면 이해하기 쉬울 것이다.




Java파일이 Dex파일로 바뀌는 과정 및 역으로 바뀌는 과정



이 글에서는 Java파일을 DEX파일로 바꾸는 방법을 알아보고자 한다.

필요한 준비물

1. 자바 개발 킷(Java Development Kit) : 자바 코드를 클래스 파일로 컴파일하기 위함
링크 : http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
링크 타고 들어가면 아래와 같은 화면을 볼 수 있을 것이다. Accpet License Agreement를 체크 해주고 아래에 사용자 OS에 맞는 것을 설치 한다.

C:\Program Files\Java\jdk1.8.0_73\bin
위 경로는 기본 설치 경로이며, 빨간색으로 칠해져 있는 곳은 각 버전마다 다를 수 있으니 참고하시길 바랍니다. 


2. 안드로이드 SDK : 자바 클래스 파일을 DEX파일로 변환하기 위해 SDK에 있는 도구 중 일부를 사용
안드로이드 SDK로써 이클립스등 다양한 툴이 있는데 여기선 안드로이드 SDK를 사용 할 것이다.
링크 : http://developer.android.com/sdk/index.html#Other


빨간곳 안에서 사용자가 쓰고 있는 OS에 맞게 다운로드 합니다.
다운로드하면 기본적인 것이 깔리는데 다 깔고 나서 SDK Manager를 실행시켜 줍니다.


여기서 Tools에 해당되는 것을 체크해주고 설치합니다. 그러면 후에 쓰일 dx를 사용 할 수 있습니다.


3. 텍스트 편집기 : 샘플 자바 프로그램을 구현하기 위해 텍스트 편집기
필자는 Sublime Text3을 사용 하여 샘플코드를 제작했다.
링크 : http://www.sublimetext.com/3
서브라임 텍스트는 범용성이 좋아서 깔아두면 요긴하게 쓰일 수 있다. 굳이 이걸로 할 필욘 없지만 쓰는 텍스트 편집기가 없다면 고려해볼만 하다.
그리고 서브라임 텍스트의 설정방법은 타 블로그에 검색해보면 자세히 나와있으므로 설명은 생략한다.



준비물이 준비되었다면

텍스트 편집기를 열고 다음 코드를 이용해 파일을 생성 한다.




위와 같은 소스로 Example.java라는 이름으로 저장한 후 터미널이나 명령 프롬프트(CMD)에서 다음 명령을 입력해서 컴파일 한다.



컴파일 후 아래의 모습


컴파일하고나서 뜨는 Warning 은
JDK 최신 버전에서 구버전으로 -source를 지정해서 컴파일 할 경우 아래와 같은 오류가 발생하지만 경고일 뿐이라서 무시해도 상관 없다.
만약 컴파일했는데 엑세스 거부가 뜬다면 관리자 권한으로 cmd를 실행하여 해보자.




그러면 자바 파일과 Class파일이 생긴 것을 확인 할 수 있다.

컴파일할 때 실행하려는 파일의 위치로 Example.java파일을 옮겨 할 수 도 있고 환경변수를 지정하여 어디든지 할 수 있고 할 방법은 다양하다.



컴파일을 통해 Class 파일이 준비되었다면 아까 안드로이드 SDK에서 깔았던 기능 중에서 dx를 사용 할 것이다.
C:\Users\사용자\AppData\Local\Android\android-sdk\build-tools\23.0.2가 필자의 기본 경로이며 dx.bat이 있다면 사용 할 수 있다.



아까 컴파일하여 Class파일을 만들었다면 이 해당 하는 파일을 사용한다. 

아래의 dx --dex --output=Example.dex Example.class를 입력해준다. 

해당 명령어를 입력해주면 DEX파일이 만들어지는 것을 알 수 있다.


-dex : dx에게 DEX파일을 생성할 것이라고 알려줌
-output=example.dex : dx에게 작업을 통해 생성되는 파일의 이름이 example.dex라고 알려줌
Example.class : 입력될 파일 



이렇게 Java파일을 Class로 바꿔 DEX파일로 바꾸어 보았다.

처음에 했던 것은 자바 개발자들이 많이 하는 것으로 자바 객체라 불리는 것을 만드는 것이고 이 객체가 Example이다. 

그다음은 Example.java를 클래스 파일로 컴파일한다. 여기서는 자바 컴파일러가 사람이 작성한 코드를 분석해 자바 가상 머신을 위한 스택 기반의 명령어 집합으로 변환 처리한다.

마지막으로 자바 데이터와 스택 기반의 명령어로 이루어진 CLASS 파일을 만들고 리소스, 데이터 구조와 레지스터 기반의 명령어로 이루어진 달빅 가상 머신(Dalvik VM)이 이해할 수 있는 DEX파일을 만들었다. 



참고자료 : http://blog.naver.com/gigar/60115566766
           안드로이드 해킹과 보안(에이콘)


+ Recent posts