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为例:
- 使用BurpSuit抓包发现请求和响应都是加密的
- 使用JEB反编译发现加解密类:
com.ese.http.encrypt.AesEncryptionBase64 - 编写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配置
-
安装依赖:
pip install frida pyro4 -
Brida界面主要部分:
- Console输出框
- 控制按钮(启动/停止服务、启动/结束app、载入JS脚本)
- 功能选项(Configurations和Execute Method)
-
关键配置:
- 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实战
-
配置Brida:
- 设置Python路径
- 设置RPC地址(默认127.0.0.1:9999)
- 设置HOOK脚本路径
- 设置App包名
- 选择连接方式
-
编写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;
}
};
- 使用流程:
- 点击"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/