Frida及Brida学习记录
字数 1815 2025-08-22 12:22:36

Frida及Brida使用详解

一、Frida介绍与使用

1.1 Frida基础

Frida是一个动态代码插桩工具,允许开发者将JavaScript代码或库注入到Windows、macOS、Linux、iOS、Android和QNX的本机应用程序中。

Python Frida模块核心函数

  • frida.get_usb_device(): 获取USB连接的设备
  • device.attach(process_name): 附加到目标进程
  • session.create_script(js_code): 创建并注入JS脚本
  • script.on('message', callback): 设置消息回调
  • script.load(): 加载并执行脚本

1.2 Frida HOOK基础

基本HOOK脚本结构:

Java.perform(function () {
    var targetClass = Java.use("完整类名");
    targetClass.方法名.implementation = function (参数) {
        // 前置操作
        send("调用方法: " + 参数);
        var result = this.方法名(参数); // 调用原方法
        // 后置操作
        return result;
    };
});

1.3 Frida实战:加解密分析

以eseBrida.apk为例:

  1. 使用BurpSuit抓包发现请求和响应都是加密的
  2. 使用JEB反编译发现加解密类:com.ese.http.encrypt.AesEncryptionBase64
  3. 编写HOOK脚本:

加密HOOK脚本

Java.perform(function () {
    var AesEncryptionBase64 = Java.use("com.ese.http.encrypt.AesEncryptionBase64");
    AesEncryptionBase64.encrypt.implementation = function (key, data) {
        send("加密Key: " + key);
        send("加密数据: " + data);
        var result = this.encrypt(key, data);
        send("加密结果: " + result);
        return result;
    };
});

解密HOOK脚本

Java.perform(function () {
    var AesEncryptionBase64 = Java.use("com.ese.http.encrypt.AesEncryptionBase64");
    AesEncryptionBase64.decrypt.implementation = function (key, data) {
        send("解密Key: " + key);
        send("解密数据: " + data);
        var result = this.decrypt(key, data);
        send("解密结果: " + result);
        return result;
    };
});

Python交互脚本

import frida

def on_message(message, data):
    print(message)

device = frida.get_usb_device()
session = device.attach("com.android.chrome") # 目标进程名
with open("hook.js", "r") as f:
    script = session.create_script(f.read())
script.on('message', on_message)
script.load()

二、Brida插件详解

2.1 Brida基础

Brida是BurpSuit插件,连接Frida和BurpSuit,通过RPC方式调用HOOK函数。

核心依赖:

  • Pyro4: Python的RPC框架
  • Frida: 动态插桩工具

2.2 Brida配置

  1. 安装依赖

    pip install frida pyro4
    
  2. Brida界面主要部分

    • Console输出框
    • 控制按钮(启动/停止服务、启动/结束app、载入JS脚本)
    • 功能选项(Configurations和Execute Method)
  3. 关键配置

    • Python路径
    • RPC地址和端口
    • Frida HOOK脚本路径
    • App包名
    • 连接方式(USB或远程)

2.3 RPC HOOK脚本

Brida提供四个默认函数对应快捷键:

  • contextcustom1: 加密请求包
  • contextcustom2: 解密请求包
  • contextcustom3: 加密响应包
  • contextcustom4: 解密响应包

脚本模板

rpc.exports = {
    contextcustom1: function (data) {
        // 加密请求包逻辑
        return encryptedData;
    },
    contextcustom2: function (data) {
        // 解密请求包逻辑
        return decryptedData;
    },
    // 其他自定义函数...
};

数据转换函数(Brida内置):

// 字符串转16进制
function s2h(str) {
    var result = "";
    for (var i=0; i<str.length; i++) {
        result += str.charCodeAt(i).toString(16);
    }
    return result;
}

// 16进制转字符串
function h2s(hex) {
    var result = "";
    for (var i=0; i<hex.length; i+=2) {
        result += String.fromCharCode(parseInt(hex.substr(i,2),16));
    }
    return result;
}

// 字节流转16进制
function b2h(bytes) {
    var result = "";
    for (var i=0; i<bytes.length; i++) {
        result += bytes[i].toString(16);
    }
    return result;
}

2.4 Brida实战

  1. 配置Brida

    • 设置Python路径
    • 设置RPC地址(默认127.0.0.1:9999)
    • 设置HOOK脚本路径
    • 设置App包名
    • 选择连接方式
  2. 编写HOOK脚本

rpc.exports = {
    contextcustom1: function (data) {
        // 加密逻辑
        var AesEncryptionBase64 = Java.use("com.ese.http.encrypt.AesEncryptionBase64");
        var result = AesEncryptionBase64.encrypt("密钥", data);
        return result;
    },
    contextcustom2: function (data) {
        // 解密逻辑
        var AesEncryptionBase64 = Java.use("com.ese.http.encrypt.AesEncryptionBase64");
        var result = AesEncryptionBase64.decrypt("密钥", data);
        return result;
    }
};
  1. 使用流程
    • 点击"Start Server"启动服务
    • 点击"Spawn Application"启动目标App
    • 点击"Reload JS"加载HOOK脚本
    • 在BurpSuit中:
      • 选中请求数据,使用"Brida Custom2"解密
      • 修改后使用"Brida Custom1"加密
      • 响应包同理使用Custom3/Custom4

三、常见问题与解决方案

  1. 设备连接问题

    • 确保USB调试已开启
    • 尝试更换数据线
    • 检查adb devices是否列出设备
  2. Frida版本兼容性

    • 确保PC端frida-tools与设备端frida-server版本匹配
  3. Brida插件启动失败

    • 检查Python环境是否正确
    • 检查Pyro4和Frida模块是否安装
    • 检查端口是否被占用
  4. HOOK脚本不生效

    • 检查目标类名和方法名是否正确
    • 检查是否在Java.perform回调中执行
    • 检查目标进程是否已附加

四、高级技巧

  1. 批量HOOK
    使用enumerateMethods查找所有方法并批量HOOK

  2. 主动调用
    使用Java.choose查找对象实例并主动调用方法

  3. 修改返回值
    implementation中直接返回修改后的值

  4. 绕过SSL Pinning
    HOOK证书验证相关方法强制返回true

  5. 性能优化

    • 减少send调用频率
    • 使用批量消息发送
    • 避免阻塞主线程

五、参考资源

  1. Frida官方文档:https://frida.re/docs/home/
  2. Brida GitHub:https://github.com/federicodotta/Brida
  3. Pyro4文档:https://pyro4.readthedocs.io/
  4. JEB反编译工具:https://www.pnfsoftware.com/
Frida及Brida使用详解 一、Frida介绍与使用 1.1 Frida基础 Frida是一个动态代码插桩工具,允许开发者将JavaScript代码或库注入到Windows、macOS、Linux、iOS、Android和QNX的本机应用程序中。 Python Frida模块核心函数 frida.get_usb_device() : 获取USB连接的设备 device.attach(process_name) : 附加到目标进程 session.create_script(js_code) : 创建并注入JS脚本 script.on('message', callback) : 设置消息回调 script.load() : 加载并执行脚本 1.2 Frida HOOK基础 基本HOOK脚本结构: 1.3 Frida实战:加解密分析 以eseBrida.apk为例: 使用BurpSuit抓包发现请求和响应都是加密的 使用JEB反编译发现加解密类: com.ese.http.encrypt.AesEncryptionBase64 编写HOOK脚本: 加密HOOK脚本 : 解密HOOK脚本 : Python交互脚本 : 二、Brida插件详解 2.1 Brida基础 Brida是BurpSuit插件,连接Frida和BurpSuit,通过RPC方式调用HOOK函数。 核心依赖: Pyro4: Python的RPC框架 Frida: 动态插桩工具 2.2 Brida配置 安装依赖 : Brida界面主要部分 : Console输出框 控制按钮(启动/停止服务、启动/结束app、载入JS脚本) 功能选项(Configurations和Execute Method) 关键配置 : Python路径 RPC地址和端口 Frida HOOK脚本路径 App包名 连接方式(USB或远程) 2.3 RPC HOOK脚本 Brida提供四个默认函数对应快捷键: contextcustom1 : 加密请求包 contextcustom2 : 解密请求包 contextcustom3 : 加密响应包 contextcustom4 : 解密响应包 脚本模板 : 数据转换函数 (Brida内置): 2.4 Brida实战 配置Brida : 设置Python路径 设置RPC地址(默认127.0.0.1:9999) 设置HOOK脚本路径 设置App包名 选择连接方式 编写HOOK脚本 : 使用流程 : 点击"Start Server"启动服务 点击"Spawn Application"启动目标App 点击"Reload JS"加载HOOK脚本 在BurpSuit中: 选中请求数据,使用"Brida Custom2"解密 修改后使用"Brida Custom1"加密 响应包同理使用Custom3/Custom4 三、常见问题与解决方案 设备连接问题 : 确保USB调试已开启 尝试更换数据线 检查 adb devices 是否列出设备 Frida版本兼容性 : 确保PC端frida-tools与设备端frida-server版本匹配 Brida插件启动失败 : 检查Python环境是否正确 检查Pyro4和Frida模块是否安装 检查端口是否被占用 HOOK脚本不生效 : 检查目标类名和方法名是否正确 检查是否在 Java.perform 回调中执行 检查目标进程是否已附加 四、高级技巧 批量HOOK : 使用 enumerateMethods 查找所有方法并批量HOOK 主动调用 : 使用 Java.choose 查找对象实例并主动调用方法 修改返回值 : 在 implementation 中直接返回修改后的值 绕过SSL Pinning : HOOK证书验证相关方法强制返回true 性能优化 : 减少send调用频率 使用批量消息发送 避免阻塞主线程 五、参考资源 Frida官方文档:https://frida.re/docs/home/ Brida GitHub:https://github.com/federicodotta/Brida Pyro4文档:https://pyro4.readthedocs.io/ JEB反编译工具:https://www.pnfsoftware.com/