我正在尝试实现“Win32 EXE 的动态 fork ”的已知方法,它被称为 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);
输出如下:
The EBX [PEB] is: 0x7FFD4000
The base address is: 0x7FFD4020
The Entry Point is: 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/