HexRays:可变参数方法,如 printf

逆向工程 艾达 手臂 六线谱
2021-06-27 03:01:37

我已经确定了一个与 ARM64 二进制文件中的 printf 完全一样的例程。参数以标准方式传递(例如 X0、X1、X2 ...),并且我已经为函数提供了以下签名 (Y):

int printf(char* fmt, ...)

这有时会做“正确的事情”,但不是很频繁。通常它会错过第二个参数之后的任何参数。

有没有办法告诉 HexRays 更多关于这个例程的信息,以便它“做正确的事”并正确显示数据?例如,其中一行实际上是:

printf("%s: %s: foo: 0x%llx, bar: 0x%llx, baz: %u\n", "function_name");

当它应该有更多参数时,如格式字符串所示(并且在调用之前立即加载到寄存器中)。

2个回答

如果反编译器检测到可变参数函数调用的参数数量错误,您可以使用上下文菜单命令或数字键盘 +/- 热键对其进行调整

右键单击反编译器窗口中的函数调用,您将看到添加和删除可变参数。在 x86 上的 Ida 6.95 中检查,函数应使用可变参数原型定义。