3

在地址 10134CE0 我有

10134CE0 - 40 - inc eax

我怎么能改变它(希望使用 C++ WriteProcessMemory)来实现它

dec eax

我知道 40 的意思inc eax和 48 的意思dec eax,但我怎么能把 40 变成 48?

4

3 回答 3

4

首先,如果这是代码并且是您程序的一部分,您应该确保该段对您是可写的。否则,您无法动态修补您的代码。

如果是这样,那么以下将在 C 中解决问题(C++ 可能会受益于使用更漂亮的static_cast<>):

uint8_t *code = (uint8_t*)0x10134ce0;
*code = 0x48;

第一行声明了一个指针,并为它分配了代码的地址。然后在第二行中,您使用此指针覆盖原始指令。

如果您正在考虑修补 x86 代码,请注意,仅仅这样做是不够的。x86 是压缩指令集,操作可能有不同的长度。在这种情况下,用另一条指令覆盖一条指令可能很困难,因为新指令可能更长,因此您将覆盖一条或多条您不想修补的指令。

对于这种情况,您需要反汇编原始代码并重新组装您使用的新实例,而不是旧代码。为此,我喜欢使用udis86作为反汇编程序,并使用AsmJit 动态创建新代码。

于 2012-08-03T22:00:13.133 回答
1

使用WriteProcessMemory(如果适用):

uint8_t buffer;
BOOL ok

buffer = 0x48;
ok = WriteProcessMemory(<handle of the process>, 0x10134CE0, &buffer, 1, NULL);

但是问题是你是否应该写入另一个进程的内存,如果这是你正在做的事情,即使你有权限。

于 2012-08-03T22:05:48.903 回答
1

如果您要问的只是“我如何在内存位置 0x10134CE0 写入字节 0x48”,那就是:

*(char *)0x10134CE0 = 0x48

在另一个进程的内存空间中做同样的事情看起来像这样:

char val = 0x48;
BOOL success = WriteProcessMemory(target, 0x10134CE0, &val, 1, NULL);

大概你想做的不仅仅是这个,但你还没有解释“更多”是什么,这会让任何人都很难回答。BjoemD 在读懂你的思想方面做了一些勇敢的尝试。如果他成功了,那就太好了。如果没有,请告诉我们您还需要什么。

于 2012-08-04T00:53:53.503 回答