Assembly “为什么?”;推ebp";是否更改ebp的值?

Assembly “为什么?”;推ebp";是否更改ebp的值?,assembly,x86,windbg,stack-pointer,Assembly,X86,Windbg,Stack Pointer,我有一个简单的代码: void func() { func2(); } 我省略了func2和main的实现,因为它们是不相关的。然后我使用windbg跟踪程序集,下面是执行“func2()”时程序集代码的输出: 我们可以看到,在执行“推ebp”之前,esp=0012fe98,ebp=0012ff68,但在执行“推ebp”之后,esp=0012fdc8,ebp=0012fe94?,所以我有两个问题: 1.推送代码可能只会影响esp,为什么ebp也会改变呢? 2.据推测,push ebp会

我有一个简单的代码:

void func()
{
    func2();
}
我省略了func2和main的实现,因为它们是不相关的。然后我使用windbg跟踪程序集,下面是执行“func2()”时程序集代码的输出:

我们可以看到,在执行“推ebp”之前,esp=0012fe98,ebp=0012ff68,但在执行“推ebp”之后,esp=0012fdc8,ebp=0012fe94?,所以我有两个问题: 1.推送代码可能只会影响esp,为什么ebp也会改变呢?
2.据推测,push ebp会将4个字节推送到堆栈,因此esp的值应该减少4,但我们在这里看到esp的值减少了208个字节?为什么?

如果要查看每条指令的执行情况,需要禁用源代码级调试。打开调试菜单并取消选中“源模式”。当您进入源代码模式时,所有映射到当前源代码行的指令都会在调试器中断之前执行。

根据Steve Johnson的指示,我取消选中“源代码模式”以跟踪程序集,事实上,在推ebp之后,会有很多(真的很多!)程序集代码在选中“源代码模式”时被隐藏。所以这个案例解决了,但我发现了其他问题,首先请看我更完整的代码:

void func();

int main(int argc, char* argv[])
{
    func();
    return 0;
}
void func2();

void func()
{
    func2();
}
在func中,我没有声明任何局部变量,以下是我在main中执行func()时的windbg输出:

事实上,我们看到在推ebp之后,实际上是mov ebp,esp改变了ebp,但在“mov ebp,esp”之后有一个代码“sub esp,0C0h”,我知道“sub esp,num”是为堆栈帧上的局部变量分配内存空间,但我没有在func中声明局部变量,所以我有以下问题: “sub esp,0C0h”在这里做什么? 从函数prolog开始,uf输出为:

0:000> uf func
SimpleStack!func [d:\code\simplestack\func.c @ 4]:
    4 004113f0 55              push    ebp
    4 004113f1 8bec            mov     ebp,esp
    4 004113f3 81ecc0000000    sub     esp,0C0h
    4 004113f9 53              push    ebx
    4 004113fa 56              push    esi
    4 004113fb 57              push    edi
    4 004113fc 8dbd40ffffff    lea     edi,[ebp-0C0h]
    4 00411402 b930000000      mov     ecx,30h
    4 00411407 b8cccccccc      mov     eax,0CCCCCCCCh
    4 0041140c f3ab            rep stos dword ptr es:[edi]
    5 0041140e e83dfcffff      call    SimpleStack!ILT+75(_func2) (00411050)
    6 00411413 5f              pop     edi
    6 00411414 5e              pop     esi
    6 00411415 5b              pop     ebx
    6 00411416 81c4c0000000    add     esp,0C0h
    6 0041141c 3bec            cmp     ebp,esp
    6 0041141e e818fdffff      call    SimpleStack!ILT+310(__RTC_CheckEsp) (0041113b)
    6 00411423 8be5            mov     esp,ebp
    6 00411425 5d              pop     ebp
    6 00411426 c3

没有<代码>推ebp完全按照tin上的说明执行。请注意,eip增加了1E,如果只执行了推送,它只会增加1。很明显,这不仅仅是推动,这里还发生了其他事情。EIP之间的差异(0041140e-004113f0)=1E字节。太大了,不可能是一条指令。你有多个线程在运行吗?@adelphus:你说得对。只需在
004113f0。。0041140e
您将找到一个序列(此处使用Intel语法):
推EBP;MOV-EBP,ESP;推子ESP,…
;这是由编译器生成的函数入口代码(称为函数序言),它使代码实现通常的C调用约定/ABI。在函数的结尾/返回处,您会找到相应的块
ADD ESP。。。;流行音乐。。。;离开RET
这就撤销了所有这些。@Wangshuaaijie:改变的不是
EBP
推送EBP而是随后的指令-这将是一个
MOV EBP,ESP
。这就是为什么
EBP
中的新值与
ESP
进入
func()
时的初始值相差四个字节的原因。如前所述,检查你们的反汇编。@all,恩,你们说得通,也许在执行push ebp的过程中,编译器在代码序列中插入了一些windbg在这里没有显示的汇编代码,我将尝试更多的内容。好的方面,我将尝试,也许是windbg优化了代码序列,使某些东西无法从普通视图中隐藏。请发布函数的整个反汇编。使用uf命令反汇编整个函数。发布“uf func”的输出,其中包含读取“sub esp,0c0h”的代码。您看到的是编译器在堆栈上提供了一些空间,以便安全地检测堆栈未对齐错误和缓冲区溢出。如果您在发布模式下编译代码,这一切都会消失。
004113c3 50              push    eax
0:000> 
eax=0000000a ebx=7ffda000 ecx=00000000 edx=00000001 esi=01f1f760 edi=0012ff68
eip=004113c4 esp=0012fe98 ebp=0012ff68 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
SimpleStack!main+0x24:
004113c4 e8e0fdffff      call    SimpleStack!ILT+420(_func) (004111a9)
0:000> t
eax=0000000a ebx=7ffda000 ecx=00000000 edx=00000001 esi=01f1f760 edi=0012ff68
eip=004111a9 esp=0012fe94 ebp=0012ff68 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
SimpleStack!ILT+420(_func):
004111a9 e942020000      jmp     SimpleStack!func (004113f0)
0:000> t
eax=0000000a ebx=7ffda000 ecx=00000000 edx=00000001 esi=01f1f760 edi=0012ff68
eip=004113f0 esp=0012fe94 ebp=0012ff68 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
SimpleStack!func:
004113f0 55              push    ebp
0:000> t
eax=0000000a ebx=7ffda000 ecx=00000000 edx=00000001 esi=01f1f760 edi=0012ff68
eip=004113f1 esp=0012fe90 ebp=0012ff68 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
SimpleStack!func+0x1:
004113f1 8bec            mov     ebp,esp
0:000> t
eax=0000000a ebx=7ffda000 ecx=00000000 edx=00000001 esi=01f1f760 edi=0012ff68
eip=004113f3 esp=0012fe90 ebp=0012fe90 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
SimpleStack!func+0x3:
004113f3 81ecc0000000    sub     esp,0C0h
0:000> t
eax=0000000a ebx=7ffda000 ecx=00000000 edx=00000001 esi=01f1f760 edi=0012ff68
eip=004113f9 esp=0012fdd0 ebp=0012fe90 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
SimpleStack!func+0x9:
004113f9 53              push    ebx
0:000> t
eax=0000000a ebx=7ffda000 ecx=00000000 edx=00000001 esi=01f1f760 edi=0012ff68
eip=004113fa esp=0012fdcc ebp=0012fe90 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
SimpleStack!func+0xa:
004113fa 56              push    esi
0:000> uf func
SimpleStack!func [d:\code\simplestack\func.c @ 4]:
    4 004113f0 55              push    ebp
    4 004113f1 8bec            mov     ebp,esp
    4 004113f3 81ecc0000000    sub     esp,0C0h
    4 004113f9 53              push    ebx
    4 004113fa 56              push    esi
    4 004113fb 57              push    edi
    4 004113fc 8dbd40ffffff    lea     edi,[ebp-0C0h]
    4 00411402 b930000000      mov     ecx,30h
    4 00411407 b8cccccccc      mov     eax,0CCCCCCCCh
    4 0041140c f3ab            rep stos dword ptr es:[edi]
    5 0041140e e83dfcffff      call    SimpleStack!ILT+75(_func2) (00411050)
    6 00411413 5f              pop     edi
    6 00411414 5e              pop     esi
    6 00411415 5b              pop     ebx
    6 00411416 81c4c0000000    add     esp,0C0h
    6 0041141c 3bec            cmp     ebp,esp
    6 0041141e e818fdffff      call    SimpleStack!ILT+310(__RTC_CheckEsp) (0041113b)
    6 00411423 8be5            mov     esp,ebp
    6 00411425 5d              pop     ebp
    6 00411426 c3