본문 바로가기
보안 및 개발/MOBILE

[Android] apktool을 이용한 디컴파일 및 리패키징

by CH@3M 2020. 2. 10.

디컴파일

apktool은 apk파일로 압축되어 있는 것을 resources.arsc, classes.dex, XML 파일들을 디버깅(debug)파일 형태로 변환을 해주고 이를 수정한 뒤에 다시 수정된 apk파일로 생성(build)할 수 있는 도구이다.

기본적으로 java 최소 1.8? 이상의 버전이 설치되어 있어야한다. java -version 명령어를 통해 설치여부를 확인할 수 있다. 설치되어 있지않다면 https://java.com/ko/download/win10.jsp 지금 바로 설치!!

apktool 다운로드 링크 : https://ibotpeaches.github.io/Apktool/install/

윈도우 환경

  1. Windows용 wrapper script 을 다운로드 한다.
    (마우스 우클릭 메뉴 중 "다른 이름으로 링크된 파일 저장"을 선택 후 apktool.bat로 저장한다.) 
  2. apktool-2 을 다운로드 한다. (find newest here
  3. 2번에서 다운로드한 jar 파일의 이름을 apktool.jar로 변경한다. 
  4. 두 파일(apktool.jar & apktool.bat)을 자신의 Windows 폴더로 옮긴다.
    (보통 경로는 C://Windows 이다. 중간에 한글 폴더명이 없는 폴더)
  5. 만일 Windows 폴더가 접근이 안되면, 적당한 곳에 복사한 후, 환경 변수 설정에서 해당 경로를 추가한다.

디컴파일 시, apktool d [option] [decode할 파일명].apk (또는 java -jar apktool.jar d [option] [decode할 파일명].apk) 명령어를이용한다.

이렇게 디컴파일 과정을 거치면 다음과 같이 smali 코드를 얻을 수 있다.

그런데, 난독화가 되어있어서 에러가 발생하는 경우가 있다.

이런 경우는!!! 디컴파일 할 때, -r 옵션을 붙이고 진행한다. (리소스 디컴파일링 무시하고 진행하는 옵션) 그러면 해결!

 

리패키징

jadx나 jeb의 디컴파일된 코드와 smali 코드를 비교하여, smali 코드를 수정할 수 있다.

리패키징 명령어는 다음과 같다. apktool b [option] [build할 APK 폴더 경로] -o 생성할apk이름.apk (또는, java -jar apktool.jar b [option] [build할 APK 폴더 경로])

 

서명

정상적으로 애플리케이션을 사용하기 위해서는 서명을 해줘야한다. signapk.jar를 이용하여 리패키징 앱을 키를 만들어 서명하면 된다.

signapk : https://github.com/appium/sign

링크에서 signapk.jar, testkey.x509.pem, testkey.pk8 을 다운받아 사용할 수 있다. 3가지를 다운받아서 같은 경로에 두고 다음 명령어 수행

java -jar signapk.jar testkey.x509.pem testkey.pk8 리패키징.apk 서명된 리패키징 이름.apk

 

설치

adb install -r 서명한apk이름.apk

 

무결성 탐지를 우회하는 방법 중 하나로, 마켓에서 앱을 받으면 ID가 부여되는데 그게 있는지 없는지 확인하는 경우가 있다.

private final boolean a(Context arg2) {
        boolean v2_1;
        try {
            String v2 = arg2.getPackageManager().getInstallerPackageName(arg2.getPackageName());
            if(TextUtils.equals(((CharSequence)v2), "com.android.vending")) { // android playstore
                return true;
            }
            else if(!TextUtils.equals(((CharSequence)v2), "com.huawei.appmarket")) {
                goto label_11;
            }
            else {
                return true;
            }
        }
        catch(Throwable ) {
        label_11:
            v2_1 = false;
        }

        return v2_1;
    }

    public final void a(@d Activity arg2) {
        i0.f(arg2, "activity");
        if(!this.a(((Context)arg2))) {
            eu.eleader.android.finance.utils.v.a();
            arg2.finish();
        }
    }

변조한 패키지 설치할때 adb install -i "com.android.vending" 패키지명.apk 이렇게 설치하면 ID가 부여되어 우회 가능한 경우도 있다. 이 외에, 방법들에 대해서는 나중에 포스팅하도록 하겠당

반응형

'보안 및 개발 > MOBILE' 카테고리의 다른 글

[Android] frida 환경 구축  (0) 2020.02.11
[Android] MainActivity 찾기  (0) 2020.02.10
[Android] SuCTF 2014 Reverse200  (0) 2020.01.29
[Android] OWASP UnCrackable 3 미완료 ㅠ  (0) 2020.01.21
[Android] OWASP UnCrackable 2  (0) 2020.01.20