我确定了一个例程,该例程的行为与ARM64二进制文件中的printf完全相同。参数以标准方式传递(例如X0,X1,X2 ...),我为函数赋予了以下特征的签名(Y):

int printf(char* fmt, ...)

“正确的事情”有时会出现,但不是很频繁。通常,它会在第二个参数之后遗漏任何参数。例如,其中一行有效:紧接通话之前)。

#1 楼

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

评论


添加到Hex-Ray中以自动选择格式参数并从中推断类型信息(字符串,int,指针)是一个很棒的功能。我以为限制是不确定我的特定二进制文件中的ABI(例如GCC与MSVC的堆栈溢出)。

–扎克(Jach)步枪
17年11月1日在18:49

反编译器中已经有一些有限的启发式方法,但是格式字符串并不总是与实际传递的参数相对应,并且格式说明符可能会根据实现而改变含义,这就是为什么存在手动覆盖的原因。如果您经常错误地弄清参数的数量,则应发送带有示例二进制文件/ IDB的报告。

–伊戈尔·斯科钦斯基♦
17年11月1日在18:54

#2 楼

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