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 카테고리의 포스트를 톺아봅니다