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