You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DBI Frida Stalker无法持续追踪目标程序执行指令问题求助

问题解答

核心认知偏差

你对Stalker的transform回调触发逻辑理解有误:transform仅会在某段代码基本块首次被Stalker转译时触发一次,转译后的代码会被Stalker缓存,后续该代码块重复执行时不会再次调用transform回调,这就是你只有首次输入数字能看到日志,之后无输出的根本原因。

如果需要每次执行指令时都打印内容,需要在transform阶段插入执行时回调,示例修改如下:

Stalker.follow(t.id, {
    transform(iterator) {
        let instruction = iterator.next();
        do {
            // 插入指令执行时的回调,每次执行该指令都会触发
            iterator.putCallout(() => {
                console.log(instruction.address, instruction.mnemonic, instruction.opStr);
            });
            iterator.keep();
        } while ((instruction = iterator.next()) !== null);
    }
});

注意:每条指令都插回调会导致进程运行速度极慢,实际使用建议仅针对关键基本块插桩即可。

段错误与版本差异说明

Frida 15.x版本对Stalker的内存校验、转译逻辑做了大量调整,你移除Stalker.exclude()后触发段错误的原因有两个:

  • 未排除系统库的情况下,Stalker会追踪libc等系统模块的代码,WSL2内核的ptrace实现本身存在兼容性缺陷,追踪系统库代码很容易触发内存访问越界
  • 你直接枚举所有线程执行Stalker.follow的写法存在风险,附着进程时部分线程可能正处于系统调用执行状态,追踪这类线程的系统库代码极易触发崩溃

优化建议

  • 不要直接枚举所有线程开启Stalker追踪,建议先hook你要追踪的目标函数(比如本例的read_n_print),在hook回调中再对当前线程开启Stalker,避免无关线程干扰
  • 排除模块时不要直接批量排除所有非目标模块,建议保留必要的系统库段,或者仅对目标模块的地址范围做插桩过滤,降低兼容性问题

内容的提问来源于stack exchange,提问作者Eddie Staniloiu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:54:04