我想要实现“Win32 EXE动态分支”的已知方法,也称为RunPE。
我的问题是,我无法像在http://www.security.org.sg/code/loadexe.html的第3点中提到的那样获得“基地址”的正确结果。
这是我的代码:
这是我的代码:
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);
输出如下:
EBX [PEB] 为: 0x7FFD4000
基地址为: 0x7FFD4020
入口点为: 0x00401000
我认为我的问题出在 baseAddress 指针的实现上,但我无法确定具体是什么问题。或者可能是我没有正确理解上述文章中的 baseAddress 并不是 ImageBase,如果是这样,那么 baseAddress 是什么?
我已尝试在 Win 7 64b 和 Win-XP 下运行它,但两者都得到了相同的错误结果。
((DWORD *)anything)
是一个指针,当你将一个指针和一个整数相加时,编译器总是将整数乘以所指向元素的大小,而在这种情况下,所指向的元素是大小为4的DWORD
。*(contx.Ebx+8)
不能使用指针来完成,因为你想要的数据位于另一个进程的虚拟地址空间中。 - Adam Rosenfield