gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:47:22 50 4
gpt4 key购买 nike

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

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com