안녕하세요 머쉬입니다.
Frida는 DBI(Dynamic Binary Instrumentation) 도구이며, 바이너리를 동적으로 실행하면서 분석하는 행위를 말합니다.
따라서 모바일 진단 시 많이 활용되므로 Frida 후킹 방법을 학습해보겠습니다.
실습에 사용하는 APK 파일은 OWASP에서 만든 Uncrackable 입니다.
도구 다운로드
Frida 후킹을 위해서 필요한 도구는 다음과 같습니다.
※ 제가 설치한 버전은 Python 3.8.10, frida-16.0.19, frida-tools-12.1.2 이니 참고 바랍니다.
1. Python
https://www.python.org/downloads/release/python-3810/
Python Release Python 3.8.10
The official home of the Python Programming Language
www.python.org
2. frida-server
https://github.com/frida/frida/releases
Releases · frida/frida
Clone this repo to build Frida. Contribute to frida/frida development by creating an account on GitHub.
github.com
3. Uncrackable 앱 (후킹 실습용 모바일 앱)
https://github.com/OWASP/owasp-mastg/tree/master/Crackmes/Android
기기 정보
휴대전화 정보
모델명 : Galaxy A12
모델번호 : SM-A125N
소프트웨어 정보
One UI Core 버전 : 4.1
안드로이드 버전 : 12
Frida 설치 방법
PC에 파이썬을 설치 후 frida, frida-tools를 설치합니다.
- frida, frida-tools을 특정 버전으로 지정하지 않을 경우 버전을 제거 후 설치하시면 됩니다.
pip install frida==16.0.19
pip install frida-tools==12.1.2
frida --version
# frida 제거 시
pip uninstall frida
pip uninstall frida-tools
프리다 서버를 설치하기 위해 기기의 CPU 아키텍처를 확인합니다.
# 단말
adb shell getprop ro.product.cpu.abi
# NOX
nox_adb shell getprop ro.product.cpu.abi
프리다 버전과 아키텍처에 해당하는 프리다 서버를 다운로드합니다.
- 프리다 버전 : 16.0.19
- 아키텍처 : arm64
PC와 기기를 연결한 후 기기에 다운로드한 프리다 서버를 설치 및 실행합니다.
- adb shell을 통해 /data/local/tmp 경로로 이동 후 frida 서버 권한 변경 및 실행
adb push frida-server-16.0.19-android-arm64 /data/local/tmp
chmod 777 frida-server-16.0.19-android-arm64
./frida-server-16.0.19-android-arm64 &
프리다 서버 설치 및 실행이 되었으니 frida 명령을 통해 정상적으로 구동되는지 확인합니다.
-U, --usb : connect to USB device
-a, --applications : list only applications
-i, --installed : include all installed applications
frida-ps -Uai
Frida를 이용한 앱 후킹 실습
먼저 아래 앱은 접근 시 루팅 여부를 탐지해 경고창을 띄우고 OK 버튼을 클릭 시 앱을 종료 시킵니다.
※ 해당 실습에서는 구글링한 frida 코드를 이용하며, 소스코드 분석은 진행하지 않는점 참고바랍니다.
구글링을 통해 발견한 frida 코드를 이용합니다.
아래 소스코드를 notepad++로 python 확장자로 저장합니다.
※ 해당 frida 코드는 루팅 탐지가 되어도 앱을 종료시키지않고, 임의의 string 문자열을 입력 시 secrectKey가 콘솔에 노출되도록 작성된 후킹코드입니다.
import frida, sys
Hook_package = "owasp.mstg.uncrackable1"
# Hooking 하는 대상 패키지 이름 기재
# 패키지 이름 : adb shell > pm list packages
def on_message(message, data):
print("{} -> {}".format(message, data))
# 후킹 코드 작성
jscode = """
console.log("[*] Start Hooking");
Java.perform(function() {
var bypassExit = Java.use("java.lang.System"); // system Class Hook
bypassExit.exit.implementation = function (){ // exit() overwrite
console.log("[*] System.exit() is called"); // "Root Detect" 우회
}
var aClass = Java.use("sg.vantagepoint.a.a"); // a Class Hook
aClass.a.implementation = function (a, b){ // a() overwrite
console.log("[*] aClass.a function is called");
var findCode = this.a(a, b); // return secretkey
var secret = "";
for (var i=0; i<findCode.length; i++){
secret = secret + String.fromCharCode(findCode[i]);
}
console.log("[*] SecretKey = " + secret); // secretkey output
return findCode;
}
});
"""
try:
device = frida.get_usb_device(timeout=10)
pid = device.spawn([Hook_package])
print("App is starting.. pid:{}".format(pid))
process = device.attach(pid)
device.resume(pid)
script = process.create_script(jscode)
script.on('message', on_message)
print("[-] Running FR1DA!")
script.load()
sys.stdin.read()
except Exception as e:
print(e)
PC에서 frida 코드를 실행합니다.
python fridahook.py
frida 코드 실행 시 연결된 기기에서 앱이 실행되고, OK 버튼 클릭 시 secret String을 입력 하는 창이 출력되며 임의의 문자열(test) 입력 시 콘솔창에 Secret Key가 출력됩니다.
오류 해결
1. this feature requires an iOS Developer Disk Image to be mounted; run Xcode briefly or use ideviceimagemounter to mount one manually
- PC 설치한 프리다 버전과 단말에 설치한 프리다 서버 버전 체크
- AOS 단말 기기에 프리다를 설치 했는데, 위 에러가 뜨는 경우 아이폰으로 테더링을 쓰고있지 않은지 확인
(아이폰 테더링 연결을 끊고 wife로 연결하면 됨)
후킹 시 python 코드와 js 스크립트 차이
Frida를 이용해 후킹을 하는 방법에는 python 코드 작성과 JS 스크립트 작성 두가지로 구분됩니다.
1. python 코드
순서 : 앱을 실행한 후 파이썬 코드를 실행
실행 : python [ 파일명 ].py
결론 : 앱이 실행된 이후 후킹
2. js 스크립트
순서 : (앱이 실행되지 않은 상태) js 스크립트 실행 시 앱 실행
실행 : frida -U -l [ js스크립트 ] -f [ Android 내의 패키지명 ]
결론 : 앱이 실행되기 전에 후킹
Reference
https://velog.io/@woounnan/ANDROID-Frida%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-apk-%ED%9B%84%ED%82%B9
https://redteam-securitylab.tistory.com/14
https://redteam-securitylab.tistory.com/16
https://hagsig.tistory.com/153
'MOBILE > Android' 카테고리의 다른 글
[AOS] Burp Suite 인증서 설치 방법(Galaxy S10 5G, Android version 7 이상) (0) | 2024.06.11 |
---|---|
[AOS] APK 파일 리패키징 방법 (0) | 2024.01.11 |
[AOS] Burp Suite 인증서 설치 방법(NOX, Android version 7 이상) (0) | 2024.01.08 |
[AOS] Android 폰 루팅 방법 (Galaxy A12, S10 5G) (1) | 2024.01.03 |
[AOS] Android 순정 펌웨어 다운로드 및 설치 방법(Galaxy A12, S10) (0) | 2024.01.02 |