谁在 Windows 中构建进程创建堆栈?

逆向工程 视窗 x86 堆栈变量
2021-06-25 10:28:43

当我notepad.exe在 Windows XP 中使用 ollydbg 时,初始寄存器是esp:7FFC4ebp:7FFF0

stack

...
0007FFC4  7C817067  kernel32.7C817067 <--- ESP
0007FFC8  7C940208  ntdll.7C940208
0007FFCC  FFFFFFFF
0007FFD0  7FFDB000
0007FFD4  80546BFD
0007FFD8  0007FFC8
0007FFDC  81D22DA8
0007FFE0  FFFFFFFF                    <--- EBP
0007FFE4  7C839AC0  kernel32.7C839AC0
0007FFE8  7C817070  kernel32.7C817070
0007FFEC  00000000
0007FFF0  00000000
0007FFF4  00000000
0007FFF8  0100739D notepad.<ModuleEntryPoint>
0007FFFC  00000000
...

我首先猜测初始堆栈是空的,但是通过 process 参数(例如, argc, argv),我认为它可以有一些值。

  1. EBP之间的初始堆栈是什么意思ESP
  2. 运行时堆栈ESP可以低于7FFE0(超过作为值)notepad.exe换句话说,esp 可以指向0007FFF8?
2个回答

有关堆栈堆栈帧的信息,请访问这两个网页

EBP和ESP之间的初始堆栈是什么意思?

EBPESP结合使用以创建堆栈帧。为了允许执行环境中存在许多未知因素,函数经常设置有“堆栈框架”以允许访问函数参数和自动函数变量。堆栈帧背后的想法是,每个子例程都可以独立于其在堆栈中的位置而起作用,并且每个子例程都可以像在堆栈顶部一样起作用。

notepad.exe 运行时堆栈 ESP 可以低于 7FFE0(超过作为值)?换句话说,esp 可以指向 0007FFF8 吗?

ESP是一个简单的 x86 寄存器,就像任何其他寄存器一样。所以它可以像其他一样以相同的方式进行修改。如果你写一个像sub esp, 100then这样的命令ESP会被修改,确实ESP可以有一个低于 7FFE0 的值。ESPOllydbg显示的值是应用程序在其入口点的时间。在此之前,会发生大量修改堆栈的操作。所以肯定,ESP可以有比这更低的价值。

RtlCreateUserStack()在线程创建时创建堆栈(并且每个进程都有主线程)。或者更一般地说:Windows PE 加载器。什么是PE加载器?从磁盘上的可执行文件创建进程的东西(或者在 DLL 的情况下将该可执行文件添加到进程中)

您的另一个问题是为什么在 Olly 休息时,堆栈中已经有值了。
那是因为您的main()入口点不是将在流程中执行的第一件事。main()有很多内部 CRT 设置之前,甚至可能设置全局类,...

但即使在您的可执行文件的任何代码被执行之前,DLL 仍然需要对它们自己进行一些初始化。

当您使用 OllyDbg 时,转到Options-> Debugging->Start并尝试使用它以了解在您的代码运行之前需要做什么。