GetThreadContext 返回 EBP = 0
Posted
技术标签:
【中文标题】GetThreadContext 返回 EBP = 0【英文标题】:GetThreadContext returns EBP = 0 【发布时间】:2011-11-18 00:22:02 【问题描述】:我正在尝试在 windows7 64 位上获取另一个进程的 EBP 寄存器的值。 为此,我正在使用 GetThreadContext,如下所示:
static CONTEXT threadContext;
memset(&threadContext, 0, sizeof(CONTEXT));
threadContext.ContextFlags = CONTEXT_FULL;
bool contextOk = GetThreadContext(threadHandle, &threadContext);
EIP 值似乎没问题,但 EBP = 0。 我也尝试使用 WOW64_GetThreadContext 但它没有帮助...... GetLastError() 返回 0 所以应该没问题。 我确实使用 SuspendThread 暂停了该线程,并且每次对线程进行采样时都不会发生这种情况。
这是什么原因造成的?
【问题讨论】:
您知道“您无法为正在运行的线程获取有效的上下文。在调用GetThreadContext
之前,请使用SuspendThread
函数挂起线程。”? MSDN
既然你已经暂停了进程(或者至少是线程),也许你可以给它附加一个真正的调试器,看看它说EBP是什么。
我刚刚尝试过,但显然 VS express 无法附加到暂停或已调试的进程:/
【参考方案1】:
一个可能的原因是寄存器的值在您检查时确实为零。它是一个通用寄存器,因此程序可以将它设置为它想要的任何值。
【讨论】:
不应该保存函数的开头吗? 在 x86 上,(基本上)有两种栈帧布局:EBP 帧和 FPO 帧。在一个 EBP 帧中,EBP 指向前一个 EBP,EBP+4 指向返回地址,EBP+8 指向第一个堆栈传递的参数。在 FPO 帧中,EBP 不用作“帧指针”,而是用作通用寄存器。所以,这真的取决于目标函数。 但是我从中读取线程上下文的项目没有使用“省略帧指针”优化。 您不知道将冻结线程上下文的确切位置。当然不能保证执行该项目的代码。也可以是 Windows 代码。以上是关于GetThreadContext 返回 EBP = 0的主要内容,如果未能解决你的问题,请参考以下文章