1. Apk Decompile을 통한 Toast로직 추가
(1) 환경구성
우선 아래와 같은 환경설정이 선행되어야 한다.
JDK 설치
Android SDK 설치
Apk Studio 설치
JD-GUI 다운로드
Apk Manager(ApkTool) 다운로드
Dex2Jar 다운로드
(2) Decompile 및 Java파일 변환
① Apk Studio를 이용한 Decompile
Apk Studio실행 후 프로젝트 생성 및 Decompile 할 Apk파일을 지정한다. Apk Studio 는 ApkTool 을 기반으로 만들어진 편리한 ApkTool.jar GUI 프로그램이다. ApkTool 버전 업 시 파일만 Replace해주면 최신 버전의 사용이 가능하다.
[그림 1] Apk Studio 실행 후 Project 생성 및 Decompile
② Dex2Jar를 통한 Jar파일 변환
Dex2Jar 는 apk, dex파일 등을 .Jar 파일의 형태로 변환해주는 Tool이다. 아래와 같이 Dex2jar폴더에서 CMD를 실행 후 Apk, Classes.dex등을 .Jar 파일의 형태로 변환한다.
[그림 2] Dex2jar를 통한 .jar파일 변환
③ JD-GUI를 통한 Source 저장 및 분석
JD-GUI는 Byte코드를 Java파일 형태로 볼 수 있는 뷰어라고 할 수 있다. Class , jar 파일들 또한 Byte코드이다. 따라서 Smali코드 와 비교하며 본다면 빠르고 정확한 분석이 가능하다. 이전 단계에서 획득한 jar파일을 JD-GUI로 Open한다.
[그림 3] JD-GUI을 통한 .jar파일 열기
JD-GUI는 패키지 단위의 문자열 검색을 지원하지 않는다. 따라서 변환한 Java파일형태로 저장하여 AstroGrep등의 Tool을 통해 문자열 검색을 실시해야 한다.
[그림 4] Class파일을 Java파일 형태로 저장
(2) Smali Code 추가
① ApkStudio를 통한 Toast Smali Code 확인
아래는 Toast관련 Java 및 Smali코드의 일부이다.
HelloWorld.java :
Toast toast = Toast.makeText(getApplicationContext(), "Toast Test"); toast.show();
HelloWorld.Smali :
invoke-virtual {p0}, Lcom/test/helloworld/HelloWorldActivity;->getApplicationContext()Landroid/content/Context; move-result-object v1 const-string v2, "Toast Test" const/4 v3, 0x0 invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v1 invoke-virtual {v1}, Landroid/widget/Toast;->show()V
우선, Line 1 의 Activity명을 자신에 맞게 수정해야한다. 또한 컴파일 시 코드 충돌을 방지하기 위해 Smali코드 중 메서드 시작부분의 .locals 값을 기존에서 3증가시켜야 한다. Toast 로직에서 필요한 레지스터는 총 3개이기때문에 새로운 레지스터를 할당하여 사용해야 충돌을 방지할 수 있다. 메소드 내에 서 이전에 사용했던 번호 이후의 레지스터를 사용해야 한다.
Line 3 은 나타낼 문구지정한다. 한글문구를 원한다면 한글에 대해 반드시 Unicode 인코딩한 값을 삽입해야한다.
수정이 끝났으면 저장을 한다.
② ApkStudio를 통한 재컴파일
ApkStudio를 사용하여 수정한 Smali코드를 재컴파일 하는 작업이다. 좌측 상단의 망치모양을 클릭하면 해당 Project 경로의 Build폴더에 재컴파일 한 rebuilt.apk가 생성된다.
[그림 5] ApkStudio를 통한 재컴파일
③ ApkManager를 통한 Re-Signing
ApkManager 혹은 ApkTool 을 통해 rebuilt.apk 에 대한 Signing작업을 실시한다.
[그림 6] ApkManager를 통한 ReSigning
④ Adb Shell을 이용한 apk설치
adb shell 를 실행시켜 Signing된 apk를 재설치한다.
c:\> adb shell -r "apk파일경로"
3166 KB/s (6606031 bytes in 2.037)
WARNING : ...
...
pkg: /data/local/tmp/resign_rebuilt.apk
Success
'Android > Diagnostics' 카테고리의 다른 글
[FRIDA] Frida를 이용한 Native Hooking (0) | 2018.07.04 |
---|---|
[Android] Smali Example (0) | 2017.04.27 |
[Android-Diagnostics] ADB를 통한 현재 Activity 찾기 (0) | 2015.09.30 |
[Android-Diagnostics] Apktool (0) | 2015.06.11 |
[Android-Diagnostics] ADB(Android Debug Bridge) (0) | 2014.12.31 |