...
MOV ECX, DWORD PTR DS:[__argc_dll]
MOV EAX, DWORD PTR SS:[EBP+0x8]
MOV DWORD PTR DS:[EAX], ECX
MOV ECX, DWORD PTR SS:[EBP+0xC]
MOV EDX, DWORD PTR DS:[__argv_dll]
MOV EAX, DWORD PTR DS:[EBP+0x10]
POP EBP
...
所以我写了下面的代码(在C中):
int ecx = 0;
ecx = 1; //because the value in [__argc_dll] was 00000001
int *func1 = &00404020; //because [EBP+0x8]=00404020
int *eax = *func1; // is the assembly line MOV EAX, DWORD PTR SS:[EBP+0x8]
eax = ecx; // is the assembly line MOV DWORD PTR DS:[EAX], ECX
type *func2 = &00404024; // because [EBP+0xC]=00404024
type *ecx = &func2; // MOV ECX, DWORD PTR SS:[EBP+0xC]
type *edx = &argv_dll //is the assembly lineMOV EDX, DWORD PTR DS:[__argv_dll]
type *func3 = &00404028; // because [EBP+0x10]=00404028
type *eax = &func3; //the line: MOV EAX, DWORD PTR DS:[EBP+0x10]
所以我的问题是: 这是正确的表述吗?我必须承认我是关于指针概念的新手。 所以我做的是: 我假设堆栈地址[EBP + 0x8],[EBP + 0xC]和[EBP + 0x10]上的3个值是普通地址,并在它们的前3个指针处创建。 在我创建了像* eax之类的其他指针之后,它们也指向了这些地址。
我的第二个问题是: 如何在汇编代码末尾实现像 POP EBP 这样的弹出操作?我真的需要它代表吗?我会说不,或者?
Ollydbg在该行显示EBP位于
Stack [EBP]=[0012FF40]=0012FF88
EBP = 0012FF40
在那次手术后我有EBP = 0012FF88。