SuperAPI AI 工具集

rev-frida

安全与审计

查看项目

更新于 10-16 07:47

技能介绍

用途

rev-frida 用于生成 Frida 插桩脚本,服务于动态分析、Hook 与运行时检查。适用目标包括:原生导出函数 Hook、Java 或 ObjC 方法 Hook、运行时调用追踪、参数或返回值捕获、内存转储,以及加载器感知的原生插桩。

主要能力

技能覆盖现代 Frida API 的常见用法:

  • 模块与符号查找:Process.getModuleByName()、mod.getExportByName()、Process.enumerateModules()、mod.enumerateExports()、mod.enumerateImports()、Module.getExportByName()。
  • Interceptor:Interceptor.attach() 的 onEnter/onLeave 回调,以及 Interceptor.replace() 配合 NativeCallback。
  • NativeFunction 与 NativeCallback:调用原生函数、创建回调。
  • 内存操作:readByteArray、readUtf8String、readU32、readPointer、writeByteArray、writeUtf8String、writeU32、Memory.alloc、Memory.allocUtf8String、Memory.scan。
  • ObjC:在 ObjC.available 时通过 ObjC.classes 获取方法实现并 Hook。
  • Java:在 Java.available 时通过 Java.perform 与 Java.use 替换方法实现。

使用方式

现代 Frida CLI 不使用 --no-pause,spawn 的进程会在脚本加载后恢复。示例命令:

# Spawn and hook
frida -U -f com.example.app -l hook.js

# Attach to running process
frida -U com.example.app -l hook.js

# Attach by PID
frida -U -p 1234 -l hook.js

生成脚本时的准则:始终使用现代 API;不使用 --no-pause;优先使用加载事件驱动的原生 Hook 而非轮询;以可读形式打印指针与缓冲区;对风险 Hook 使用 try/catch 包裹;使用 hexdump() 检查二进制数据。

模块加载时序处理

不要假设目标 .so 已加载。推荐顺序为:先 Hook android_dlopen_ext 或 dlopen,在目标库加载时安装 Hook;对已加载模块使用 Process.findModuleByName() 立即检查;轮询仅作为兜底。技能提供了 hookModuleLoad、hookNowOrOnLoad、hookWhenReady 等辅助函数示例。注意事项包括:Android 上优先 android_dlopen_ext 而非 dlopen;按模块基址去重而非仅按路径;dlopen/android_dlopen_ext 的 onLeave 通常是构造函数运行后安装 Hook 的合适时机;若 Java 驱动原生加载,还可考虑 System.loadLibrary、Runtime.loadLibrary0、dlsym 或 RegisterNatives。

关于 init 系列函数

不要盲目建议 Hook .init、.init_array、构造函数或 JNI_OnLoad。这些位置脆弱:许多库在此做一次性初始化;错误 Hook 可能在真正目标逻辑运行前使进程崩溃;过早 Hook 会改变时序并掩盖待研究行为;构造函数代码常扩散到大量无关辅助函数。建议顺序为:模块加载后 Hook 稳定的导出函数;Hook RegisterNatives、dlsym 或首个真实业务函数;仅当原生注册或反调试设置发生在 JNI_OnLoad 时才 Hook 它;仅在有强证据表明关键逻辑位于构造函数或 .init_array 时才 Hook 它们。若提出早期 init Hook,需说明为何常规导出 Hook 不足、应 Hook 的确切函数或地址、预期失败模式以及如何验证 Hook 未破坏初始化。

构造函数分发器

若怀疑构造函数链中存在反调试逻辑,优先观察或 Hook 分发器,而非盲目附加到原始 .init_array 条目。可用的更高层目标包括 call_constructors、call_array、链接器侧构造函数遍历器、应用侧遍历构造函数表的包装函数。推荐工作流:Hook 模块加载;判断进程是否在构造函数执行期间终止;若是,在可用时 Hook call_constructors 或 call_array;记录每个被分发的构造函数目标;定位执行反调试检查的确切构造函数;再对该构造函数打补丁或 Hook,或修补其中的特定反调试分支。仅当目标平台或链接器构建暴露这些函数、且符号、跟踪或反汇编表明它们确实被使用时,才建议使用 call_constructors 或 call_array。需注意这些是加载器或链接器内部实现,名称可能因 Android 版本、厂商构建或平台而异,可能未导出而需要符号恢复或基于偏移的附加;过早 Hook 会影响每次库加载,因此日志范围需谨慎;应将其用于发现,而非默认的永久绕过。

指针与缓冲区日志

示例:

console.log(args[0]);
console.log(args[0].toString());
console.log(hexdump(args[0], {
    offset: 0,
    length: 64,
    header: true,
    ansi: false
}));

适用场景与限制

适用于需要编写 Frida 脚本进行运行时 Hook、追踪、参数捕获与内存检查的安全分析与逆向场景。限制方面:资料未提供具体支持的平台版本范围、性能开销数据、收费或价格信息,也未提供官方文档或支持渠道,这些内容暂未提供。