首先让我说我是 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 循环执行时的指令。
我是不是理解错了什么?
我跑了
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
).,则该过程不会出现段错误
transform 只会为每个代码块运行一次。您需要使用 onReceive 回调来接收代码的执行跟踪。
请参阅文档中的示例。 https://frida.re/docs/javascript-api