C ++内存编辑 - 编辑汇编/写入字节

时间:2012-08-03 21:48:23

标签: c++ memory-management assembly byte

地址10134CE0我有

10134CE0 - 40 - inc eax

我怎样才能改变这一点(希望使用C ++,WriteProcessMemory)来实现它

dec eax

我知道40表示inc eax而48表示dec eax但是如何将40更改为48?

3 个答案:

答案 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做了一些勇敢的尝试来阅读你的思想。如果他成功了,那很好。如果没有,请告诉我们您还需要什么。