안드로이드 apk 디컴파일 후 소스 수정 및 리패키징
* 만약 디컴파일 후 자바소스만 보고 싶은 분들은 아래 포스팅을 참고해주시기 바랍니다.
2024.07.28 - [Android] - [Android] APK 디컴파일 소스보기
[Android] APK 디컴파일 소스보기
안드로이드 APK 디컴파일 소스보기1. 준비하기1) dex2jar 다운로드 (dex파일을 jar로 변환해주는 툴)다운로드 링크 : https://sourceforge.net/projects/dex2jar/2) JD-GUI 다운로드 (디컴파일하여 Java소스 코드로 변
devitamin.tistory.com
1. 준비하기
1) 환경 변수 설정
- C:\Program Files\Java\jdk1.8.0_202\bin
- C:\Users\사용자명\AppData\Local\Android\Sdk\platform-tools
- C:\Users\ 사용자명 \AppData\Local\Android\Sdk\build-tools\35.0.0
위 경로들을 환경변수에 추가를 합니다. (AndroidStudio를 설치해야 Android SDK tool 사용가능)
2) 프로그램 다운로드
- apktool.bat 다운로드 https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/windows/apktool.bat
- apktool.jar 다운로드
https://bitbucket.org/iBotPeaches/apktool/downloads/
apktool은 apk 파일을 디컴파일 및 리패키징할 수 있도록 도와주는 툴이며, apktool을 사용하여 apk를 디컴파일을 하게되면 smail 코드로 변환이 되는데 이 코드는 dex 파일을 어셈블리 언어형식으로 표현된 코드입니다.
2. 디컴파일 하기
1) Windows PowerShell을 관리자 권한으로 실행합니다.
2) apktool 이 설치된 디렉토리로 이동합니다.
- C:\apktool 디렉토리 밑에 apktool.bat, apktool_2.9.3.jar 파일을 이동
- 디컴파일 하려는 apk 파일도 C:\apktool 디렉토리로 이동
- Windows PowerShell 로 apktool이 다운로드된 디렉토리로 접근
PS C:\Windows\system32> cd C:\
PS C:\> cd .\apktool\
PS C:\apktool>
3) apktool 디컴파일 명령어 실행
- .\apktool.bat d .\앱파일명.apk -o 디렉토리명 명령어 입력
PS C:\apktool> .\apktool.bat d .\MyApp.apk -o MyApp
I: Using Apktool 2.9.3 on MyApp.apk
I: Loading resource table...
I: Decoding file-resources...
I: Loading resource table from file: C:\Users\UserName\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 classes4.dex...
I: Baksmaling classes2.dex...
I: Baksmaling classes3.dex...
I: Baksmaling classes5.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
I: Copying META-INF/services directory
Press any key to continue . . .
- 위와 같이 명령어를 실행하게 되면 디컴파일된 파일들이 MyApp 디렉토리 안에 저장됩니다.
3. smali 소스 수정
1) 수정하고자 하는 파일의 smali 코드를 찾아 들어갑니다.
- 예를들어 MainActivity 파일의 OnCreate 부분에 로그를 하나 남기려면 MainActivity.smali 파일을 찾아서 메모장으로 실행합니다.
- MainActivity의 OnCreate 소스이며, 저 부분에 로그를 추가하려면 아래와 같이 수정합니다.
.method protected onCreate(Landroid/os/Bundle;)V
.locals 6
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.line 22
invoke-super {p0, p1}, Landroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V
.line 23
move-object v0, p0
check-cast v0, Landroidx/activity/ComponentActivity;
.line 24
const-string v3, "repackaging"
const-string v4, "소스 수정"
invoke-static {v3, v4}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
const/4 v1, 0x3
const/4 v2, 0x0
invoke-static {v0, v2, v2, v1, v2}, Landroidx/activity/EdgeToEdge;->enable
.end method
- 수정된 부분은 맨 위쪽 locals 변수 개수 수정, line 24 부분 변수와 Log.d 호출하는 부분
4. 리패키징
1) apktool을 사용하여 리패키징
- apktool 리패키징 명령어 실행
PS C:\apktool> .\apktool.bat b MyApp -o new_MyApp.apk
- 위와 같이 실행을 하게되면 수정된 새로운 apk가 생성 됩니다.
- 하지만 앱을 설치하려고 하면 아래와 같이 앱 서명이 되지 않았다는 오류가 발생합니다.
PS C:\apktool> adb.exe install .\new_MyApp.apk
Performing Streamed Install
adb: failed to install .\new_MyApp.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl1543836981.tmp/base.apk: Attempt to get length of null array]
2) 앱 서명하기
- keystore 파일 생성하기 (비번 : abcd12!@ , key alias : myapp)
PS C:\apktool> keytool.exe -genkey -v -keystore myapp-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myapp
키 저장소 비밀번호 입력:
새 비밀번호 다시 입력:
이름과 성을 입력하십시오.
[Unknown]: NAME
조직 단위 이름을 입력하십시오.
[Unknown]: NAME
조직 이름을 입력하십시오.
[Unknown]: NAME
구/군/시 이름을 입력하십시오?
[Unknown]: SEOUL
시/도 이름을 입력하십시오.
[Unknown]: SEOUL
이 조직의 두 자리 국가 코드를 입력하십시오.
[Unknown]: KO
CN=NAME, OU=NAME, O=NAME, L=SEOUL, ST=SEOUL, C=KO이(가) 맞습니까?
[아니오]: Y
다음에 대해 유효 기간이 10,000일인 2,048비트 RSA 키 쌍 및 자체 서명된 인증서(SHA256withRSA)를 생성하는 중
: CN=NAME, OU=NAME, O=NAME, L=SEOUL, ST=SEOUL, C=KO
<myapp>에 대한 키 비밀번호를 입력하십시오.
(키 저장소 비밀번호와 동일한 경우 Enter 키를 누름):
[myapp-key.jks을(를) 저장하는 중]
- new_MyApp.apk 에 서명하기
PS C:\apktool> apksigner sign --ks myapp-key.jks --ks-key-alias myapp --ks-pass pass:abcd12!@ --key-pass pass:abcd12!@ --out signed_new_MyApp.apk new_MyApp.apk
- APK 파일 정렬 (앱 설치시 오류가 발생하면 해당 작업 실행)
PS C:\apktool> zipalign -v -p 4 signed_new_MyApp.apk aligned_new_MyApp.apk
Verifying alignment of aligned_new_MyApp.apk (4)...
50 META-INF/MANIFEST.MF (OK - compressed)
...
...
7840491 DebugProbesKt.bin (OK - compressed)
Verification succesful
5. 앱 설치 및 확인
1) 앱 설치하기 (스마트폰 연결 후 명령어 실행)
PS C:\apktool> adb.exe install .\signed_new_MyApp.apk
2) 안드로이드 스튜디오로 로그캣 확인
- 위와 같이 로그가 찍힌다면 디컴파일부터 리패키징까지 정상적으로 완료되었습니다.
'Android' 카테고리의 다른 글
[Android] 윈도우 11 갤럭시 탭 세컨드 스크린 연결 문제 해결 (0) | 2025.01.01 |
---|---|
[Android] APK 디컴파일 소스보기 (0) | 2024.07.28 |