JHLBLUE
안드로이드 smali 패치하기1 본문
1. apktool 다운로드 및 환경설정
https://ibotpeaches.github.io/Apktool/install/ 의 설치방법을 따라한다.
해당 과정을 완료하면 터미널이나 cmd에서 apktool 명령을 사용할 수 있다.
windows에서는 keytool과 jarsigner를 사용하기 위해 환경변수를 추가해줘야 한다.
jre\bin은 keytool을 사용하기 위해, jdk\bin은 jarsigner를 사용하기 위해 각각 환경변수를 추가해준다.
2. apktool을 이용하여 디코딩, 코드 수정, 빌드, 사이닝
1) 디코딩 및 패치 실습 앱을 만들기 위해 코드를 작성하고, AndroidStudio의 메뉴 중 Build -> Generate Signed APK를 클릭하여 인증서로 서명이 된 앱을 생성해준다.
이 때 인증서가 없는 경우 Create new... 버튼을 눌러 인증서를 생성한 뒤 진행한다.
빌드가 완료되면 안드로이드 스튜디오 프로젝트 디렉터리 내의 app\release\app-release.apk 파일이 생성된다.
2) apktool d application_name.apk 명령을 입력하여 위에서 생성한 apk 파일을 디코딩한다. 해당 명령을 입력하여 디코딩이 완료되면 앱의 이름으로 된 폴더가 생성되며, 디코딩된 smali코드와 xml 파일 등이 저장된다.
3) 텍스트에디터를 이용하여 smali 코드를 열어준다. smali 코드는 application_name/smali/app_package_name/ 하위에 존재한다.
4) textview가 두 개 존재하는 것을 확인한 뒤, setText() 함수를 호출하는 코드를 찾아 두 번째의 textview에 텍스트를 입력하도록 smali 코드를 추가한다.
빨간색 박스 안의 line 15 및 line 17 코드는 첫 번째 textview에 setText 함수를 사용한 부분이며, 이 내용을 참고하여 위의 line 14의 코드를 수정한다.
5) smali 코드 수정이 완료되면 터미널에서 apktool b application_name -o modified.apk 명령을 입력하여 수정된 smali 코드로 빌드를 진행한다.(-o 옵션 뒤의 apk 파일 이름은 임의로 변경이 가능하다.)
6) 새로 만든 앱은 서명정보가 없기 때문에 임의로 인증서를 생성하여 서명작업을 해야 한다.
keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -keysize 2048 -validity 10000 명령을 입력하여 임의의 keystore를 생성한다.
7) 새로 생성한 keystore로 서명을 하기 위해 아래의 명령을 입력한다.
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore test.keystore modified.apk test
8) 서명이 완료된 apk 파일을 스마트폰에 설치한 뒤 패치 전과 패치 후를 비교한다.(왼쪽이 패치 전 / 오른쪽이 패치 후)
kotlin으로 제작된 apk 파일도 디코딩 및 smali 코드 패치 등이 가능하다.
kotlin 언어로 제작된 apk 파일 역시 apktool을 이용해 디코딩을 진행한 경우 smali 코드가 보이는 것을 확인할 수 있다.
코드를 수정한 뒤 빌드 및 서명 과정을 거친 apk를 설치할 경우 역시 정상적으로 동작하는 것을 확인할 수 있다.
패치에 사용된 예제 apk 파일
'Android' 카테고리의 다른 글
안드로이드 smali 패치하기4 (0) | 2019.02.08 |
---|---|
안드로이드 smali 패치하기3 (0) | 2019.01.28 |
안드로이드 smali 패치하기2 (0) | 2019.01.22 |
안드로이드 smali 패치 설명 (0) | 2019.01.15 |
Android ndk 라이브러리 추가해 사용하기 (0) | 2017.11.04 |