APKtool 사용 방법
1. 아래의 URL에서 APKtool 설치한다.
GitHub - iBotPeaches/Apktool: A tool for reverse engineering Android apk files
A tool for reverse engineering Android apk files. Contribute to iBotPeaches/Apktool development by creating an account on GitHub.
github.com
2. 아래의 명령어를 통해서 APK 파일을 smali 코드로 디컴파일한다.
java -jar <APK tool 경로> d <apk 파일> -o <smali 파일명>
※ 옵션) -o : 생성할 smali 파일명 지정
C:\>java -jar "D:\#. mobile\apktool_2.9.3.jar" d "C:\Users\TEST\01. TEST_antisplit.apk"
-o "C:\Users\TEST\02. TEST_smali"
I: Using Apktool 2.9.3 on 01. TEST_antisplit.apk
I: Loading resource table...
I: Decoding file-resources...
I: Loading resource table from file: C:\Users\rhcsu\AppData\Local\apktool\framework\1.apk
I: Decoding values */* XMLs...
I: Decoding AndroidManifest.xml with resources...
I: Regular manifest package...
I: Baksmaling classes.dex...
I: Baksmaling classes2.dex...
I: Baksmaling classes3.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
I: Copying META-INF/services directory
3. smali 파일을 apk 파일로 변환한다.
java -jar <APK tool 경로> b -c <smali 파일명> -o ./<apk 파일명>
※ 옵션) -c : 원본 AndroidManifest.xml 및 META-INF를 복사
-o : 생성할 APK 파일명 지정
C:\>java -jar "D:\#. mobile\apktool_2.6.0.jar" b -c "C:\Users\TEST\02. TEST_smali"
-o "C:\Users\TEST\03. TEST_rebuild.apk"
-c/--copy-original has been deprecated. Removal planned for v3.0.0 (#2129)
I: Using Apktool 2.6.0
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether sources has changed...
I: Smaling smali_classes2 folder into classes2.dex...
I: Checking whether sources has changed...
I: Smaling smali_classes3 folder into classes3.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs... (/lib)
I: Copying libs... (/kotlin)
I: Copying libs... (/META-INF/services)
I: Copy original files...
I: Copy AndroidManifest.xml...
I: Copy META-INF...
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...
APK 파일 서명 방법
1. 아래와 같이 zipalign 명령어를 사용한다.
■ zipalign은 Android Studio를 설치하면 같이 설치되는 파일이며, 파일 시작 부분을 기준으로 정렬하는 역할을 한다.
경로는 "C:\Users\[User 명]\AppData\Local\Android\Sdk\build-tools\35.0.0" 와 같다.
zipalign -f -p 4 <리패키징한 APK 파일명> <생성할 APK 명>
C:\Users\A>zipalign -f -p 4 "C:\Users\TEST\03. TEST_rebuild.apk" "C:\Users\TEST\04. TEST_Sign_Before.apk"
2. keytool을 이용하여 서명할 키를 생성한다.
■ keytool은 JDK를 설치하면 같이 설치되는 유틸리티이며, 인증서와 키를 관리할 수 있는 커맨드 방식의 유틸리티이다.
해당 명령어의 경로는 "C:\Program Files\Java\jdk-11\bin\keytool.exe" 와 같다.
"<jdk 경로>/keytool.exe" -genkeypair -v -keystore <keystore 이름> -alias <keystore 별명>
-keyalg <사용할 암호화 알고리즘> -keysize <키 길이> -validity <keysotre 유효일 수>
※ 옵션) -genkeypair : 키 쌍을 생성
C:\Users\A>"C:\Program Files\Java\jdk-11\bin\keytool.exe" -genkeypair -v -keystore test.keystore
-alias test -keyalg RSA -keysize 2048 -validity 10000
Enter keystore password: # 설정할 패스워드 입력
Re-enter new password: # 설정할 패스워드 재입력
What is your first and last name?
[Unknown]: test
What is the name of your organizational unit?
[Unknown]: test
What is the name of your organization?
[Unknown]: test
What is the name of your City or Locality?
[Unknown]: test
What is the name of your State or Province?
[Unknown]: test
What is the two-letter country code for this unit?
[Unknown]: test
Is CN=test, OU=test, O=tes, L=test, ST=test, C=test correct?
[no]: y # y로 선택
Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 10,000 days
for: CN=test, OU=test, O=tes, L=test, ST=test, C=test
[Storing test.keystore]
3. apksigner을 이용해서 apk 서명한다.
java -jar "<apksigner 경로>\apksigner.jar" sign --ks <keystore 명> -v2-signing-enabled true
--ks-key-alias <keystore 별명> --in <사인할 APK 명> --out <생성할 APK 명>
C:\Users\A>java -jar "C:\Users\TEST\AppData\Local\Android\Sdk\build-tools\35.0.0\lib\apksigner.jar"
sign --ks test.keystore -v2-signing-enabled true --ks-key-alias test
--in "C:\Users\TEST\04. TEST_Sign_Before.apk" --out "C:\Users\TEST\05. TEST_Sign.apk
Keystore password for signer #1: # test.keystore 패스워드 입력
번외1) apktool 빌드 시 resoucres 파일 관련 오류
다음과 같이 resocure 오류가 발생했다면, apktool 버전을 디컴파일할 때보다 빌드할 때 더 낮은 버전을 사용하면 된다.
필자의 경우, 디컴파일 시 2.9.3 버전, 빌드 시 2.6.0 버전을 사용하여 해결했다.
더불어, 경로에 한글이나 띄어쓰기가 있을 경우 오류가 날 수 있다.
C:\>java -jar "D:\01. Static Analysis\apktool_2.9.3.jar" b -c "C:\Users\TEST\02. TEST_smali"
-o "C:\Users\TEST\03. TEST_rebuild.apk"
I: Using Apktool 2.9.3
I: Checking whether sources has changed...
I: Checking whether sources has changed...
I: Checking whether sources has changed...
I: Checking whether resources has changed...
I: Building resources...
W: C:\Users\rhcsu\OneDrive\諛뷀깢 ?솕硫?\TEST\02. TEST_smali\res: error: failed to open directory:
吏??젙?맂 ?뙆?씪?쓣 李얠 쓣 ?닔 ?뾾?뒿?땲?떎. (2).
brut.androlib.exceptions.AndrolibException: brut.common.BrutException: could not exec (exit code = 1):
[C:\TEST\AppData\Local\Temp\brut_util_Jar_139940494299027501505717062267554890304.tmp, compile,
--dir, C:\TEST\02. TEST_smali\res, --legacy, -o, C:\TEST\02. TEST_smali\build\resources.zip]
번외2) apktool을 이용하여 정성적으로 빌드를 성공했으나, 앱 구동 시 튕김 현상 관련 오류
빌드 시 아무 오류 구문이 없었으나 apk 파일을 android 기기에 설치할 경우, 튕기는 현상이 발생할 수 있다.
이 경우에는 AndroidManifest.xml 및 META-INF 파일 관련하여 종속성 문제가 발생한 것으로, 'apktool 사용방법' 3번과 같이 -c 옵션을 사용하여 원본 AndroidManifest.xml 및 META-INF 파일을 복사하면 된다.
'Mobile > 🩷 Android' 카테고리의 다른 글
17. Split APK 추출하기 (0) | 2024.11.22 |
---|---|
16. FridaLab 실습_Challenge 05 문제 풀이 (0) | 2024.05.13 |
15. FridaLab 실습_Challenge 04 문제 풀이 (0) | 2024.05.13 |
14. FridaLab 실습_Challenge 03 문제 풀이 (0) | 2024.05.13 |
13. FridaLab 실습_Challege 02 문제 풀이 (0) | 2024.05.12 |