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的主要内容,如果未能解决你的问题,请参考以下文章

GetThreadContext和SetThreadContext

EBP寄存器存着啥东西,跟函数返回有啥联系啊

第15课 缔造程序兼容的合约(下)

把汇编代码转化成C代码

使用gdb查看栈帧的情况, 没有ebp

Protostar——stack0