这是一个内容丰富的版本,重点是让 Frida 进入更棘手的环境,并投入大量精力改进 Barebone 后端、Linux 注入路径和 Gum 底层机制。感谢 @hsorbo 与我们共同度过愉快的 iOS 内核黑客松,并提交增加 Segger J-Link 支持的 PR;也感谢 @ltlly 对 Stalker 的贡献。
主要变化:
- linux:为 ptrace 槽已被其他跟踪器占用的目标新增无 ptrace 注入后备方案。Frida 会改用 /proc/$pid/mem,把引导代码写入目标以映射并运行加载器,支持 x86、x86_64 和 arm64。对于从不调用 malloc 的安静目标,Frida 会采样 CPU 活动,解析最热的 libc 叶函数并改在该处 Hook。
- barebone:Virtualization framework 客体的内核内插桩取得重大进展,包括 VZ 内核 GDB 桩客户端、物理内存桥接、fileset kernelcache 和 kext 处理、按段重定位,以及通过主机修补内核文本。
- barebone:通过 vsock 建立内核内 hostlink,包括 PAC 签名回调和异步连接处理。W^X 操作现在通过 RPC 完成,使 NativeCallback、Interceptor、Memory.patchCode() 等无需依赖会让研究内核 panic 的 BRK 回调。
- barebone:让 Interceptor 和 Stalker 在内核中工作,包括经物理桥接实现可写重映射、修改页表后刷新 TLB、从 Stalker 排除 Agent 自身范围,以及让线程 ID 可安全地经 JavaScript 往返。
- barebone:提升内核注入稳健性。Agent 就位后分离调试桩;调用函数时容忍线程迁移;从缓存 MMU 参数查询页面大小;就近分配失败时返回 NULL 而不是 panic。
- barebone:为
none-arm64资源、devkit 和 Barebone Agent 添加 CI。 - barebone:省略 Arm64 向量上下文,避免溢出狭小的内核栈。
- gdb:改进远程桩兼容性。缺少
g/G时回退到逐寄存器访问;检测vCont支持并提供后备;接受空qRcmd回复;按qXfer支持加载目标属性;访问寄存器前切换线程;始终发送正确校验和。感谢 @hsorbo! - compiler:修复归档符号重命名。现在只在字符串表中重写符号,而不是匹配整个归档中的字节;同时更新归档索引,使 COFF 归档重命名后仍能正确链接。
- module:为
GumExportDetails新增size,通过 QuickJS 和 V8 中的enumerateExports()公开导出大小。ELF 报告st_size;无法提供信息的平台报告-1。 - memory:在 Linux 6.11 及更高版本使用
PROCMAP_QUERYioctl 加速保护查询,并缓存回退到解析/proc/self/maps。让代码可读时也会保留页面保护,并共享旧版 manylinux 工具链所需的O_CLOEXEC后备。 - stalker:在 Arm 和 Arm64 后端为待处理字面量预留空间,使每条指令都带 callout 的大型无分支代码块不再溢出 slab 并破坏相邻内存。感谢 @ltlly!
- process:限制 aarch64 ucontext 记录遍历,避免畸形记录或 libunwind 较小的上下文布局让回溯器崩溃。
- vapi:新增 X86Writer 绑定,使 Vala 代码能生成 x86 和 x86_64 指令,与现有 Arm64Writer 支持一致。
oleavr