我正在尝试实现“ 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/