Frida Stalker Trace 指令跟踪&寄存器变化监控

Frida Stalker实现指令跟踪与寄存器监控

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

Frida Stalker

Frida 的 Stalker 是一个强大的代码追踪工具。

主要功能

  1. 指令级跟踪:Stalker 可精确到指令级别,对应用的原生代码进行实时监控。

  2. 代码插桩:支持在指定指令前后插入自定义的代码逻辑。

  3. 内存访问监控:可以监视内存读写操作,分析数据流向。

  4. 自定义回调:提供回调函数,方便记录和分析执行轨迹。

文档:https://frida.re/docs/javascript-api/#stalker

相关文章:

Frida Stalker Trace

指令跟踪

在 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.log("目标函数地址: " + targetFuncAddr);

    // 拦截目标函数,开始跟踪当前线程
    Interceptor.attach(targetFuncAddr, {
        onEnter(args) {
            let tid = Process.getCurrentThreadId()
            this.tid = tid
            console.log(`进入函数,开始 trace [${tid}]`);
            Stalker.follow(tid, {
                events: {
                    call: false,
                    ret: false,
                    exec: true,
                    block: false,
                    compile: false
                },
                transform(iterator) {
                    let instruction = iterator.next
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值