为了说明我的意思,请参见以下屏幕截图:
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