但是,看起来在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 x
和int 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