如何在 IDA Pro 中创建识别通过引用传递的参数的函数原型

逆向工程 艾达 x86 调用约定
2021-06-24 07:28:00

我有一个由 IDA 生成的函数原型,如下所示:

在此处输入图片说明

但是,看起来在指令lea edi, [esp+290h+var_240] 中引用了一个结构我希望 IDA 在其函数原型中引用这个传递的地址作为参数。

我已经尝试了下面的方法,但很明显它不起作用。

在此处输入图片说明

我想看到的是这样的

在此处输入图片说明

任何帮助或建议将不胜感激!

1个回答

我的猜测是函数签名应该是这样的:

int __usercall Call_HTTP@<eax>(int x, int y, void* http_object@<edi>);
  • __usercall 意味着函数的调用约定不是标准的(如 stdcall、cdecl 等),因为函数在堆栈上传递两个参数,在 edi 中传递一个参数。
  • @<eax> : 函数在 eax 寄存器中返回一个值。
  • int xint y在堆栈上传递。
  • void* http_object@<edi> : http_object 是通过 edi 寄存器传递的 void*。

您可以http_object通过将此对象的适当结构添加到已知 IDA 结构并传递实际类型而不是void*.

有关函数签名的更多信息,请参阅有关Set function/item type的 IDA 帮助

编辑

正确的签名应该是:

int __userpurge Call_HTTP@<eax>(int x, int y, void* http_object@<edi>);

正如@itsbriany 所说:

  • 对于__stdcall__userpurge调用约定,被调用者清理堆栈。
  • __cdecl__usercall约定中,调用者清理堆栈。