天天看點

Frida入門介紹Frida介紹以及功能hook Java 函數hook Native 函數Frida啟動的兩種模式以及差別Frida Hook 原理

文章目錄

  • 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 原理

  1. frida Server運作在目标裝置上,他負責連結用戶端與服務端;
  2. frida在目标程序中會運作一個frida gadget,他的主要作用是将frida Service和目标的程序連接配接,并提供一些接口實作hook;
  3. 實際使用中,可以在Client編寫js代碼,通過frida Service發送到目标程序的frida gadget中;
  4. frida gadget将js代碼注入到目标程序的art虛拟機中,完成hook操作;
  5. 如果目标程序執行了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的日志資訊
  }
}
           

繼續閱讀