每当我在Windows 7 64位计算机上的OllyDbg v1.10中附加进程时,我都会注意到堆栈上第一个保存的EBP并不指向堆栈的最底层。相反,它指向它之前的16个字节。

为了说明我的意思,请参见以下屏幕截图:


EBP(以灰色突出显示)是在RETURN to ntdll.76FC9F45的正上方,指向1B05FFEC。请注意,此地址以EC而不是FC结尾。

问题1:为什么EBP不能指向1B05FFFC

问题2:前16个字节是做什么的

问题3:对于Windows操作系统,StackBase和第一个EBP指向的地址之间的字节数(16)是否固定?

#1 楼


问题1:为什么EBP不能指向1B05FFFC


因为1B05FFFC不是堆栈帧的基址。 OllyDbg在堆栈视图中显示1B05FFFC作为最后一个地址的唯一原因是它是堆栈的内存页面中最后一个DWORD的地址。


问题2:前16个是做什么的


取决于调试器。

例如,从我有限的测试中...

在Windows 7 x64上将WinDbg附加到32位EXE时,[ESP]是从对ntdll!DbgUiRemoteBreakin的调用返回到ntdll!DbgBreakPoint的返回地址。

在Windows上将OllyDbg v2.01附加到32位EXE时在7 x64或Windows 7 x86上,调试器将调试对象挂起在正在执行的被调试线程的中间,因此ESP的值等于被OllyDbg连接到被调试对象时被调试线程中ESP的值。

评论


嗯,这很奇怪……因为下面的代码片段应该返回堆栈的基础,对吗? NtQueryInformationThread(remoteThread,(THREADINFOCLASS)0,&tbi,sizeof(THREAD_BASIC_INFORMATION),&bytes_read);如果(bytes_read!= sizeof(THREAD_BASIC_INFORMATION))返回1; NT_TIB * teb =(NT_TIB *)tbi.TebBaseAddress; stackBase =(DWORD)teb-> StackBase; teb-> stackBase实际上以FF结尾,而不是EF。

–本尼
2014-02-17 18:59



在对Question2的回答中,您提到16字节取决于调试器。但是,我使用了先前注释中摘录的代码来获取堆栈基地址。然后,我使用memcpy从DSO读取DWORD之后的DWORD,从头到尾,并且开头的那16个字节仍然存在。

–本尼
2014-2-17在20:02

线程信息块的StackBase和StackLimit引用为线程的初始堆栈空间保留的内存(请参阅doxygen.reactos.org/de/dbc/…)。 EBP(通常)指向当前函数的堆栈框架的底部;它没有指向为线程的初始堆栈空间保留的内存的基础。

–詹森·格夫纳(Jason Geffner)
14年2月18日在0:28

感谢Jason Geffner的见解。为了完整起见,您还可以回答以下问题吗?问题3:对于Windows操作系统,StackBase与第一个EBP指向的地址之间的字节数(16)是否固定?我将在上面编辑我的问题,以包括问题3。

–本尼
2014年2月18日在7:14