티스토리 뷰

728x90
반응형


PC 환경 : Windows 10 x64

1. apktool 을 다운로드 받습니다.

아래 URL에 들어가셔서 우선 wrapper script 부터 다운로드 받습니다.

https://ibotpeaches.github.io/Apktool/install/

 

Apktool - How to Install

Install Instructions Quick Check Is at least Java 1.8 installed? Does executing java -version on command line / command prompt return 1.8 or greater? If not, please install Java 8+ and make it the default. (Java 7 will also work at this time) Windows: Down

ibotpeaches.github.io

사이트에도 나와있다시피 wrapper script 라고 되어 있는 곳을 우측 클릭 후 다른 이름으로 링크 저장을 눌러서 저장해줍니다. 파일 이름은 apktool.bat 으로 저장하면 됩니다.

 

그런 다음 apktool.jar 파일을 다운로드 받아줘야 하는데요. 아래 링크에 들어가셔서 원하시는 버전에 맞는 apktool을 다운로드 하시면 됩니다. 저는 현재 시점 최신버전인 apktool_2.6.0.jar 을 다운로드 받았습니다.

https://bitbucket.org/iBotPeaches/apktool/downloads/

 

iBotPeaches / Apktool / Downloads — Bitbucket

For large uploads, we recommend using the API. Get instructions

bitbucket.org

그리고 다운받은 두 파일을 같은 경로에 놓습니다. sample.apk 파일은 제가 리패키징 할 대상 apk 파일입니다.

이제 apktool.bat 이 있는 현재 경로에서 cmd(명령프롬프트) 창을 열어서 apktool 이라고 입력하고 엔터를 눌러봅니다.

그럼 이런 식으로 사용방법이 나옵니다.

 

2. apktool로 APK 디컴파일하기

apktool d [디컴파일할 apk 파일이름]

위와 같은 형태로 명령어를 입력하면 아래와 같이 나오면서 apk 가 디렉토리 형태로 디컴파일됩니다.

>apktool d sample.apk
I: Using Apktool 2.6.0 on sample.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\Domdom\AppData\Local\apktool\framework\1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

그리고 디컴파일이 완료되면 현재 디렉토리에 아래와 같이 폴더가 생깁니다. 폴더이름은 apk 파일명과 동일합니다.

그리고 폴더 내부에는 아래와 같이 구성요소들이 보이게 됩니다. 그리고 apktool.yml 파일은 나중에 apktool로 다시 리패키징할 때 필요한 파일입니다.

이제 디컴파일 과정은 끝났기에 소스코드를 분석하고 필요한 부분을 수정해주면 됩니다.

 

3. 소스코드 분석 단계 (jadx-gui 도구 사용)

우선 jadx-gui 도구는 아래 링크에서 다운로드 가능합니다.

https://github.com/skylot/jadx/releases

 

Releases · skylot/jadx

Dex to Java decompiler. Contribute to skylot/jadx development by creating an account on GitHub.

github.com

다양한 Release 버전들이 있는데 저는 이번에도 현재 시점 기준 최신버전인 1.3.0 버전을 사용하겠습니다. 제가 다운 받은 파일 이름은 jadx-gui-1.3.0.1-no-jre-win.exe 입니다. 이 버전은 no jre 이기 때문에 jre 환경이 안맞으면 실행이 안될 수도 있습니다. 만약 실행되지 않는 다면 with jre 버전을 다운받으세요.

다운받은 jadx-gui 파일을 더블클릭해서 실행해보면 아래와 같이 나옵니다.

위 창에다가 이제 소스코드 분석할 apk 파일을 드래그 해서 놓아줍니다. File->Open Files 하셔도 됩니다.

그럼 로딩이 다 되면 아래와 같이 나옵니다. 이제 좌측에 패키지들을 열어보면서 소스코드 파일들을 분석하면 됩니다.

저는 아래 소스코드를 수정해볼 생각입니다.

if (str.equals("어쩌구저쩌구")) 라고 되어 있는데, 이 부분을 그냥 if (str.equals("")) 가 되도록 할 생각입니다.

아까 디컴파일 해놓은 폴더에 가서 smali 폴더를 열어봅니다. 그 부분에 소스코드들이 들어있습니다.

소스코드들의 확장자는 모두 .smali 로 되어 있습니다. 그리고 위 소스코드에서 하드코딩 되어 있던 문자열을 검색해서 찾아보면 아래 smali 코드를 발견할 수 있습니다.

이제 저부분을 그냥 지워서 "" 빈 문자열로 만들고 파일을 저장했습니다.

이제 소스코드 수정은 끝났습니다. 디컴파일 된 폴더를 다시 컴파일해서 apk 파일로 만들겁니다.

 

4. 디컴파일된 앱을 다시 APK로 컴파일하기

apktool b [디컴파일된 폴더] -o [최종APK파일이름]

위와 같은 형태로 명령어를 입력합니다. 저는 아래와 같이 입력했습니다.

>apktool b ./sample -o sample_re.apk
I: Using Apktool 2.6.0
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...

그럼 아래와 같이 sample_re.apk 파일이 생긴 것을 확인할 수 있습니다.

여기서 끝난 게 아닙니다. 이제 모바일 단말기에 설치해서 사용해보기 위해서는 APK Signing 작업도 해줘야 합니다.

 

5. APK Signing 해주기

APK Signing 하기 위해서 사용하는 keystore 가 없다면 미리 만들어주셔야 합니다. 먼저 keystore 서명을 만들기 위해서는 아래 명령어를 이용합니다.

keytool -genkey -v -keystore [keystore이름] -alias [alias이름] -keyalg [키알고리즘] -keysize [키사이즈]

제가 입력한 명령어와 그 결과는 아래와 같습니다.

>keytool -genkey -v -keystore domdom.keystore -alias domdom -keyalg RSA -keysize 2048
키 저장소 비밀번호 입력:
새 비밀번호 다시 입력:
이름과 성을 입력하십시오.
  [Unknown]:  domdom
조직 단위 이름을 입력하십시오.
  [Unknown]:  domdom
조직 이름을 입력하십시오.
  [Unknown]:  domdom
구/군/시 이름을 입력하십시오?
  [Unknown]:  Seoul
시/도 이름을 입력하십시오.
  [Unknown]:  Seoul
이 조직의 두 자리 국가 코드를 입력하십시오.
  [Unknown]:  KO
CN=domdom, OU=domdom, O=domdom, L=Seoul, ST=Seoul, C=KO이(가) 맞습니까?
  [아니오]:  y

다음에 대해 유효 기간이 90일인 2,048비트 RSA 키 쌍 및 자체 서명된 인증서(SHA256withRSA)를 생성하는 중
        : CN=domdom, OU=domdom, O=domdom, L=Seoul, ST=Seoul, C=KO
<domdom>에 대한 키 비밀번호를 입력하십시오.
        (키 저장소 비밀번호와 동일한 경우 Enter 키를 누름):
새 비밀번호 다시 입력:
[domdom.keystore을(를) 저장하는 중]

비밀번호 등록 -> 비밀번호 재확인 입력 -> 이름 -> 조직 단위 이름 -> 조직 이름 -> 구/군/시 이름 -> 시/도 이름 -> 조직의 두 자리 국가 코드 -> 마지막으로 등록완료면 y 순서로 입력하게 합니다.

그리고 등록절차가 끝나면 keystore가 저장되었다고 나오고 아래 폴더에 keystore가 생긴 것을 확인할 수 있습니다.

이제 keystore 서명도 만들었으니 만든 서명으로 APK 파일에 서명만 하면 되겠습니다.

 

6. APK 파일에 서명하기(self-sign)

jarsigner -verbose -sigalg [서명알고리즘] -digestalg [digest알고리즘] -keystore [keystore파일] [서명할APK] [alias명]

이번에는 jarsigner 라는 도구를 이용해서 APK 파일에 서명을 합니다. 저는 아래와 같이 명령어를 입력하였습니다.

>jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore domdom.keystore sample_re.apk domdom
...중략...
  signing: res/mipmap-hdpi/ic_launcher.png
  signing: res/mipmap-hdpi/ic_launcher_round.png
  signing: res/mipmap-mdpi/ic_launcher.png
  signing: res/mipmap-mdpi/ic_launcher_round.png
  signing: res/mipmap-xhdpi/ic_launcher.png
  signing: res/mipmap-xhdpi/ic_launcher_round.png
  signing: res/mipmap-xxhdpi/ic_launcher.png
  signing: res/mipmap-xxhdpi/ic_launcher_round.png
  signing: res/mipmap-xxxhdpi/ic_launcher.png
  signing: res/mipmap-xxxhdpi/ic_launcher_round.png
  signing: res/xml/standalone_badge.xml
  signing: res/xml/standalone_badge_gravity_bottom_end.xml
  signing: res/xml/standalone_badge_gravity_bottom_start.xml
  signing: res/xml/standalone_badge_gravity_top_start.xml
  signing: res/xml/standalone_badge_offset.xml
  signing: resources.arsc
jar signed.

처음엔 keystore 서명 파일에 대한 비밀번호를 입력하라고 나옵니다. 입력하고 나면 뭔가 쭉 나오면서 결국 마지막엔 jar signed. 라고 나옵니다. 그러면 서명이 정상적으로 완료된 것입니다.

 

7. 마무리...

이제 다시 jadx-gui 도구로 제가 변경한 코드가 제대로 변경되었는 지 확인해보겠습니다.

확인해보니 정상적으로 변경된 것 같습니다. 이제 모바일 단말기에 APK를 설치해보겠습니다.

저는 가상의 에뮬레이터에다가 adb 명령어를 이용해서 설치해보았습니다.

adb install [리패키징한APK파일]

제가 실행한 명령어는 아래와 같습니다.

>adb install sample_re.apk
Performing Streamed Install
Success

정상적으로 설치되었고 아이콘을 눌러 실행해보니 정상적으로 잘 실행됩니다.

혹시 adb install 할 때 아래와 같은 오류가 나신다면

adb: failed to install [com.example.app] : Failure [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2]

아래 링크를 참고해보세요.

https://domdom.tistory.com/entry/Android-adb-INSTALLFAILEDINVALIDAPK-Failed-to-extract-native-libraries-res-2-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95?category=1021511 

 

[Android] adb : [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2] 오류 해결 방법

혹시 저와 같이 APK 파일을 리패키징하기 위해서 APK Decompile -> 소스코드 변경 -> Compile -> Sign APK 한 다음 단말기에서 adb install 명령어로 앱을 설치할 때 아래와 같은 오류가 나면서 정상적으로 설치

domdom.tistory.com

 

 

- 끝 -

 

*추가

위 APK 리패키징 과정이 너무 복잡하고 직접 하기에는 어렵거나 귀찮다고 느끼실 때는 아래 도구 사용법을 참고해보세요.

https://domdom.tistory.com/entry/APK-Easy-Tool-APK-%EB%94%94%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EC%8B%B8%EC%9D%B4%EB%8B%9D-%EB%A6%AC%ED%8C%A8%ED%82%A4%EC%A7%95-%ED%95%A0-%EB%95%8C-%EC%9C%A0%EC%9A%A9%ED%95%9C-%EB%8F%84%EA%B5%AC?category=977716 

 

[APK Easy Tool] APK 디컴파일, 싸이닝, 리패키징 할 때 유용한 도구

중요 기능에 대해서는 사실 위 이미지가 다 설명하고 있기 때문에 다운로드 주소만 소개드리고, 아래 내용에서는 제가 사용하면서 겪은 느낌과 발생한 오류에 대한 처리 방법에 대해서 설명하

domdom.tistory.com

 

728x90
반응형
댓글