我正在使用
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
随机指针很可能是指向方法
Add
所属的 C++ 对象实例的指针。
在 C++ 中,此实例始终是函数的第一个参数,因此在 frida 脚本中为
arg[0]
。
如果你想读取这两个参数,你必须使用
arg[1]
和 arg[2]
:
onEnter(log, args, state) {
log(args[1].toInt32());
log(args[2].toInt32());
},