SuperAPI AI 工具集

renef

安全与审计

查看项目

更新于 10-16 06:10

技能介绍

renef 是一个面向 Android ARM64 的动态插桩引擎,用于在运行时对应用进行 Hook、内存操作与行为分析。本技能用于指导如何正确编写和运行 renef 的 Lua 脚本与 CLI 命令。

用途

renef 用于对 Android ARM64 应用进行动态插桩,典型用途包括:Hook 原生函数与 Java 方法、扫描/读取/写入/修补进程内存、解析模块符号与导出、调用 Java 运行时方法、追踪系统调用、监控文件与网络行为。适用于经授权的安全测试、应用加固审查、CTF,以及对自己拥有或获准分析的软件进行逆向工程。

架构与运行方式

renef 采用主机客户端架构:主机(macOS/Linux shell)上的 renef 客户端通过 ADB 转发套接字驱动运行在 Android 设备上的 renef_server。默认模式下不在设备上运行 renef,也不使用 adb push 脚本再 adb shell 执行的方式;该设备端模式仅适用于 --local 模式(Termux/SSH 且设备已 root)。Lua 脚本保留在主机上,通过 -l 参数发送到设备。

Lua 脚本运行在目标进程内部(注入 libagent.so,内嵌 Lua 5.4,memfd 注入,不使用 ptrace)。Module.、Memory. 以及 Hook 回调均在应用的地址空间中执行,路径、PID、文件描述符均属于目标进程。

可通过 CLI REPL(renef>)交互驱动,或通过 -l script.lua 一次性执行。Hook/追踪输出是异步的,必须通过 watch 或 -w 启动才能看到输出。

连接模式

  • Spawn(root):renef -s com.pkg -l hook.lua,全新启动,在应用代码运行前安装 Hook。
  • Attach(root):renef -a <pid> -l hook.lua,附加到已运行进程。
  • Spawn gate:renef -s com.pkg -l bypass.lua --pause,用于绕过启动时检查。
  • Gadget(无 root):renef -g <pid> -l hook.lua,非 root,APK 已用 libagent.so 修补。
  • Local(设备端):renef --local -s com.pkg -l /data/local/tmp/hook.lua,Termux/SSH,SELinux 安全。

除最后一行外,其余模式均在主机上运行 renef 客户端并连接设备;仅 --local 在设备端运行客户端。设备端需先启动 renef_server(adb shell /data/local/tmp/renef_server,或由 magisk-renef 模块自动启动)。引擎可选 trampoline(默认,任意地址)或 --hook=pltgot(仅导入函数)。

语法要点

语言为 Lua 5.4。原生 Hook 的目标是(库名,偏移量),而非绝对地址;Java Hook 的类名使用 / 分隔(JNI 风格),签名必填。onEnter 的 args[0..7] 对应 x0..x7;Java 实例方法第一个参数为 args[2],静态方法第一个参数为 args[1],原生函数第一个参数为 args[0]。onEnter 与 onLeave 之间共享状态应使用闭包局部变量,而非 args(onLeave 中不存在 args)。onLeave 返回整数可设置 x0(1 为 true,0 为 false),返回 Jni.newStringUTF("...") 可替换字符串返回值,返回 retval 表示透传。

内存操作包括 Memory.scan/search、read/readU8/16/32/64、readStr/readString、write/writeU8/16/32/64、patch(自动 mprotect)。不存在 Memory.writeString,写字符串应使用 Memory.write(addr, "text\0")。

模块操作包括 Module.find、Module.list、Module.exports(.dynsym)、Module.symbols(.symtab)。

Java 运行时(不 Hook)包括 Java.use、Java.registerClass、Java.array。

其他全局对象包括 Jni、Thread、File、Syscall、OS、print/console.log 以及颜色常量。脚本顶部可设置 hook_type = "trampoline"|"pltgot"。

不存在 Interceptor、Java.perform、Process.、ptr()/NativePointer 或 gg. 命名空间,这些属于其他工具,需要转换。

使用流程

  1. 预检:确认 adb devices 仅列出一台已授权设备、主机存在 renef 客户端、设备端 renef_server 正在运行、具备 root(或 gadget 模式)、目标为 ARM64 且包已安装。
  2. 连接目标。
  3. 定位目标代码:通过符号或字节模式解析偏移量,不要硬编码绝对运行时地址,并用 if not base then return end 保护。
  4. 安装最小 Hook 验证调用触发(在 onEnter 中打印)。
  5. 通过 -w/watch 观察输出并触发应用进行验证。
  6. 迭代:仅在最小 Hook 确认后再添加逻辑。

对于启动时保护(root/完整性/调试器检查),使用 --pause 在应用 onCreate 之前安装 Hook。

适用场景

  • 覆盖 Java 布尔/整数检查(root、isVip、license)。
  • 绕过会抛异常的 void Java 校验(如 SSL checkServerTrusted)。
  • 替换 Java 字符串返回值。
  • 追踪/检查原生函数。
  • Hook 尚未加载的库(Flutter、插件)。
  • 游戏数值修改(查找/编辑/冻结数值)。
  • 监控文件/网络/系统调用。
  • 修补/NOP 原生代码。
  • 移植 Frida 或 GameGuardian 脚本。

限制

  • 仅面向 Android ARM64。
  • 默认模式需要主机客户端与设备端服务器配合,设备端需 root 或 gadget 模式。
  • Hook 目标必须为(库名,偏移量),不支持绝对地址。
  • 不存在 Memory.writeString、Interceptor、Java.perform、Process.、ptr()/NativePointer、gg. 等 API。
  • 错误信息可能被隐藏(ERROR: Lua execution failed / (no response) / Agent disconnected),需通过 pcall/load 恢复真实信息。
  • 在应用运行时安装热函数 Hook(open/read/write/system/popen/do_dlopen)可能导致竞态崩溃,重要绕过应放在前面,风险 Hook 放在最后。
  • 脚本语法建议先用 luac -p 预检。
  • 仅限经授权的安全测试、应用加固审查、CTF 及自有软件逆向工程。