如何使用 Frida 读取函数调用中的参数

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

我正在使用

frida-trace
将处理程序附加到我的 C++ 控制台应用程序中的某个函数。这是目标应用程序的 C++ 代码:

string Add(int a, int b) {
    ostringstream oss;
    oss << a << " + " << b << " = " << (a + b);
    return oss.str();
}

这是基本计算器应用程序中的“add”函数,它接受两个整数并以字符串格式返回总和(例如,

1 + 1 = 2
) 我可以使用此命令找到该函数并使用 Frida 创建一个“处理程序”;
frida-trace -s "Add" SimpleCalculator.exe

请注意,在整个测试过程中,我将使用参数

Add
1
调用
1
方法。例如,我能够检测到函数何时被调用;

onEnter(log, args, state) {
    log('Add method was called...')
},

现在,我想读取传递给函数的参数。我尝试使用“args”数组来读取参数,但该数组似乎保存内存地址而不是实际值。这是可以理解的,但我无法弄清楚如何使用这些地址检索实际值。如果我记录地址;

onEnter(log, args, state) {
    log(args[0]);
    log(args[1]);
},

输出为;

0xf65aeff6e0
0x1

使用 args 数组中的值创建 NativePointer 似乎不会影响该值(这是我所期望的);

onEnter(log, args, state) {
  var a = new NativePointer(args[0]);
  log(a);
},

这只是打印第一个参数的相同地址,就像简单地执行

log(args[0])
一样(输出是
0xf65aeff6e0
)。然后我尝试了
readInt()
,但是这打印了
539697201
,这不是正确的参数值(它应该打印
1
)。我也尝试过
toInt32()
,并以各种不同的方式将它们组合起来,但没有成功。我也尝试了
Memory.readInt(a)
,但它给出了相同的随机值(
539697201
)。另一方面,
log(args[0].toInt32());
给出不同的随机值
1756755344
。有人可以帮我弄清楚如何读取传递给函数的参数吗?

这是包含可执行文件(/x64/Release)的示例应用程序:https://github.com/Emrebener/SimpleCalculator

c++ reverse-engineering instrumentation frida
1个回答
0
投票

随机指针很可能是指向方法

Add
所属的 C++ 对象实例的指针。

在 C++ 中,此实例始终是函数的第一个参数,因此在 frida 脚本中为

arg[0]

如果你想读取这两个参数,你必须使用

arg[1]
arg[2]
:

onEnter(log, args, state) {
    log(args[1].toInt32());
    log(args[2].toInt32());
},
© www.soinside.com 2019 - 2024. All rights reserved.