一、引言
做爬蟲的朋友,經常會遇到逆向app的場景,大多數app通過反編譯,然後硬擼代碼,不過效率很低,因爲沒辦法像js一樣動態調試加斷點得出傳遞的參數與返回的結果。不過運用frida 實現hooke可以用一個新的函數替代原來的函數,在這個新的函數中你可以通過自定義實現調試拿取你想要的數據。
二、Frida簡介
- Frida是一個動態代碼檢測工具箱。
- 它使您可以將JavaScript片段或自己的庫片段注入Windows,macOS,GNU /Linux,iOS,Android和QNX上的本機應用程序中。
- Frida還提供了一些基於Frida API的工具。
三、Frida安裝
3.1 根據Frida官網記載,可以通過pyhton,pip下載,如下
3.2 使用pip命令下載
pip install frida-tools
3.3 也可以手動從Frida的GitHub版本頁面中獲取
3.4 安裝AndroidSDK(省略…後期補上)
3.5 配置模擬器(推薦可以用夜深模擬器)
3.5 配置Frida-server(省略…後期補上)
四、實現Hook
4.1 Frida官網有一個猜拳小遊戲的app例子:CTF 2015 APK
4.2 安裝apk到模擬器,如下所示
4.3 python代碼
import frida, sys
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
jscode = open("1.js","r",encoding="utf-8").read()
process = frida.get_remote_device().attach('com.example.seccon2015.rock_paper_scissors')
"""注入"""
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
"""是設置消息傳出時的回調"""
sys.stdin.read()
4.4 js代碼
/**
* Java.perform
* 確保當前線程已經連接VM
* **/
Java.perform(function () {
// Function to hook is defined here
var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity'); //Java.use 指向某個類的指針,參數中com.example.seccon2015.rock_paper_scissors.MainActivity就是我i們需要HOOK的哪個類
// Whenever button is clicked
//
/**
* Call the original onClick handler
* 思就是Hook前面獲取到的類中的onClick方法,後面跟着的賦值函數的部分,函數的參數爲對應要Hook方法的參數,
* 內部執行的部分就是在對應方法被調用時所執行的代碼,
* 這裏它是先打了一個onClick日誌,
* 然後調用了原始方法(如果不調用的話原始方法不會被執行),
* 接着它將m、n、cnt(變量具體含義請自行反編譯APP後查看代碼)的值做了修改,
* 最後,它又打了一個攜帶着cnt變量值的日誌。
* **/
var onClick = MainActivity.onClick;
onClick.implementation = function (v) {
// Show a message to know that the function got called
send('onClick');
onClick.call(this, v);
// Set our values after running the original onClick handler
this.m.value = 0;
this.n.value = 1;
this.cnt.value = 999;
// Log to the console that it's done, and we should have the flag!
console.log('Done:' + JSON.stringify(this.cnt));
};
console.log('Done:'+name)
});
4.5 hook結果