计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
re-frida-script-author【效率与协作】Frida 脚本生成方法论:目标特征 → 模板选择 → 改写 → 验证。独立于执行插桩(re-frida)。 触发词:生成Frida脚本、写hook脚本、frida脚本怎么写、写个hook、脚本生成。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
python -m pip install -U frida-tools,建议用 venv 或 pipx 隔离环境brew install frida 等非 upstream 渠道,安装前核验版本与维护状态,不与 pip 路径等同看待frida --version、frida-ps -U(连设备后)frida(运行时)与 frida-tools(CLI)版本需配套;跨大版本升级(16 → 17)有 API 移除,写法差异见 [[gotchas]] 版本组按「探 → 选 → 改 → 验」四步,先探后写,不猜。每步产物(特征清单/脚本/验证输出)记录路径 + sha256(见 [[re-triage]]),供报告引用。
目标侦察:
Java.enumerateLoadedClasses / Java.use(...).overloads),不猜名字模板选择:按特征清单对照 [[re-frida/frida-scripts]] 模板表:
| 目标特征 | 模板 |
|---|---|
| HTTPS 抓包被 TLS 加密(BoringSSL) | TLS 密钥日志(SSLKEYLOGFILE) |
| 证书固定挡抓包 | SSL 固定绕过(TrustManager/CertificatePinner) |
| 加密算法/密钥要提取 | 加密拦截(Cipher/SecretKeySpec 全 overload) |
| 加固/运行时解密 | DEX dump(类加载点)/ SO dump |
| 双向 TLS 客户端证书 | keystore p12 导出 |
| JNI 动态注册要还原 | RegisterNatives + 汇聚点双 hook |
| 反调试/检测拦截 | 检测绕过表(root/属性/文件/命令) |
改写:
overloads 枚举再逐个定义或按参数类型选(见坑 1)Java.perform;保存 original 引用、带原 this 调用;Interceptor.attach 里 onEnter 用 this.context 读寄存器,改返回值只能在 onLeave 用参数 retval.replace(...)——this 上只有 returnAddress/context/errno/lastError/threadId/depth,没有 this.returnValue;且 retval 跨调用复用,需留存时先 ptr(retval.toString()) 复制send() 传出;每个 hook 主体 try/catch,错误发消息不静默.implementation(缓存静默覆盖,见坑 2)Java.perform(function () {
var Cls = Java.use("com.target.Cls");
Cls.method.overload("java.lang.String").implementation = function (s) {
try { send({ type: "call", arg: s ? s.toString() : null }); }
catch (e) { send({ type: "error", msg: String(e) }); }
return this.method(s); // 调原实现(保留原 this)
};
});
Interceptor.attach(
Process.getModuleByName("libtarget.so").getExportByName("func"),
{ onEnter: function (args) { send({ type: "native", arg0: args[0].toInt32() }); } }
);
Process.getModuleByName(...).getExportByName;旧写法 Module.getExportByName 见 [[gotchas]] 版本组);非导出函数用调用点 hook 或内存特征定位验证:
frida -U -f <pkg> -l script.js --pause # spawn + 停在早期代码前
frida -U -f <pkg> -l script.js -o out.json # 输出存文件(大流量/批量时)
Java.use(...).<method>.overloads 列出全部重载再选.implementation 赋值静默覆盖;对策——合并进一个 hookJava.choose 或对类加载点下 hook([[re-analyze/anti-dynamic-workflow]])Module.getExportByName is not a function;原因——Frida 17 移除静态 Module 查找 API;对策——按 [[gotchas]] 版本组迁移写法