我最近在用c ++编写Process memory时遇到了一个非常讨厌的问题......我无法写入具有多个偏移的进程内存!即使有成千上万的页面解释你如何解决这个问题,它似乎仍然不适合我。我一整天都在谷歌上搜索,并找到了很多如何解决这个问题的例子,但它似乎对我不起作用。
所以,让我首先解释一下我自己是如何编写处理内存的,然后你可能会纠正它。
我们假设我有一个基地址:0x04AF3C94
第一个偏移为:0x1C
第二个偏移量为:0x20
第三个:0x568
第四名为:0x134
我自己如何做到这一点:
DWORD offset1 = 0x1C;
DWORD offset2 = 0x20;
DWORD offset3 = 0x568;
DWORD offset4 = 0x134;
DWORD base = 0x04AF3C94;
DWORD pointer;
DWORD pointer2;
DWORD pointer3;
DWORD pointer4;
DWORD pointer5;
ReadProcessMemory(handle, LPVOID(base), &pointer, sizeof(pointer), 0);
ReadProcessMemory(handle, LPVOID(pointer + offset1), &pointer2, sizeof(pointer2), 0);
ReadProcessMemory(handle, LPVOID(pointer2 + offset2), &pointer3, sizeof(pointer3), 0);
ReadProcessMemory(handle, LPVOID(pointer3 + offset3), &pointer4, sizeof(pointer4), 0);
ReadProcessMemory(handle, LPVOID(pointer4 + offset4), &pointer5, sizeof(pointer4), 0);
int value = 500;
WriteProcessMemory(handle, LPVOID(pointer5), &value, sizeof(value), 0);
正如你所看到的,如果我有4个偏移量,例如在这个例子中,我将每个偏移量一次添加到基地址,直到我得到一个值来存储添加到baseaddress的每个偏移量。 这显然不起作用,我该怎么做!?
答案 0 :(得分:0)
我无法使用您的描述回复所有人,但在MSDN中,他们说ReadProcessMemory从请求到给定缓冲区的地方读取内存。这意味着当你打电话......
if(!empty($exploded_val[5])){//doAction}
...你的"指针"将充满"基地"地址。因此它将包含一个地址,该地址是数字地址为地址" base"的四个字节的值。这可能不是你想要的,因为如果你之前没有存储过某些东西,它就是不确定的。如果是这样,当你使用"指针"。
时,它可能会崩溃如果你想阅读adresse" base + offset1"有了这个功能,你需要做的是:
ReadProcessMemory(handle, LPVOID(base), &pointer, sizeof(pointer), 0);
如果some_buffer是一个有效的缓冲区,你必须在某处声明。