DBI Frida Stalker 不是追踪指令

问题描述 投票:0回答:1

首先让我说我是 Frida 的新手,所以我可能犯了一个愚蠢的错误。

我正在尝试“跟踪”一个简单的

while
循环并使用转换器打印指令。 我的
target.c
文件如下所示

// target.c
#include <stdio.h>

void read_n_print(int mul)
{
    int n;
    printf("Enter a number\n");
    scanf("%d", &n);
    printf("%d * %d = %d\n", n, mul, n * mul);
}

int main(int argc, char *argv[])
{
    while (1) {
        read_n_print(2);
    }

    return 0;
}

我正在用

gcc
编译代码:
gcc target.c -o target-demo1

现在,我正在尝试使用 Stalker API 来跟踪

target.c
中定义的代码,同时排除 .so 库。

我的

agent.js
在下面

// agent.js
'use strict';

var modules = Process.enumerateModules();

modules.forEach(module => {
    console.log(module.name, module.base, module.size);
});

modules.forEach(module => {
    if ((module.name.indexOf("target-demo1") === -1) &&
        (module.name.indexOf("libmylib.so") === -1)) {

        console.log(`Excluding ${module.name}`);

        // We're only interested in stalking our code
        Stalker.exclude({
            "base": module.base,
            "size": module.size
        });
    }
});

Process.enumerateThreadsSync().map(t => {
    console.log(`Thread id is ${t.id}`);

    Stalker.follow(t.id, {
        transform(iterator) {
            console.log("HERE")
            var instruction = iterator.next()
            do {
                console.log(instruction);
                iterator.keep()
            } while ((instruction = iterator.next()) !== null)
        }
    });
});

我正在加载我的脚本

frida target-demo1 -l agent.js

当我第一次在运行的

target-demo1
过程中输入一个数字时,frida 会打印出一个指令流。 在此之后,无论我在
target-demo1
中输入多少数字,frida都不会打印任何东西。

我期待只要 frida 连接到

target-demo1
并继续打印,stalker 转换就会运行 while 循环执行时的指令。 我是不是理解错了什么?

我跑了

  • frida版本
    15.1.8
    (安装
    python pip
  • 里面
    Linux LAPTOP-7SIL4P0D 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
  • Ubuntu 20.04 LTS

作为旁注,如果我删除

Stalker.exclude()
代码,
target-demo1
进程段错误。 如果我使用 frida
14.2.18
(
pip install frida-tools==9.0.0
).

,则该过程不会出现段错误
reverse-engineering dbi instrumentation frida
1个回答
0
投票

transform 只会为每个代码块运行一次。您需要使用 onReceive 回调来接收代码的执行跟踪。

请参阅文档中的示例。 https://frida.re/docs/javascript-api

© www.soinside.com 2019 - 2024. All rights reserved.