在地址 10134CE0 我有
10134CE0 - 40 - inc eax
我怎么能改变它(希望使用 C++ WriteProcessMemory
)来实现它
dec eax
我知道 40 的意思inc eax
和 48 的意思dec eax
,但我怎么能把 40 变成 48?
在地址 10134CE0 我有
10134CE0 - 40 - inc eax
我怎么能改变它(希望使用 C++ WriteProcessMemory
)来实现它
dec eax
我知道 40 的意思inc eax
和 48 的意思dec eax
,但我怎么能把 40 变成 48?
首先,如果这是代码并且是您程序的一部分,您应该确保该段对您是可写的。否则,您无法动态修补您的代码。
如果是这样,那么以下将在 C 中解决问题(C++ 可能会受益于使用更漂亮的static_cast<>
):
uint8_t *code = (uint8_t*)0x10134ce0;
*code = 0x48;
第一行声明了一个指针,并为它分配了代码的地址。然后在第二行中,您使用此指针覆盖原始指令。
如果您正在考虑修补 x86 代码,请注意,仅仅这样做是不够的。x86 是压缩指令集,操作可能有不同的长度。在这种情况下,用另一条指令覆盖一条指令可能很困难,因为新指令可能更长,因此您将覆盖一条或多条您不想修补的指令。
对于这种情况,您需要反汇编原始代码并重新组装您使用的新实例,而不是旧代码。为此,我喜欢使用udis86作为反汇编程序,并使用AsmJit 动态创建新代码。
使用WriteProcessMemory
(如果适用):
uint8_t buffer;
BOOL ok
buffer = 0x48;
ok = WriteProcessMemory(<handle of the process>, 0x10134CE0, &buffer, 1, NULL);
但是问题是你是否应该写入另一个进程的内存,如果这是你正在做的事情,即使你有权限。
如果您要问的只是“我如何在内存位置 0x10134CE0 写入字节 0x48”,那就是:
*(char *)0x10134CE0 = 0x48
在另一个进程的内存空间中做同样的事情看起来像这样:
char val = 0x48;
BOOL success = WriteProcessMemory(target, 0x10134CE0, &val, 1, NULL);
大概你想做的不仅仅是这个,但你还没有解释“更多”是什么,这会让任何人都很难回答。BjoemD 在读懂你的思想方面做了一些勇敢的尝试。如果他成功了,那就太好了。如果没有,请告诉我们您还需要什么。