Frida Stalker Trace 实战:指令级跟踪与寄存器变化监控全解析

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

Frida Stalker

Frida Stalker 是 Frida 提供的一个强大的指令级追踪引擎,它能够在目标进程运行时,动态捕获每一条指令的执行情况。与传统的函数级 hook 不同,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 回调函数中,处理目标线程执行的每一条汇编指令。

word/media/image1.png

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值