能力值:
( LV2,RANK:10 )
|
-
-
2 楼
ebp 是 栈底
esp 是 栈顶
PUSH EBP 是保存栈底
mov ebp,esp 是把栈顶给栈底成为新栈底 下一句应该是 sub esp,xxx 提升栈顶
|
能力值:
( LV7,RANK:100 )
|
-
-
3 楼
通常MSAPI特征都比较一致,框架如下:
kernel32!GetProcAddress:
7c80ae40 8bff mov edi,edi ;无意义,用于HotPatch
7c80ae42 55 push ebp ;保存原始ebp的内容
7c80ae43 8bec mov ebp,esp ;另ebp指向当前栈顶
……
执行完上述3条指令后,才开始函数内部的操作。接下来通常会为局部变量开辟栈空间
比如:
sub esp, 60h ;开辟一段大小为0x60的内存
esp即随之变化,但ebp不变,此时:
ebp - 0x60 == esp + 0x00
ebp - 0x5C == esp + 0x04
……
ebp - 0x04 == esp + 0x5C
ebp - 0x00 == esp + 0x60
用ebp或esp都可以访问局部变量
参数的话通常用ebp来寻址:
ebp + 0x08 == Param1
ebp + 0x0C == Param2
……(仅讨论WINAPI __stdcall)
当前栈空间大体布局如下:
+0xXX参数n
……
+0x0C参数2
+0x08参数1
+0x04返回地址(某一时刻的EIP)
+0x00原始EBP(push ebp存进来的)
=====当前EBP(曾经这里是栈顶,然后mov ebp,esp来着!)=====
-0x04局部变量1
-0x08局部变量2
……
-0xXX局部变量n
=====当前ESP(传说中的栈顶)=====
希望对你有帮助
|
|
|