Igor 本周提示 #51:自定义调用约定
Igor 本周提示 #101:反编译可变参数函数调用
x86 下delphi fastcall 调用约定,eax,edx,ecx,[stack args]
示例
_LstrCatN(var dest:AnsiString; argCnt: Integer; ...)
第一个参数EAX (传入 ) 指向结果。
第二个参数EDX (传入 ) 是要连接的字符串数。
所有要连接的字符串都作为指针在堆栈上传递。
当编译器选项适配Delphi时,fastcall方式便是eax,edx,ecx,[stack args] 的传参形式,
但如果加入...
,设置可变参数则会自动忽略fastcall,因此需要通过设置usercall去限定通过寄存器传参
int __usercall LStrCatN@
(void *dest@ , int argCnt@ , ...)
而在设定后反汇编可能无法确定可变参数,需进行调整可变参数(Adjusting variadic arguments)
With correct prototypes, decompiler usually can guess the actual arguments passed to each invocation of the function. However, in some cases the autodetection can misfire, especially if the function uses non-standard format specifiers or does not use a format string at all. In such case, you can adjust the actual number of arguments being passed to the call. This can be done via the context menu commands “Add variadic argument” and “Delete variadic argument”, or the corresponding shortcuts Numpad + and Numpad -.
有了正确的原型,反编译器通常可以猜测传递给函数每次调用的实际参数。但是,在某些情况下,自动检测可能会失败,特别是当函数使用非标准格式说明符或根本不使用格式字符串时。在这种情况下,您可以调整传递给调用的实际参数数量。这可以通过上下文菜单命令“添加可变参数”和“删除可变参数”或相应的快捷键 Numpad 来完成 + 和数字键盘 - 。
使用IDA PRO 7.6版本,新版本或许可以直接识别0.0