티스토리 뷰
Frida는 Android 이외에도 IOS, Windows 등등을 Hooking할 수 있는 강력한 툴이다.
그러나 해당 포스팅에서는 Android에 한해서 Hooking하는 방법에 대해서 다루겠다.
( 물론 아주 기초적인 내용이며 이를 응용하는건 본인의 몫... )
우선 들어가기 앞서 다양한 frida 코드들이 공유되는 사이트를 소개한다.
https://codeshare.frida.re/browse
frida 코드들에 대한 감을 익히는데 있어서도 매우 유용할 뿐만아니라,
이미 작성되어있는 코드들을 그대로 사용할 수 있다. 예를들면 아래와 같이 사용이 가능하다.
#> frida -U --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida
그럼 이제부터 내가 나름대로 느끼고 깨달은 사용법들을 최대한 간단하게 적어본다.
Frida를 이용해 Android Hooking을 진행하는 방법에는 크게 두가지 방법이 있다.
첫 번째로는 python 코드를 작성하는 방법이 있다. 첫 번째 방법으로 진행을 하게되면 Application을 실행한 후 파이썬 코드를 실행하는 순서로 진행되기 때문에 Application이 실행된 이후에 Hooking이 되는 것이다.
두 번째로는 js 스크립트를 작성해 "frida -U -l [ js스크립트 ] -f [ Android 내의 패키지명 ]" 와 같이 입력하는 방법이 있다. 두 번째 방법으로 진행할 경우 Application을 실행하기 전에 Hooking이 되는 것이다.
1. Python 코드를 작성해 Hooking 하는 방법.
1) 우선 내가 Hooking 하고자하는 함수를 찾아야한다.
보통은 jadx-gui를 통해 찾거나, 필요에 따라 IDA를 이용하거나 리버싱을 통해 찾아야 할수도있다.
2) Hooking을 진행할 Application이 안드로이드내에서 설치된 패키지명을 찾는다.
이건 매우 간단하다. 그냥 설치경로에 찾아가봐도되고 실행한 후에 frida-ps 를 통해서 확인할 수 있다.
3) 코드를 작성하고 Hooking을 진행하면된다. 아래 간단한 예시코드를 참고하자.
( 다음 포스팅에서는 여러가지 형태의 코드를 CheatSheet 형태로 작성할 예정이으므로 좀 더 자세한 내용은 거기서 설명한다. )
import frida, sys
def on_message(message, data): # jscode에서 send했을 경우 이 함수가 호출된다.
if message['type'] == 'send':
print("[*] {0}".format(message['payload']) # payload에 send로 넘겨준 데이터가 json형태로 저장되어있다.
else # 추가로 다시 jscode쪽으로 데이터를 넘겨주는 방법도 있는데,
print(message) # 이건 다음 포스팅에서 구체적으로 설명한다.
PACKAGE_NAME = "owasp.mstg.uncrackable1"
jscode = """ # 여기서부터는 JavaScript 코드이며, 궁극적으로 Hooking을 진행하는 코드부이다.
console.log("[*] Starting script");
Java.perform(function() {
var System = Java.use("java.lang.System");
# JS코드에서는 String도 java.lang.String으로 다 처리해줘야한다.
console.log("[*] System.exit Hooking Success");
System.exit.implementation = function() { # 여기서 exit함수를 아래 내가 정의한 함수로 덮어씌운다.
console.log("[*] System.exit called");
}
});
console.log("[*] Script finish");
"""
process = frida.get_usb_device().attach(PACKAGE_NAME)
script = process.create_script(jscode)
script.on('message', on_message)
script.load()
sys.stdin.read() # Hooking을 진행하고 종료되지 않도록하는 역할인 것 같다.
# 이 코드를 없애고 무한루프로 대체하는 코드도 다음 포스팅에서 확인할 수 있다.
4) 해당 패키지의 Application을 Android상에서 동작시킨 뒤 파이썬 코드를 실행하면 Hooking이 진행되며 이후에 호출하는 함수들은 Hooking의 영향을 받는다.
2. JavaScript 코드를 작성해 Hooking하는 방법.
1) Python 코드에서 jscode를 그대로 사용하면된다. 사실은 반대지만 뭐 ...
2) .js 파일에 아래와 같이 작성한다.
function Hook() {
// 여기에 jscode를 그대로 긁어온다.
}
setImmediate(function() {
Hook();
});
3) frida -l [ .js파일 경로 ] -U -f [ Application 패키지명 ]
위와같이 실행하면 후킹이 진행되고, %resume 명령어를 입력할 시 기기에 Application이 실행된다.
이 때 당연히 Hooking된 상태이다. 이렇게 하면 Application 실행 전에 후킹이 가능하다.
'Android > Hacking' 카테고리의 다른 글
[Android] adb 명령어 정리 (0) | 2020.10.08 |
---|---|
[Android] FRIDA 기본적인 문법정리. (0) | 2020.06.03 |
[Android] Android Studio 를 이용한 동적디버깅 (0) | 2019.11.06 |
[Android] adb를 통한 Log 확인하기. (0) | 2019.10.30 |
[Android] Frida 설치방법 (0) | 2019.10.30 |