我正在尝试实现“ Win32 EXE动态分叉”的已知方法,该方法被称为RunPE。
我的问题是我无法得到“基地址”的正确结果,正如在http://www.security.org.sg/code/loadexe.html的第三点中提到的那样

这是我的代码:

DWORD* peb;
DWORD* baseAddress;
...snip...

GetThreadContext(hTarget, &contx)

peb = (DWORD *) contx.Ebx;
baseAddress = (DWORD *) contx.Ebx+8;

_tprintf(_T("The EBX [PEB] is: 0x%08X\nThe base address is: 0x%08X\nThe Entry Point is: 0x%08X\n"), peb, baseAddress, contx.Eax);


输出为follwos:


EBX [PEB]为:0x7FFD4000

基址是:0x7FFD4020

入口点是:0x00401000


我认为我的问题出在我baseAddress指针的实现上,但是我无法弄清楚到底是什么问题。或者可能是我没有正确理解以上文章,并且baseAddress不是ImageBase,如果是,baseAddress是什么?

我试图在Win 7 64b和Win-XP下运行它,但在这两者上我都得到相同的错误结果。

最佳答案

请注意,说明说“在[EBX + 8]”。括号表示该地址位置上的值。有几个问题

baseAddress = (DWORD *) contx.Ebx+8;


首先,编译器只注意括号而不是空格,因此这意味着

baseAddress = ((DWORD *)contx.Ebx) + 8;


这是错误的,因为8在计数DWORD,而不是字节。你要

baseAddress = (DWORD *)(contx.Ebx + 8);


但这只会为您提供baseAddress的存储地址,而不是baseAddress的值。为此,您需要

baseAddress = *(DWORD *)(contx.Ebx + 8);


但是,这仅在contx.Ebx引用您的进程中的地址时才有效,但是每个进程都有其自己的地址空间,并且您需要访问挂起的进程的地址空间。为此,您需要使用ReadProcessMemory(http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553%28v=vs.85%29.aspx):

ok = ReadProcessMemory(hTarget, (LPCVOID)(contx.Ebx + 8), (LPVOID)&baseAddress, sizeof baseAddress, NULL);

关于c - 通过CONTEXT.Ebx + 8指向baseAddress的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12808516/

10-09 08:56