版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
Frida Stalker
Frida Stalker 是 Frida 提供的一个强大的指令级追踪引擎,它能够在目标进程运行时,动态捕获每一条指令的执行情况。与传统的函数级 hook 不同,Stalker 可以深入到 原生汇编层面 ,追踪寄存器变化、内存访问、函数调用关系等底层细节。
相关链接:
-
Stalker 介绍:https://frida.re/docs/stalker/
相关文章:
Frida Stalker Trace 流程
在 Frida Stalker 中,通过将这几个 API 组合起来,我们就能构建一个完整的 trace 流程:
-
Stalker.follow:负责启动跟踪,它会附加到指定的线程上,对该线程的指令执行流进行捕获和分析。
-
transform:提供了对指令流的加工入口。通过 transform(iterator),我们可以在指令生成阶段插入自定义逻辑。
-
iterator:是指令迭代器,用来逐条访问被捕获的指令。
-
putCallout:它允许在某条指令执行时触发回调,把当时的 CPU 上下文(寄存器状态、内存地址等)传递给我们的 JavaScript 脚本。
Stalker.follow 启动跟踪 → transform 接管指令流 → iterator 遍历每条指令 → 在关键位置用 putCallout 输出寄存器或上下文信息 ,从而实现细粒度的指令跟踪与寄存器变化监控。
指令跟踪(transform 和 iterator)
在 Stalker.follow 的 transform 回调函数中,处理目标线程执行的每一条汇编指令。

iterator 是一个 指令迭代器对象,它让你能够 逐条处理目标线程将要执行的原始机器指令。
iterator 支持的方法
| 方法 | 作用 |
|---|---|
| next() | 获取下一条指令 |
| keep() | 保留指令(否则会被跳过) |
| putCallout(fn) | 插入 JS 回调(运行在主线程) |
通过实现 transform 回调,trace 指定函数,打印地址、指令、模块信息。
function getModuleByAddressSafe(address) {
try {
// 尝试获取模块
var module = Process.getModuleByAddress(address);
// 如果模块存在,返回模块
if (module) {
return module;
} else {
// 如果没有找到模块,返回 null
return null;
}
} catch (e) {
// 捕获异常,返回 null
return null;
}
}
/**
* 指令跟踪
*
* @param targetModuleName 目标模块名
* @param targetSymbol 函数偏移(或导出名)
*/
function trace(targetModuleName, targetSymbol) {
// 获取模块基地址
const base = Module.findBaseAddress(targetModuleName);
if (base === null) {
console.error("模块未加载:" + targetModuleName);
return;
}
let targetFuncAddr;
if (typeof targetSymbol === "string") {
targetFuncAddr = Module.findExportByName(targetModuleName, targetSymbol);
} else {
targetFuncAddr = base.add(ptr(targetSymbol));
}
if (!targetFuncAddr) {
console.error("找不到函数地址");
return;
}
console.lo

最低0.47元/天 解锁文章
5180

被折叠的 条评论
为什么被折叠?



