我有一个由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*。有关函数签名的更多信息,请参见IDA帮助中的Set function / item type。

编辑

正确的签名应为:

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


@itsbriany所述:


对于__stdcall__userpurge调用约定,被调用方清理堆栈。
在q4312中079q和__cdecl约定,调用方将清理堆栈。


评论


谢谢,它有效!我还要补充一点,调用约定将是_userpurge,因为调用约定最初是_stdcall。这是因为在_stdcall和_userpurge中,被调用方会清理堆栈。在_cdecl和_usercall中,调用者清理堆栈:)

–itsbriany
2015年11月11日在16:47



@itsbriany糟糕,抱歉,该错误...不错!我将编辑我的帖子。

– Neitsa
15年11月12日在10:20