问题是这样的:我写 一个数组,然后通过NEW分配一个内存地址。在OD中查看发现,数组的起始地址是通过ESP来计算的。现在我想通过另一个自己编的程序来获取这个ESP值,发现获取失败,代码如下:
void CGetEspDlg::OnBnClickedButton1()
{
HWND hWnd = NULL; 定义的窗口句柄
DWORD processid = NULL;
HANDLE hProcess = NULL;
DWORD writeRealSize = NULL;
CONTEXT ct;
BOOL b;
DWORD m;
ct.ContextFlags = CONTEXT_ALL;
hWnd =::FindWindow(NULL,_T(Caption));
if (hWnd != NULL)
{
::GetWindowThreadProcessId(hWnd,&processid); //获取线程的ID
if (processid != NULL)
{
hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,false,processid);//获取线程的句柄
m = SuspendThread(hProcess); //问题处在这里:暂停线程失败,
b = GetThreadContext(hProcess,&ct); //无法获得寄存器的内容。返回值是-1,寄存器内容全是0
if(b != 0)
{
AfxMessageBox(_T("获取ESP,EBP成功"));
m_Int = ct.Ebp;
UpdateData(FALSE);
}
else
{
AfxMessageBox(_T("获取ESP,EBP失败"));
}