1. frida框架簡介
Frida是一款基於Python + JavaScript 的Hook框架,本質是一種動態插樁技術,可以用於Android、Windows、iOS等各大平台。由於是基於腳本的交互,因此相比xposed來說更加便捷。
frida與xposed對比:frida適用於全平台,xposed只能用於Android平台;frida可Hook java層和native層,而xposed只能Hook java層;frida通過編寫js代碼實現,xposed必須編寫插件(類似寫Android app);
動態插樁技術:在程序運行時實時地插入額外代碼和數據,對可執行文件沒有任何永久性的改變。
2. 環境配置
前提:電腦裝有python環境。
Windows端安裝frida:
pip install frida
查看frida版本:
frida --version
注:frida版本最好與frida-server版本一致。
手機端 / 模擬器安裝相同版本的frida-server:frida-server下載地址;
手機端下載 frida-server-版本-android-arm64.xz
模擬器下載 frida-server-版本-android-x86.xz
下載完成后解壓文件。
打開命令行,將frida-server推到手機 / 模擬器上:
adb push 文件路徑 /data/local/tmp
#eg: adb push C:\Program Files\frida-server-14.2.7-android-x86 /data/local/tmp
連接模擬器:
adb shell
#如果提示 error: more than one device/emulator,則執行 adb devices,然后執行 adb -s 設備名稱 shell
#eg:adb -s emulator-5554 shell
進入frida-server目錄下:
cd /data/local/tmp
#執行下ls命令,看看frida-server是否在該目錄下。
#文件名太長了,將文件名改為fs:
mv frida-server-14.2.7-android-x86 fs
添加執行權限:
chmod 777 fs
啟動frida-server:
./fs &
#新建一個命令行窗口執行下面命令
frida-ps -U
#如果顯示出進程列表說明啟動成功
端口轉發:
adb forward tcp:27042 tcp:27042
#如果提示 error: more than one device/emulator,則執行 adb -s emulator-5554 forward tcp:27042 tcp:27042
# emulator-5554為設備名稱

3. frida Hook java層
基本模板:
import frida
import sys
jscode = """
Java.perform(function () {
var utils = Java.use('com.droider.hooktest2.MainActivity');
utils.getSum.implementation = function () {
console.log("Hook Start...");
return true;
}
});
"""
def on_message(message, data):
if message['type'] == 'send':
print(message['payload'])
elif message['type'] == 'error':
print(message['stack'])
#如果設備為手機,則frida.get_usb_device()
process = frida.get_remote_device().attach('com.droider.hooktest2') #附加某個進程,大多情況為Android包名。
script = process.create_script(jscode)
script.on('message', on_message)
script.load()
sys.stdin.read()
用的時候修改下面這幾個以及JS代碼就行了,其它地方幾乎不用動。
-
com.droider.hooktest2.MainActivity為要Hook的函數所在的類; -
getSum為目標函數;若目標函數無參數,則為function(),若有兩個參數則為function(a,b); -
com.droider.hooktest2為要附加的進程名,也即Android app的包名;
getSum為目標函數;若目標函數無參數,則為function(),若有兩個參數則為function(a,b); -
com.droider.hooktest2為要附加的進程名,也即Android app的包名;
我的公眾號!

