Assembly 从ASM代码中获取参数和返回值

Assembly 从ASM代码中获取参数和返回值,assembly,arguments,Assembly,Arguments,我正在调查一些windows的内部结构,由于找不到任何文档,我开始阅读分解后的代码。基本上我想知道的是如何确定函数的参数和返回值: 以下是通话前的说明: MOV EAX,DWORD PTR DS:[ESI+64] LEA ECX,DWORD PTR SS:[EBP-4] PUSH ECX PUSH DWORD PTR DS:[EAX+4] PUSH DWORD PTR DS:[EAX] PUSH DWORD PTR DS:[ESI+60] CALL <FUNCTION CALL>

我正在调查一些windows的内部结构,由于找不到任何文档,我开始阅读分解后的代码。基本上我想知道的是如何确定函数的参数和返回值:

以下是通话前的说明:

MOV EAX,DWORD PTR DS:[ESI+64]
LEA ECX,DWORD PTR SS:[EBP-4]
PUSH ECX
PUSH DWORD PTR DS:[EAX+4]
PUSH DWORD PTR DS:[EAX]
PUSH DWORD PTR DS:[ESI+60]
CALL <FUNCTION CALL>
MOV-EAX,DWORD-PTR-DS:[ESI+64]
LEA ECX,DWORD PTR SS:[EBP-4]
推ECX
推送DWORD PTR DS:[EAX+4]
推送DWORD PTR DS:[EAX]
推送DWORD PTR DS:[ESI+60]
呼叫

这是4次推送后的堆栈:

000000C0(4字节文字?)

001CEAF0(堆中的地址?)

000001B8(4字节文字?)


0019F2FC(堆中的地址?

考虑到您正在调查Microsoft Windows内部结构,似乎使用的调用约定是
stdcall
;维基百科注释:

<代码> STDCALL> /COD>是微软Win32 API的标准调用约定,以及开放WATCOM C++ ++ < /P> 有关更多信息,请参阅和上的Wikipedia页面

因此,在您的情况下,这将对应于以下C代码:

eax = function(0x0019F2FC, 0x1B8, 0x001CEAF0, 0xC);

代码片段中充满了
PUSH
指令,是什么让你认为这会是fastcall?也许我提供的额外信息会有所帮助???@Jester:谢谢,我不知道我在想什么。修改了我的答案。太好了,谢谢!尽管如此,有没有办法确定参数的类型?我知道第一个和第三个参数是指针(我已经检查过了,内存区域存在),另外两个是文本(可能是缓冲区大小???),不幸的是,没有。你可以追溯参数的来源(例如,从一个具有已知API的函数),你可以查看这些地址的内存,找出它包含哪些数据,或者,您可以分解函数并查看它对参数的作用。您的缓冲区大小可能是合理的,但如果不进一步调查,就很难确定。