文章目錄
- Frida介紹以及功能
-
- 功能
- hook Java 函數
- hook Native 函數
- Frida啟動的兩種模式以及差別
- Frida Hook 原理
-
- frida-gadget.json内容
Frida介紹以及功能
- Frida 是一款功能強大的動态分析工具,主要用于對作業系統、桌面應用、移動應用和浏覽器進行逆向工程和安全測試;
- 提供了比較靈活的 js api,可以在運作時通過注入代碼來修改程式的邏輯;
- 因為本人研究的是Android方向,是以後面都會以Android例子為主;
功能
- 動态 Hook
- 可以在運作時通過 js代碼來 hook 應用程式的方法,以達到修改程式邏輯;
- 記憶體分析
- 可以對程式記憶體進行實時分析,包括查找關鍵資料結構等;
- 動态腳本注入
- 可以在運作時注入js腳本來擴充程式的功能,如添加調試資訊等;
hook Java 函數
hook Java函數例子
setImmediate(function () {
Java.perform(function () {
var MainActivity = Java.use('com.example.MainActivity');
// Hook Java 方法
MainActivity.foo.implementation = function (str) {
// 調用方法
var ret = this.foo(str);
console.log('Return value:', ret);
// 傳回
return ret;
};
})
})
hook Native 函數
setImmediate(function () {
Java.perform(function () {
const nativeFuncAddr = Module.findExportByName(null, 'nativeFunc');
// Frida Gadget
Interceptor.attach(nativeFuncAddr, {
onEnter: function(args) {
// 輸出函數的參數
console.log('nativeFunc(' + args[0] + ', ' + args[1] + ')');
// 修改參數
args[0] = ptr('0x1234');
args[1] = ptr('0x5678');
},
onLeave: function(retval) {
// 輸出函數的傳回值
console.log('returned: ' + retval);
}
});
})
})
Frida啟動的兩種模式以及差別
- frida啟動有兩種方式,分别為Spawn模式和 Attach 模式;
差別:
- 在 Spawn模式下,Frida 直接啟動目标程序,然後在該程序中注入 Frida 的 Agent,也就是說,啟動既注入;
- 在 Attach 模式下,Frida 會依附到已經運作的目标程序上,并在該程序中注入 Agent;
Spawn 模式啟動方式:
frida -U {package} -l xxx.js
Attach 模式啟動方式:
$ frida -U -l xxx.js -f {package}
Frida Hook 原理
- frida Server運作在目标裝置上,他負責連結用戶端與服務端;
- frida在目标程序中會運作一個frida gadget,他的主要作用是将frida Service和目标的程序連接配接,并提供一些接口實作hook;
- 實際使用中,可以在Client編寫js代碼,通過frida Service發送到目标程序的frida gadget中;
- frida gadget将js代碼注入到目标程序的art虛拟機中,完成hook操作;
- 如果目标程序執行了hook函數時,frida會攔截并執行js代碼中的邏輯;
其中,frida gadget會在目标程序中生成一個so檔案;
在生成frida gadget的同時,同樣也會在目标應用中生成一個json檔案,名字一般為:
frida-gadget.json
;
這個JSON檔案中包含了一些關于Gadget的中繼資料資訊,比如應用的包名、Gadget的版本号、Gadget啟動時需要加載的庫檔案、被Gadget hook的函數清單等等;
這些資訊可以被Frida用戶端讀取并解析,以便于正确地加載和運作Gadget。在一些情況下,我們也可以修改這個JSON檔案,以實作一些更進階的功能,例如修改Gadget版本号或者修改Gadget hook的函數清單。
frida-gadget.json内容
{
"entrypoint": "module_initialize", // gadget的入口函數名
"auxiliary": [ // 輔助子產品清單
"auxiliary_module1.js", // 第一個輔助子產品
"auxiliary_module2.js" // 第二個輔助子產品
],
"android": { // Android平台的配置
"package_name": "com.example.app", // 目标應用的包名
"use_frida_gadget": true, // 是否使用Frida Gadget模式
"spawn": true, // 是否在目标應用啟動時自動啟動gadget
"debug": true // 是否輸出gadget的日志資訊
},
"ios": { // iOS平台的配置
"use_frida_gadget": true, // 是否使用Frida Gadget模式
"spawn": true, // 是否在目标應用啟動時自動啟動gadget
"debug": true // 是否輸出gadget的日志資訊
},
"linux": { // Linux平台的配置
"use_frida_gadget": true, // 是否使用Frida Gadget模式
"debug": true // 是否輸出gadget的日志資訊
},
"macos": { // macOS平台的配置
"use_frida_gadget": true, // 是否使用Frida Gadget模式
"spawn": true, // 是否在目标應用啟動時自動啟動gadget
"debug": true // 是否輸出gadget的日志資訊
},
"windows": { // Windows平台的配置
"use_frida_gadget": true, // 是否使用Frida Gadget模式
"debug": true // 是否輸出gadget的日志資訊
}
}