이번 포스팅에서는 가장 흔하게 배포되고 있는 안드로이드 스미싱 악성코드인 CJ대한통운 택배 사칭 앱에 대한 악성코드 분석을 한다. 분석 방법은 AndroidManifest.xml 분석과 코드 정적 분석 그리고, 직접 실행하여 유출되는 패킷을 분석하는 동적 분석을 진행할 예정이다.


해당 악성 앱은 실제 구글 앱 스토어에 있는 앱과 아이콘이 유사하기 때문에, 일반 사용자들은 이를 CJ대한통운 택배 앱으로 착각하고 설치하게 되었을 때, 피해를 입게 된다. 다음과 같이 CJ대한통운 택배 앱을 사칭하며, 실제 정상 앱과 유사한 아이콘으로 일반 사용자들을 속이고 설치를 유도한다.

 

 

해당 악성코드를 Virustotal 사이트에서 확인해보면, 다음과 같이 많은 백신 엔진에서 이를 탐지하고 있음을 알 수 있으며, 탐지명은 대다수가 Android.Trojan.SmsSpy 명칭을 사용하는 악성코드로 SMS 정보를 탈취하는 행위를 하는 것을 가늠할 수 있다.

 

 

 

1. AndroidManifest.xml 분석

​Apktool를 이용하여 AndroidManifest.xml를 열어보면, 해당 악성 앱은 다음과 같은 권한을 요구한다.

 

 

  - 네트워크 사용 권한 (INTERNET)

  - 폰 상태 정보 읽기 권한 (READ_PHONE_STATE)

  - SMS 읽기 권한 (READ_SMS)

  - SMS 보내기 권한 (SEND_SMS)

  - 부팅 완료 시, 브로드캐스트를 받을 수 있게 하는 권한 (RECEIVE_BOOT_COMPLETED)

  - SMS 수신 권한 (RECEIVE_SMS)

  - 환경설정 변경 권한 (WRITE_SETTINGS)

  - 전화 수신 관련 권한 (CALL_PHONE)

  - 폰 상태 변경 권한 (MODIFY_PHONE_STATE)

 

최초로 수행되는 Entry Point는 MainActivity로 등록되어 있으며, 그 밖에 1개의 Activity와 1개의 Service, 2개의 Receiver로 구성되어 있음을 확인할 수 있다.


 

 

2. 소스 코드 정적 분석

소스 코드 정적 분석의 경우 JEB Decompiler를 이용하였으며, 이전 포스팅에서 JEB Decompiler에 대한 설명을 하였다.

JEB Decompiler : 2017/05/02 - [Analysis/Android] - 안드로이드 디컴파일러 (JEB Decompiler)

 

최초 앱이 실행되면 아래 그림처럼 실행과 동시에 애플리케이션 목록에서 해당 앱의 아이콘을 은폐시킨다. 또한, 앱 디렉토리 내에 shared_prefs에서 perf.xml 파일에 접근하여 해당 정보를 가져오며, PreodicService​RegDPMActivity​를 각각 인텐트로 Service와 Activity 형태로 실행하게 된다.


 

http://goncp.ucmkb.net/ DNS 주소를 확인할 수 있다.

 

 

다음으로 Intent를 이용하여 Service로 등록시킨 PreodicService​를 분석해보면, 해당기기의 전화번호를 http 프로토콜의 파라메타 형태로 전송한다.

 

 

RegDPMActivity​ 경우, Intent를 이용하여 Activity 형태로 실행시키며 앱이 실행되면 기기 관리자 정보를 요구한다.

 

 

 

 

다음으로 Receiver로 등록된 CallStateReceiverSMSBroadcastReceiver​의 경우, 기기의 상태를 체크하여 해당 기기의 정보를 탈취하려는 의도를 확인할 수 있다.

 

 

 

 

3. 네트워크 동적 분석

다음으로 Tcpdump를 이용하여, 해당 악성 앱을 동작시켜 실제 유출지로 기기의 정보를 전송하는지 분석한다.

안드로이드 환경에서의 Tcpdump 사용 방법은 이전 포스팅에서 설명하였다.

안드로이드 환경에서의 Tcpdump 사용 방법 : 2017/05/03 - [Android] - 안드로이드 환경에서의 Tcpdump 사용 방법

 

해당 기기에서 악성 앱을 동작시키고 덤프 받은 pcap 파일을 분석하면 다음과 같이 기기의 정보를 전송하는 것을 확인할 수 있다.

 

 

또한, 유출 도메인을 nslookup 명령어를 실행하여 해당 DNS 정보를 조회할 수 있는데, 이를 조회할 경우 다음과 같은 IP를 확인할 수 있다.

 

 

해당 IP를 whois를 이용하여 유출 국가를 확인할 수 있는데, 다음과 같이 홍콩으로 해당 정보가 유출되는 것을 확인할 수 있다.

 

 

 

 

4. 악성 앱 제거 방법

해당 앱을 삭제하기 위해서는 다음과 같이 기기 관리자 정보에서 기기 관리자 권한을 해제한 후, 제거가 가능하다.

 

 

 

 

 

 

안드로이드용 Tcpdump는 아래 사이트에서 다운로드 받을 수 있으며, adb 명령어를 이용하여 안드로이드 기기 내부의 /data/local/tmp/ 디렉토리에 Push 하여 실행이 가능하다.


안드로이드용 Tcpdump : http://www.androidtcpdump.com/android-tcpdump/downloads


다운로드 받은 Tcpdump를 안드로이드 기기의 /data/local/tmp 디렉토리에 Push 한다.

$ adb push tcpdump /data/local/tmp 



 

Tcpdump를 실행시키기 위해서는 해당 기기가 루팅 상태이어야 하며, 루트 권한이 없을 경우 다음과 같이 퍼미션 에러 메시지를 나타내며, 실행이 되지 않는다.

 


 

다음으로 Tcpdump에 실행 권한을 부여한다.

$ chmod 777 tcpdump

 


 

Tcpdump 실행하여 패킷 캡쳐

 


 

덤프가 완료되면, adb 명령어를 이용하여 해당 dump 파일을 pull한다. 단, 이때 루트 권한으로 덤프를 저장했기 때문에 dump.pcap의 소유주가 root로 되어 있으므로, 이를 다시 shell 권한으로 변경해 주어야 한다. 이를 변경하지 않을 경우, adb pull 명령어를 사용할 때 다음과 같이 소유주 문제로 덤프 파일을 받을 수 없게 된다.

 


 

다음과 같이 덤프 파일 소유주를 변경한다.

$ chown shell:shell dump_file_name

 


 

adb 명령어를 이용하여 덤프 파일을 pull한다.

$ adb pull /data/local/tmp/dump_file_name

 


 

Wireshark 도구를 이용하여 덤프 파일 분석

 

 

Windows 환경에서 OS가 문제가 발생했을 때의 대비를 위해 이미지 백업을 해두었다가 복원을 하는 Norton Ghost 도구가 있었다.

안드로이드도 이와 같이 커스텀 Recovery를 이용하여 손쉽게 백업 및 복원이 가능하다.


이번 포스팅은 TWRP Recovery를 이용한 안드로이드 백업 및 복원에 대한 설명을 한다.


TWRP Recovery를 적용하기 전, 해당 기기는 USB 디버깅 모드가 설정되어 있어야 하며, 설정 방법은 이전 포스팅에서 설명을 하였다.

USB 디버깅 모드 : 2017/05/02 - [Android] - 안드로이드 USB 디버깅 모드 설정


TWRP Recovery는 아래 사이트에서 다운로드 받을 수 있다.

https://twrp.me/Devices/

해당 하는 기기의 TWRP Recovery를 다운받으면, adb명령어를 이용하여 bootloader로 리부팅한다.

$ adb reboot bootloader



 

fastboot 명령어를 이용하여 TWRP Recovery 이미지를 플래싱한다.

$ fastboot flash recovery Recovery_Image_File

 

 


Recovery Mode를 선택하여 TWRP Recovery로 진입한다.

 

 

 

1. 이미지 백업

Backup 버튼을 선택하고, 백업할 파티션 요소를 선택한 후 Swipe로 백업을 진행한다.

 

 

 

 

 

 

2. 이미지 복원

Restore 버튼을 선택하고, 복원할 패키지를 선택한 후 복원을 진행한다.

 

 

 

 


 

복원 완료 후, 리부팅을 진행하면 다음과 같이 이전 백업해놓은 이미지로 복원된 것을 확인할 수 있다.

 

 

 


방법은 팩토리 이미지를 다운받아 초기화 하는 방법이 있는데, 이번 포스팅에서는 팩토리 이미지를 이용하여 안드로이드를 초기화 하는 방법을 설명한다.

 

팩토리 이미지를 적용하기 전, 해당 기기는 USB 디버깅 모드가 설정되어 있어야 하며, 설정 방법은 이전 포스팅에서 설명을 하였다.
USB 디버깅 모드 설정 : 2017/05/02 - [Android] - 안드로이드 USB 디버깅 모드 설정

 

아래 링크에서 해딩 기기와 원하는 안드로이드 버전의 팩토리 이미지를 다운 받을 수 있다.

Android Factory Imagehttps://developers.google.com/android/nexus/images

동의 버튼을 누르면 페이지가 펼쳐지고 해당 기기와 원하는 안드로이드 버전 선택이 가능하다.

 

 


해당 파일을 압축 풀면 다음과 같이 팩토리 이미지를 플래싱 할 수 있는 쉘 스크립트가 나온다.

 


 

adb 명령어로 기기가 정상적으로 연결되어 있는지 확인

$ adb devices

 



adb 명령어로 bootloader 모드로 리부팅 

$ adb reboot bootloader

 

 


flash-all을 실행하여 팩토리 이미지 적용

$ ./flash-all.sh

  (참고 : Windows 환경에서는 flash-all.bat를 실행)



 

다음과 같이 팩토리 이미지가 모두 업로드 완료되면 자동으로 리부팅되며, 새로운 버전의 안드로이드가 뜨는 것을 확인할 수 있다.

 

 

이번 포스팅은 안드로이드 OS 풀 소스를 안드로이드 에뮬레이터 환경에 맞춰 빌드하는 과정과 빌드 완료 후, 안드로이드 에뮬레이터에 생성된 이미지 파일을 플래싱하여 구동시키는 것을 설명한다.

출처 : http://source.android.com/source/building.html

 

 

1. 빌드 환경 설정

$ source build/envsetup.sh

 

 

 

2. 빌드 하드웨어 타겟 설정​

다음의 명령어를 입력하여 원하는 기기에 맞는 항목을 선택한다.

$ lunch

 

안드로이드 에뮬레이터에 빌드가 완료된 이미지를 올릴 것이므로 9. mini_emulator_arm64_userdebug를 선택하였다.

 

 

 

3. 빌드 시작 (참고 : VM환경 - CPU : Intel Core i5-4690K 3.50GHz, RAM : 4GB, 약 2시간 30분 소요)

​  - 빌드 시 "-j"뒤 숫자는 CPU 코어의 2배를 하면 된다.

$ make -j8

 


 


 

다음과 같이 약 2시간 30분만에 빌드에 성공하였다.

 

 

4. 빌드 결과물 확인

$ cd out/target/product/{CodeName}

  ex) cd out/target/product/mini-emulator-armv7-a-neon

 

 

 

5. 안드로이드 에뮬레이터 SDK 다운로드

$ cd /android_sdk_path/android-sdk-linux/tools/

$ ./android

  - Android SDK Build-tools 

  - Android Version (API Version) (Repo에서 받은 API 버전과 맞춰서 다운로드)


 

 

6. 설치된 에뮬레이터 이미지 파일을 컴파일 된 이미지로 교체

$ cp /root/work/out/target/product/mini-emulator-armv7-a-neon/ramdisk.img  /android_sdk_path/android-sdk-linux/system-images/android-22/default/armeabi-v7a/

$ cp /root/work/out/target/product/mini-emulator-armv7-a-neon/system.img  /android_sdk_path/android-sdk-linux/system-images/android-22/default/armeabi-v7a/

$ cp /root/work/out/target/product/mini-emulator-armv7-a-neon/userdata.img /android_sdk_path/android-sdk-linux/system-images/android-22/default/armeabi-v7a/


 

 

7. 안드로이드 에뮬레이터 생성 및 실행

  - ​(기존 생성된 에뮬레이터가 있다면, cache 문제가 될 수 있으므로 삭제 후 새로 생성)

 

 


다음과 같이 컴파일된 Mini-Emulator가 구동이 된다. Mini-Emulator로 빌드하였기 때문에 테스트 카메라 앱과 설정 앱만 존재하며, 기본 앱들이 탑재된 이미지를 빌드하고 싶다면 빌드 시, 1. aosp_arm_eng​를 선택하여 빌드 후 동일한 방법으로 이미지를 생성하여 올리면 된다.

 

 

이번 포스팅은 안드로이드 OS 풀 소스를 Nexus 4 실제 기기 기준에 맞춰 빌드하는 과정과 빌드 완료 후, Nexus 4 기기에 생성된 이미지 파일을 플래싱하여 구동시키는 것을 설명한다.

출처 : http://source.android.com/source/building.html

 

안드로이드 OS 풀 소스 빌드 시, 기기에 적용하기 위해서는 해당 기기의 드라이버 바이너리 파일을 적용하여야 하며, 드라이버 바이너리 파일을 적용하지 않고 빌드 후 기기에 적용할 경우, 다음과 같이 Android 로고 화면에서 넘어가지 않는다.

 

 


그 이유로는 해당 기기의 지원하는 드라이버가 설치되어 있지 않아 발생하는 문제인데, 이를 해결하기 위해서는 각각의 기기별 지원하는 드라이버 바이너리 파일들을 다운 받은 소스 코드에 적용 시키고 난 후 빌드를 해야한다.

 

 

1. 드라이버 바이너리 파일 다운로드 및 적용

각각 기기별 안드로이드 버전에 대한 드라이버는 아래에서 다운 받을 수 있다.
Android Device Driver https://developers.google.com/android/nexus/drivers

 

테스트 환경 기기는 Nexus 4이고, OS 버전은 Build:LMY48T / Branch:android-5.1.1_r19​ 이므로, 해당 환경과 동일한 드라이버를 다운로드 하였다.

 


 

해당 기기와 빌드할 안드로이드 버전을 선택하여 다운 받는다.

$ get Link_URL



 

각각의 드라이버 파일을 다운받아 압축을 풀면, 압출 파일당 하나의 쉘 스크립트가 나온다.

 

 


각각의 쉘 스크립트를 다운받은 소스 코드 경로에서 실행시켜, 드라이버 바이너리 파일들을 소스 코드에 적용한다.

 

 


해당 쉘 스크립트를 실행하면 다음과 같의 라이센스에 대한 내용이 나온다.

 


 

"more" 명령어를 이용하여 원문을 보여주기 때문에 Skip을 원한다면 Ctrl+C 키로 Skip 하고, "I ACCEPT"를 정확하게 입력하여 적용한다.

 


 

다운 받은 쉘 스크립트들을 실행하여 각각의 드라이버 파일들이 소스 코드에 적용되면, 기기에 적용할 이미지 파일 생성 빌드 환경 구성이 완료된다.

 

 

2. 빌드 환경 설정

$ source build/envsetup.sh

 

 

 

3. 빌드 하드웨어 타겟 설정​

  - 다음의 명령어를 입력하여 원하는 기기에 맞는 항목을 선택한다.

$ lunch


Nexus 4 기기에 빌드가 완료된 이미지를 올릴 것이므로 13. aosp_mako-userdebug를 선택하였다.

기기의 코드네임을 모를 경우 아래에서 해당 Nexus에 알맞은 코드네임을 찾아서 선택하면 된다.

Android Factory Imagehttps://developers.google.com/android/nexus/images

 

 

 

4. 빌드 시작 (참고 : VM환경 - CPU : Intel Core i5-4690K 3.50GHz, RAM : 4GB, 약 2시간 30분 소요)
​빌드 시 "-j"뒤 숫자는 CPU 코어의 2배를 하면 된다.

$ make -j4

 

 


 


5. 빌드 결과물 확인

$ cd out/target/product/{CodeName}

  ex) cd out/target/product/mako


  

 


6. 기기에 빌드된 이미지 적용

​생성된 이미지 경로를 export 한다.

$ export ANDROID_PRODUCT_OUT=/root/work/out/target/product/{코드네임}

  ex) export ANDROID_PRODUCT_OUT=/root/work/out/target/product/mako


adb 명령어로 기기가 정상적으로 연결되어 있는지 확인

$ adb devices

 

 

 

adb 명령어를 이용하여 부트로더로 리부팅한다.

$ adb reboot bootloader

 


 

Fastboot 명령어로 디바이스에 이미지를 플래싱 한다.

 $ fastboot flashall


 


다음과 같이 모델 번호와 빌드 번호가 AOSP on Mako로 빌드한 이미지가 올라간 것을 확인할 수 있다.

 


 

이번 포스팅에서는 원문에서 설명된 안드로이드 OS 컴파일을 위한 환경 구축과 소스코드 다운로드 방법을 설명한다.

안드로이드는 오픈 소스 라이센스로 구성되어 있기 때문에 구글에서는 이를 공개하여 git으로 다운로드 할 수 있도록 제공한다.

다운로드에 대한 원문 설명은 아래와 같다.

Android OS Soruce Code : http://source.android.com/source/index.html

 

원문에서는 GNU/Linux와 Mac OS (Intel/x86) 두 가지에 대한 환경 구축을 설명하지만, 이번 포스팅에서는 리눅스 환경에서 구축하는 것을 주로 하여 설명한다.

 

 

1. 환경 구축 요구사항

  - http://source.android.com/source/requirements.html

 

하드웨어 요구사항

  - 진저브레드(2.3.x) 이상의 OS 버전에서는 64-bit 환경 필요

  - checkout에 필요한 공간은 최소 100GB이며, 싱글 빌드시 150GB가 필요하고, 그 이상일 경우 최소 200GB를 필요

  - 가상 머신환경에서는 최소 16GB의 RAM/swap 크기 필요


소프트웨어 요구사항

  - Android 6.0 (Marshmallow) - AOSP master: Ubuntu 14.04 (Trusty)

  - Android 2.3.x (Gingerbread) - Android 5.x (Lollipop): Ubuntu 12.04 (Precise)

  - Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu 10.04 (Lucid)


Java Development Kit (JDK)

  - The master branch of Android in AOSP: Ubuntu - OpenJDK 8, Mac OS - jdk 8u45 or newer
  - Android 5.x (Lollipop) - Android 6.0 (Marshmallow): Ubuntu - OpenJDK 7, Mac OS - jdk-7u71-macosx-x64.dmg
  - Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat): Ubuntu - Java JDK 6, Mac OS - Java JDK 6
  - Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu - Java JDK 5

 

주요 패키지

  - Python 2.6 -- 2.7 from python.org
  - GNU Make 3.81 -- 3.82 from gnu.org; Android 3.2.x (Honeycomb) and earlier will need to revert from make 3.82 to avoid build errors
  - Git 1.7 or newer from git-scm.com

 

 

2. 환경 구축

필자의 경우 Ubuntu 14.04.4 LTS 에서 구동되는 것을 확인하였으며, Build:LMY48T / Branch:android-5.1.1_r19의 소스 코드를 다운받아 빌드되는 것을 확인하였다.


  - 필요 패키지 설치

    $ apt-get update

    $ apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip

 

 

3. Repo 설치

  - http://source.android.com/source/downloading.html

 

  - root 디렉토리 아래에 bin 디렉토리를 만들고 PATH 환경 변수 설정

$ mkdir ~/bin
$ PATH=~/bin:$PATH

  - Repo 도구를 다운로드하고 실행 퍼미션 설정

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

 

 


4. Repo 클라이언트 초기화

  - 소스 코드를 다운받아 작업할 디렉토리 생성

$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY


  - 해당 git에 이름과 이메일 주소 등록

$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"


  - 등록하지 않은 상태에서 Repo 클라이언트 초기화를 진행하면 다음과 같은 에러가 발생
 


 

  - 기본 마스터로 설정된 코드를 다운받고 싶다면 아래와 같이 입력

$ repo init -u https://android.googlesource.com/platform/manifest


  - 만약 원하는 특정 버전의 소스 코드를 받고 싶다면 -b 옵션으로 해당 브런치 네임을 사용하여 초기화

$ repo init -u https://android.googlesource.com/platform/manifest -b {BranchName}

  ex) repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.1_r19


  - 원하는 브런치를 확인하기 위해서는 아래의 주소를 참고하면 된다.

Android SourceCode : http://source.android.com/source/build-numbers.html#source-code-tags-and-builds

 

 


  - 다음과 같이 'y'를 누르면 Repo 클라이언트 초기화 작업은 완료된다.

 

 

5. 안드로이드 소스 코드 다운로드 (android-5.1.1_r19 기준 약 40GB, 1시간 반 소요)

$ repo sync



 

  - 소스 코드 다운로드 완료 후, 저장된 소스 코드 목록

 

 

안드로이드 OS는 리눅스 기반의 환경에서 Dalvik/ART으로 하여금 앱이 동작하며, 따라서 리눅스에 대한 Native Code를 지원한다.

간단히 설명하자면, 리눅스 기반의 C/C++ 코드를 지원하며 안드로이드 NDK (Native Development Kit)를 이용하여 컴파일이 가능하다.

아래는 안드로이드 NDK를 받기 위한 경로이다.

 

안드로이드 NDK (Native Development Kit) : http://developer.android.com/ndk/downloads/index.html

 

다운받은 NDK를 압축 풀어보면, 아래와 같은 파일목록이 있는데, 이 중 ndk-build.cmd​를 이용하여 컴파일한다. 편의를 위해서는 환경변수를 등록하여 사용하는 것이 좋다.

 

 

안드로이드 기기에서 실행하기 위한 간단한 소스를 입력한 후 저장을 하자.

 

 

ndk-build.cmd를 이용하기 위해서는 해당 소스 파일이 jni ​디렉토리에 있어야 한다. 또한 Makefile을 만들어주어야 하는데 자세한 정보는 아래페이지에 설명되어 있으니 참고해서 사용하면 된다. 이번 포스팅에서는 간단하게 NDK를 이용한 안드로이드 환경에서의 Hello World 프로그램 작성이므로, 간단한 컴파일 방법까지만 설명한다.

 

Android.mk : http://developer.android.com/ndk/guides/android_mk.html

 

 

다음과 같이 Android.mk로 Makefile을 만들고 ndk-build를 실행하면 HelloWorld.c 파일이 컴파일 된 것을 확인할 수 있다.

 

 

컴파일된 바이너리 파일은 libs 디렉토리에서 확인할 수 있다.

 

 

실행을 위해 adb를 이용하여 안드로이드 기기의 /data/local/tmp 디렉토리에 push 한다.

 

 

안드로이드 USB 디버깅 모드 설정이 되어있지 않다면, 이전 포스팅에서 정리한 글을 참고하여 USB 디버깅 모드를 설정한다.

안드로이드 USB 디버깅 모드 설정 : http://blog.naver.com/programmist/220653236705

adb push를 이용하여 /data/local/tmp 디렉토리의 HelloWorld를 바로 실행하게 되면, 아래와 같이 실행 권한이 없기 때문에 실행이 되지 않는다.

 

 

chmod를 이용하여 실행 권한을 준다.

 

 

실행 권한을 주고 난 뒤, 해당 파일을 실행시키면 다음과 같이 정상적으로 HelloWorld가 뜨는 것을 확인할 수 있다.

 

 

다음과 같은 방법으로 일반적인 POSIX를 따르는 소스 코드는 NDK를 이용하여 구현이 가능하며, Linux에서 사용하는 많은 명령어들이 크로스 컴파일를 이용하여 공개되어 있다. 따라서, NDK에서 지원하지 않는 라이브러리가 있더라도 해당 라이브러리 소스 코드만 있다면 NDK를 이용하여 다양한 응용이 가능할 것이다.

 

안드로이드는 USB 디버깅 모드가 활성화 되어 있으면, 설치된 앱의 apk 파일을 추출하는 것이 가능하다.

 

안드로이드 USB 디버깅 활성화 방법은 이전 포스팅에서 설명하였다.
USB 디버깅 모드 설정 : 2017/05/02 - [Android] - 안드로이드 USB 디버깅 모드 설정

 

앱을 추출하기 위해서, 이전 포스팅에서 예를 들었던 Notepad for Android 앱을 추출하는 것을 예시로 설명한다.
Notepad for Android : https://play.google.com/store/apps/details?id=com.blogspot.logpedia.note2

 

안드로이드 앱을 설치하게 되면 기본 경로는 /data/app ​디렉토리에 apk 원본파일을 다운받아 저장한다.
저장되는 파일명은 해당 apk의 AndroidManifest.xml에 등록된 Package명-1.apk로 저장하게 되며, 이를 이용하여 저장되는 디렉토리와 해당 apk파일명에 대해 유추가 가능하다.

 

 

먼저 apk를 추출하기 전, 먼저 자신의 안드로이드 버전을 확인해야 한다.
안드로이드가 4,x에서 5.x로 넘어가면서부터 설치된 apk가 저장되는 경로가 바뀌어졌으며, 해당 경로를 직접적으로 확인하기 위해서는 아래의 그림처럼 루팅(Rooting)을 해야 확인 가능하다.

 

 

4.x 이하 버전에서는 다음과 같이 루트 권한을 가진 상태에서 경로를 확인해보면 설치된 앱의 apk가 /data/app ​디렉토리에서 앱의 ​Package명-1.apk 형태로 저장이 되어 있는 것을 확인할 수 있다.

따라서, AndroidManifest.xml를 분석하여 Package명을 알 수 있으면 4.x 이하 버전에서는 이와 같은 경로로 설치된 앱에 대하여 저장 경로가 유추가 가능하고, 이를 바탕으로 adb 명령어를 사용하여 다음 아래 그림과 같이 루트 권한 없이도 해당 앱을 추출하는 것을 확인할 수 있다.

 

 

4.x 이하 버전과는 다르게 5.x 버전 이후에서는 아래 그림처럼 apk가 저장되는 경로가 /data/app/Package-1 ​디렉토리로 변경되고, 해당 디랙토리 내의 base.apk ​형태로 앱이 저장되도록 변경되었다.

 

 

앞서, 설명한 것과 마찬가지로 adb 명령어를 이용하면, 루트권한 없이도 앱 추출이 가능하다.

 

 

 

구글 레퍼런스 폰은 새로운 안드로이드 OS를 내놓을 때마다 제일 빠르게 적용되는 폰을 의미한다.

그만큼 레퍼런스 폰은 안드로이드 OS를 탑재하였을 때 최적화 된 상태를 의미하며, 구글은 이러한 테스트 과정을 거치고 난 뒤, 팩토리 이미지(Factory Image) 혹은 OTA로 레퍼런스 폰 사용자에게 가장 빠르게 업데이트를 제공한다.

반면, 각 제조사는 새로 발표한 안드로이드 OS의 오픈소스를 토대로 각 제조사 기기에 커스터마이징을 하여 출시하기 때문에 발표시기와 다르게 업데이트가 늦어질 수 밖에 없다.

(과정 자체는 제조사에서 해본 적이 없기 때문에 정확하지는 않다...)


따라서, 안드로이드 OS에 대한 가장 빠른 최신 업데이트는 레퍼런스 폰의 특권이자 당연한 수순이라고 봐야 할 것이다.

(제조사는 다시 자사의 기기에 맞게 커스터마이징을 해야하니까...)


이와 같은 구글 레퍼런스 폰은 넥서스(Nexus) 시리즈로 판매하고 있으며, 기기는 여러 업체들을 통하여 다양한 업체들에 의해 제조하여 판매하고 있다. (삼성, LG HTC, Motorola, Asus 등등)


이번 포스팅에서는 넥서스 중, LG에서 제조한 넥서스 4을 바탕으로 루팅하는 방법을 설명한다.

(넥서스 루팅 도구로 넥서스 4, 5, 7(2015), 5X 까지 해본 결과 동일한 방법으로 루팅이 가능한 것을 확인하였다.)


루팅을 하기 위해서는 Nexus Root Toolkit(NRT)이 필요하다

Nexus Root Toolkit : http://www.wugfresh.com/nrt

 

루팅을 시작하기 전, 해당 기기는 USB 디버깅 모드가 설정되어 있어야 하며 설정 방법은 이전 포스팅에서 설명을 하였다.
USB 디버깅 모드 설정 : 2017/05/02 - [Android] - 안드로이드 USB 디버깅 모드 설정

 

 

우선 Nexus Root Toolkit을 설치하여 실행하면 아래와 같은 GUI를 볼 수 있다.

 

 

루팅을 하기 전, 해당 기기의 모델과 현재 사용하고 있는 "Change..." 버튼을 눌러 해당 기기와 안드로이드 OS에 대한 설정을 한다.

 

 

 

만일 bootloader에서 폰이 LOCK STATE가 locked로 되어 있다면, Unlock 버튼을 눌러 Yes를 선택하여 LOCK STATE를 unlocked으로 변경한다.

 

 

 

  

 

Root 버튼을 누르면 아래와 같이 USB 디버깅 모드가 활성화 되어 있는지 확인하는 창이 뜬다. 확인을 누른다.

 

 

다음과 같이 어떠한 작업이 수행될 것인지 설명을 한다. 확인을 누르면 루팅 작업을 수행한다.

 

 

다음과 같이 adb를 이용하여 bootloader로 진입한 후, 루팅 작업을 자동으로 수행한다. 

 

 

다음과 같이 adb를 이용하여 bootloader로 진입한 후, 루팅 작업을 자동으로 수행한다. 

 

 

adb로 접근하여 'su' 명령어를 실행하여 정상적으로 루팅이 되었는지 확인한다.

 

 

+ Recent posts