SuperAPI AI 工具集

frida-stalker-android

安全与审计

查看项目

更新于 10-16 00:21

技能介绍

用途:在 Android 上使用 Frida Stalker API 追踪原生代码执行,模板面向 ARM/ARM64,并采用性能安全的默认配置,适用于 Frida 17+ JavaScript 语义。

适用时机:用户明确要求在 Android 上使用 Frida Stalker;需要低开销测量原生调用活动(谁被调用、频次);需要有序调用事件(重建调用图)或粗粒度覆盖率;需要在基本块编译时通过 transform(iterator) 注入逻辑。

选择方式:只要每个目标的调用计数、不关心顺序,用 onCallSummary;需要有序 call/ret/block/compile 事件,用 onReceive 并以 Stalker.parse() 解码;需要指令级匹配与回调,用 transform(iterator)(开销重,范围要窄);只关注少量调用目标,可考虑 Stalker.addCallProbe()。

核心 API(Frida 17+):Stalker.follow([threadId, options]) 只提供一个回调(onReceive 或 onCallSummary);Stalker.unfollow([threadId]);Stalker.parse(events, { annotate, stringify });Stalker.flush() 提前排空缓冲事件,否则由 Stalker.queueDrainInterval 周期排空;Stalker.garbageCollect() 应在 unfollow() 后于安全点调用以释放内存;Stalker.exclude({ base, size }) 排除内存范围。可调项:trustThreshold 默认 1(-1 不信任、0 立即信任、N 次执行后信任);queueCapacity 默认 16384 事件;queueDrainInterval 默认 250ms(设 0 禁用周期排空并手动 flush)。

流程:定义目标、选择线程、选择捕获模式与过滤、挑模板改配、运行调优并清理。使用 Frida MCP 工具时另启用 $frida-mcp-workflow 并按其阶段执行;脚本保持文件化。模板包括 stalker-call-summary.js、stalker-onreceive-parse.js、stalker-start-stop-around-hook.js、stalker-call-probe.js、stalker-transform-skeleton.js、stalker-filter-modules.js。

快速开始:未知线程 id 先用 start-stop-around-hook;已知线程且低开销用 call-summary;需要有序事件用 onreceive-parse;只关注单个目标用 call-probe。MCP 流程:创建/附加会话,用 load_script 加载模板,通过 call_rpc_export 调用 start()/stop(),用 get_session_messages 消费输出,并维护脚本台账。

Android 注意事项:线程选择很关键,错误线程会看不到结果或只有系统噪声;安全做法是在 Interceptor.attach() 回调内用 Process.getCurrentThreadId() 获取正在执行目标函数的线程再开始跟踪。模块过滤必要,应用代码通常在路径含 /data/app/、/data/data/ 或解压 APK 拆分路径的模块中,可用 Stalker.exclude() 排除 libart.so、libc.so、liblog.so 等噪声源。32 位 ARM 上使用裸地址时 Thumb 函数需置低位,优先用 Process.getModuleByName(...).getExportByName(...) 返回的地址。除非确知后果,避免 Process.runOnThread(),它可能中断不可重入代码导致死锁或崩溃。

性能规则:非必要不用 events.exec,其数据量巨大;优先 onCallSummary 而非 onReceive;回调保持精简,重活尽量放到宿主侧;积极用 Stalker.exclude();需要确定性窗口时用手动排空(queueDrainInterval = 0 配合 flush());反复启停时在 unfollow 后调用 garbageCollect()。

清理清单:Stalker.unfollow(threadId)、Stalker.flush()、Stalker.garbageCollect()。

排障:完全无输出多为跟踪了错误线程或回调未被调用;只有系统噪声需加模块过滤与排除,并从已知处于应用代码的 hook 内开始;目标明显变慢或崩溃需减少事件、停用 exec、改用 onCallSummary 并排除大而嘈杂的模块。更深入说明见 references/stalker-api.md 与 references/android-filtering.md。