c - 通过 CONTEXT.Ebx+8 指向 baseAddress 的指针

标签 c winapi pointers

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

相关文章:

c++ - 如何在 Win32 上使用 C++ 安装硬件驱动程序?

c++ - 如何使用 winhttp 获取请求 cookie?

c - 使用函数的免费双指针

结构数组的 C++ 选择排序

有人可以帮我确定 C 中 Seg 错误的原因以及 gdb 输出的含义吗?

C无法从函数中读取字符串数组

visual-studio - Visual C++ 命令行编译器 (CL.EXE) 重定向 OBJ 文件

c++ - 对指针及其地址感到困惑

c - 三个数组的并集、交集和差集

c - 传递字符数组的指针