能力值:
( LV2,RANK:10 )
|
-
-
2 楼
第一个[esp+4]的值是ecx。因为最后push进去的是edx,他就是[esp],倒数第二个push进去的是ecx,就是[esp+4]。
第二个[esp+8]的值取决于那个call。看这里的call用的是什么调用方式,如果是被调用者清栈的话,看call有几个参数,就可以算出来[esp+8]是多少了;同样,如果是调用者清栈,这里也很容易算出来[esp+8]。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
多謝指點
我一直不能確定
經過確認就不會出錯了
那再問下
push ebp esp=00111120
mov ebp,esp
sub esp,10
push ebx esp=0011110c
push ecx esp=00111108
push edx esp=00111104
xor ebx ,ebx
mov [esp+4],ebx
mov [esp+8],ebx
mov [esp+0c]ebx
mov [esp+10],ebx
push 1 esp=00111100
call 00123456
mov ecx,eax
mov eax,[esp+8] esp=00111100
leave
ret
CALL 00123456内會不會出現 esp=00111108 呢 就是和他上方ESP相等 還是說ESP是唯一的 不能相等
現在的esp+8是0還是ecx 或者是call内的内容呢
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
誰能教我一下呢
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
esp可以理解成一个指针,堆栈就好像一个DWORD数组。一般call里面esp都是比之前的esp数值小。call里面局部变量就是靠sub esp这种方法产生的。刚进call时,[esp]里面是返回地址,如果有参数通过堆栈传递进来的话,就是[esp+4],[esp+8]等等。不过一般进来call之后,前几句都是push ebp和mov ebp,esp。有局部变量的话,还有sub esp,XX。之后通过ebp来操作局部变量和参数。建议你看一下前几天有人发的那个堆栈变化分析的帖子。
回答你的问题,正常情况下,在call 00123456内不会出现esp=0011108的情况。你问现在esp的值是什么?看你的标注,call完之后esp=00111100。难道你想问的是[esp]的值?
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
[QUOTE=icersg;535420]esp可以理解成一个指针,堆栈就好像一个DWORD数组。一般call里面esp都是比之前的esp数值小。call里面局部变量就是靠sub esp这种方法产生的。刚进call时,[esp]里面是返回地址,如果有参数通过堆栈传递进来的话,就是[esp+4],[esp+8]等等。不过一般进来call之后,...[/QUOTE]
在CALL里面应该esp应该有可能经过不同的代码应该有可能会变为esp=00111108的把?
只是不管怎么变 进CALL后与返回CALL ESP的直肯定是相等的`````
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
不一定相等的 經常遇到 出來比進去反而多了4 ( 今天我跟蹤的那個程序 出來也不平衡堆棧 就是多4字節 ) 我上面要問的是 esp+8 少打個8 忘記了 意思就是說他能不能 是 mov[esp+4],ebx 中的 [esp+4]的内容 我再去翻番帖子
|
能力值:
( LV9,RANK:850 )
|
-
-
8 楼
函数调用约定不同,调用后和调用前的esp不一定相等
|
|
|