作者在 2009-02-20 18:37:09 发布以下内容
;一般而言,ss:[ebp+4]处为返回地址
;ss:[ebp+8]处为第一个参数值,ss:[ebp+0Ch]处为第二个参数
;ss:[ebp-4]处为第一个局部变量(这里是c),ss:[ebp]处为上一层EBP值
;ebp和函数返回值是32位,所以占4个字节
{
00401084 pop edi ;下面3句都是恢复寄存器,上面怎样push,这里就要对应反过来pop
00401085 pop esi ;简单来说就是先进来最后才出去,最后进来的先出去
00401086 pop ebx
00401087 add esp,40h ;恢复esp,对应上面的sub esp,40h
0040108A cmp ebp,esp ;检查esp是否恢复正常,不正常就进入下面的call里面debug
0040108C call __chkesp (004010b0) ;处理可能出现的堆栈错误(如果出错,将陷入debug)。
00401091 mov esp,ebp ;将栈顶指针放回esp
00401093 pop ebp ;恢复原来的ebp和esp,让上一个调用的函数正常使用
00401094 ret ;将返回地址存入EIP, 转移流程
00401085 pop esi ;简单来说就是先进来最后才出去,最后进来的先出去
00401086 pop ebx
00401087 add esp,40h ;恢复esp,对应上面的sub esp,40h
0040108A cmp ebp,esp ;检查esp是否恢复正常,不正常就进入下面的call里面debug
0040108C call __chkesp (004010b0) ;处理可能出现的堆栈错误(如果出错,将陷入debug)。
00401091 mov esp,ebp ;将栈顶指针放回esp
00401093 pop ebp ;恢复原来的ebp和esp,让上一个调用的函数正常使用
00401094 ret ;将返回地址存入EIP, 转移流程
;以上那部分代码在vc的debug调试版才会有
}