这个ASM功能的参数在哪里?

时间:2014-01-19 02:22:39

标签: function assembly x86 arguments disassembly

我有这个反汇编的功能:

PUSH    EBP
MOV     EBP, ESP
SUB     ESP, C
PUSH    408506
MOV     EAX, DWORD PTR FS:[0]
PUSH    EAX
MOV     DWORD PTR FS:[0], ESP
SUB     ESP, 14
PUSH    EBX
PUSH    ESI
PUSH    EDI
MOV     DWORD PTR [EBP-C], ESP
MOV     DWORD PTR [EBP-8], 4077D8
XOR     EBX, EBX
MOV     DWORD PTR [EBP-4], EBX
MOV     EDI, DWORD PTR [EBP+8]
PUSH    EDI
MOV     EAX, DWORD PTR [EDI]
CALL    NEAR DWORD PTR [EAX+4]
MOV     ESI, DWORD PTR [EBP+C]
MOV     ECX, DWORD PTR [EDI]
LEA     EDX, DWORD PTR [EBP-1C]
MOV     DWORD PTR [EBP-18], EBX
PUSH    EDX
PUSH    ESI
PUSH    EDI
MOV     DWORD PTR [EBP-1C], EBX
CALL    NEAR DWORD PTR [ECX+37C]
CMP     WORD PTR [EBP-1C], BX
JE      00558206
MOV     EAX, DWORD PTR [EDI+D8]
CMP     EAX, EBX
JE      0055819A
CMP     WORD PTR [EAX], 1
JNZ     0055819A
MOV     EDX, DWORD PTR [EAX+14]
MOV     ECX, DWORD PTR [EAX+10]
MOV     EBX, DWORD PTR [401190]
MOVSX   ESI, SI
SUB     ESI, EDX
CMP     ESI, ECX
JB      0055818F
CALL    NEAR EBX
LEA     EAX, DWORD PTR [ESI+ESI*4]
LEA     EAX, DWORD PTR [EAX+EAX*4]
SHL     EAX, 5
JMP     005581A2
MOV     EBX, DWORD PTR [401190]
CALL    NEAR EBX
MOV     ECX, DWORD PTR [EDI+D8]
MOV     EDX, DWORD PTR [ECX+C]
MOV     ECX, DWORD PTR [EBP+10]
MOV     AX, WORD PTR [EDX+EAX+2C8]
MOV     WORD PTR [ECX], AX
MOV     EAX, DWORD PTR [EDI+D8]
TEST    EAX, EAX
JE      005581E6
CMP     WORD PTR [EAX], 1
JNZ     005581E6
MOVSX   ESI, WORD PTR [EBP+C]
MOV     EDX, DWORD PTR [EAX+14]
MOV     ECX, DWORD PTR [EAX+10]
SUB     ESI, EDX
CMP     ESI, ECX
JB      005581DB
CALL    NEAR EBX
LEA     EAX, DWORD PTR [ESI+ESI*4]
LEA     EAX, DWORD PTR [EAX+EAX*4]
SHL     EAX, 5
JMP     005581E8
CALL    NEAR EBX
MOV     EDX, DWORD PTR [EDI+D8]
MOV     DWORD PTR [EBP-18], -1
MOV     ECX, DWORD PTR [EDX+C]
MOV     DX, WORD PTR [ECX+EAX+2CA]
MOV     EAX, DWORD PTR [EBP+14]
MOV     WORD PTR [EAX], DX
MOV     EAX, DWORD PTR [EBP+8]
PUSH    EAX
MOV     ECX, DWORD PTR [EAX]
CALL    NEAR DWORD PTR [ECX+8]
MOV     EDX, DWORD PTR [EBP+18]
MOV     AX, WORD PTR [EBP-18]
MOV     WORD PTR [EDX], AX
MOV     EAX, DWORD PTR [EBP-4]
MOV     ECX, DWORD PTR [EBP-14]
POP     EDI
POP     ESI
MOV     DWORD PTR FS:[0], ECX
POP     EBX
MOV     ESP, EBP
POP     EBP
RETN    14

我可以猜测,由于RETN 140x14 = 20对吗?),该函数可能需要5个4个字节的参数。然后我也可以在那个反汇编的代码中看到像EBP+8EBP+C这样的东西,所以我想“哦,那些是第一个和第二个参数”。嗯,对,这些是函数的第一个和第二个参数。但我猜不出其他的在哪里。我尝试了EBP+16EBP+20EBP+24,但他们给我的价值听起来不像是参数。

我如何解释这个反汇编的代码?

提前致谢。

1 个答案:

答案 0 :(得分:1)

你的假设是对的;通过反汇编扫描,我发现有五个参数被引用,所有DWORD都是4个字节:

DWORD PTR [EBP+8]     ; first parameter (the first 8 bytes are reserved for return address and original EBP)
DWORD PTR [EBP+C]     ; hexadecimal C = decimal 12
DWORD PTR [EBP+10]    ; hexadecimal 10 = decimal 16
DWORD PTR [EBP+14]    ; hexadecimal 14 = decimal 20
DWORD PTR [EBP+18]    ; hexadecimal 18 = decimal 24

考虑到你为参数3/4/5提出的数字,我想你在十进制和十六进制之间转换时感到困惑;你应该在你身边保留一个数字表,直到这成为你的第二天性。

编辑:关于调用约定...

反汇编似乎是具有stdcall调用约定的函数。要调用该函数,首先必须将每个双字参数值从右向左推送到堆栈上(即第一个参数是最后一个要推送的参数)。该函数清理堆栈,因此您不必在之后弹出任何内容。你可以在这里找到源样本: