在 PE 加载到内存后,根据 IMAGE_BASE 值(假设没有 ASLR 并且它始终相同)和段表来映射段。
我的问题,如何确定 EBP 值(我假设可以找到 EBP 的 ESP)。它可以是任何有效的内存地址,还是根据某些规则计算出来的?
在 PE 加载到内存后,根据 IMAGE_BASE 值(假设没有 ASLR 并且它始终相同)和段表来映射段。
我的问题,如何确定 EBP 值(我假设可以找到 EBP 的 ESP)。它可以是任何有效的内存地址,还是根据某些规则计算出来的?
在进程映射到内存之后,堆栈作为加载过程的一部分进行分配。它的保留大小在它可以放置在内存中的位置中发挥作用。堆栈的位置不是固定的,但当堆栈大小和过程映像基数为默认大小时,最终会以一个公共值结束。它只是内存分配函数的结果,它在内存中找到可以满足请求的最低位置。
由于堆栈向下增长,ESP 最初指向堆栈的顶部。当进程开始时,EBP 被保存在堆栈上,ESP 被移入 EBP,然后为存储在堆栈上的变量分配一些空间。因此,ESP 被设置为 EBP 的新值减去一些字节。字节数取决于 Windows 需要存储多少变量。该数量基本上是固定的,具体取决于 Windows 版本(不同版本的 Windows 需要不同数量的变量用于进程加载),但可以随时通过补丁更改,如果需要使用其他信息来启动过程。