본문 바로가기

Android

[Android] 프로그램 무결성 검증

0. apktool 설치

https://apktool.org/docs/install

스크립트 파일 > 우클릭 > 다른 이름으로 링크 저장 > apktool.bat 으로 저장

 

C 드라이브 하위에 위와 같이 세팅합니다.

참고로 리패지킹 할 때, 경로에 한글 혹은 공백이 있으면 에러가 발생하는 경우가 있습니다.

그래서 저는 C 드라이브 바로 아래 apktool 폴더를 만들어서 작업했습니다.

 

더보기

jar 를 실행하고 후에 keytool을 사용하기 위해서 jdk 설치가 되어 있어야 함


1. apk 앱 추출

 

[Android] 소스코드 난독화 적용 여부

0. jadx 설치https://github.com/skylot/jadx1. apk 추출 앱 사용1.1. apk 추출 앱 다운로드플레이스토어에서 apk 추출 관련 앱을 다운 받습니다. 1.2. 진단 대상 앱의 apk 추출apk 추출 앱을 이용해먼저 apk 파일이

velvetviolet1024.tistory.com

더보기

/data/app 경로의 apk 추출 

혹은

apk 추출 앱 사용

위 포스팅을 참고해서 

진단 대상의 apk 앱을 추출한 뒤, apktool 폴더에 옮겨줍니다.

 

 

2. apk 디컴파일

apktool d [apk 파일 위치]

# apktool d insecurebank.apk

apktool 폴더 확인 시, apk 파일이 디컴파일된 모습을 볼 수 있습니다.


3.1. 앱 이름 변경

path : [앱]\res\values\strings.xml

※ strings.xml : 앱의 문자열 리소스가 있는 곳!

앱의 이름이 포함되어 있는 strings.xml 파일을 오픈합니다.

 

app_name : 앱 이름이 담겨있는 변수

앱 이름을 지정하는 app_name 변수의 값을 변조 후 저장합니다.

 

3.2. 앱 소스코드 내용 수정

3.3. 루팅 우회


4. apk 리패키징

apktool b [리패키징할 파일] -o [새로 지정할 apk 파일 이름].apk

# apktool b insecurebank -o insecurebank_modify.apk
더보기

리패키징 시 메모리 부족 관련 에러가 발생하는 경우

apktool.bat 파일에서 -Xmx 옵션 수정

apktool 폴더 확인 시, 리패키징된 apk 파일을 볼 수 있습니다.

 

5. apk 서명을 위한 비대칭키 생성하기

더보기

※ apk 파일을 성공적으로 리패키징했지만 서명을 등록하지 않으면 단말기에 앱을 설치할 수 없습니다.

※ 비대칭키 생성 시 사용하는 keytool은 jdk를 설치해야 사용할 수 있음

※ 시스템 환경변수에 jdk path를 등록해야 사용 가능! ( C:\Program Files\Java\jdk-24\bin )

keytool -genkey -v -keystore [키 저장소 이름].keystore -alias [별칭] -keyalg [사용 알고리즘] -keysize [키 사이즈]

# keytool -genkey -v -keystore alioth.keystore -alias alioth -keyalg RSA -keysize 2048

apktool 폴더 확인 시, 비대칭키(공개키, 비밀키)가 담긴 키 저장소가 생성된 모습을 확인할 수 있습니다.

 

6. 서명하기

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore [키 저장소 이름].keystore [서명할 apk].apk [별칭]

# jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore alioth.keystore insecurebank_modify.apk alioth

 

더보기

위의 jarsigner 서명 방법은 구식이라서 최신 앱에서는 apksigner 서명을 이용해야 한다.

# 안드로이드 SDK( https://developer.android.com/ ) 설치

# 시스템 환경변수 path 등록 ( C:\Users\[사용자명]\AppData\Local\Android\Sdk\build-tools\36.0.0 )

# apk 파일 정렬 // -p 옵션
zipalign -v 4 [apk 파일] [내보낼 apk 파일 이름]

# 서명하기
apksigner sign --ks [키 저장소 이름].keystore --ks-key-alias [별칭] [apk 파일]

# 서명 확인하기
apksigner verify --verbose [apk 파일]

"""
Verifies
Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Verified using v3.1 scheme (APK Signature Scheme v3.1): false
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1
"""

# v1 : JAR 서명으로 구식 서명이 존재하지 않다는 의미
# v2, v3 : apksigner 서명 잘 되어 있다는 의미
# v3.1, 4 서명은 존재하지 않는다는 의미
# 1개의 서명자가 있다는 의미

# v2, v3 만 서명되면 됨

 

7. apk 설치

서명된 apk 파일을 adb를 이용해 단말기로 밀어 넣습니다.

 

더보기

※ 기존 원본 앱을 삭제하고 설치해야 함

Google Play Protect 해제 ( Play 스토어 > 프로필 > play 프로텍트 > 설정 > 앱 검사 해제 )

apk 설치 시, 앱 이름이 변경된 모습을 확인할 수 있습니다. ( 앱 위·변조 가능 )

 


더보기

                    

apk 파일이 여러 개인 앱은

adb를 이용해 모든 apk 파일을 추출한 뒤,

메인인 base.apk 만 디컴파일해서 내용을 수정하고,

나머지 apk는 재서명만 해주면 됩니다.

adb install-multiple base.apk [].apk [].apk

그리고 adb를 이용해 multiple 설치를 해주면 앱이 설치됩니다.