我有这个反汇编的功能:
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 14
(0x14
= 20
对吗?),该函数可能需要5个4个字节的参数。然后我也可以在那个反汇编的代码中看到像EBP+8
和EBP+C
这样的东西,所以我想“哦,那些是第一个和第二个参数”。嗯,对,这些是函数的第一个和第二个参数。但我猜不出其他的在哪里。我尝试了EBP+16
,EBP+20
和EBP+24
,但他们给我的价值听起来不像是参数。
我如何解释这个反汇编的代码?
提前致谢。
答案 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调用约定的函数。要调用该函数,首先必须将每个双字参数值从右向左推送到堆栈上(即第一个参数是最后一个要推送的参数)。该函数清理堆栈,因此您不必在之后弹出任何内容。你可以在这里找到源样本: