首页 > 解决方案 > 如何在知道偏移量的情况下使用 C++ 更改 ADD EAX 上的值

问题描述

所以我有这个:

Offset 0x007FF77D is ADD EAX, 0x1F7

我想用 C++ 将 0x1F7 更改为 0x1F8,类似于

*(BYTE*)(0x007FF77F) = 0x1F8

但据我所知,这不仅仅是 (0x007FF77F),我还需要添加 + 1、+ 2 等内容。我显然不是专家,所以我不知道应该是什么。

标签: assemblyx86machine-code

解决方案


在 x86 机器代码中,如果有立即数,它总是最后一个或多个字节,在 modrm + 可选 disp8/disp32 之后。


指令的最后 4 个字节是 32 位立即数,采用本机字节序,因此您可以0x1f8int32_t.

0x1f8不适合单个字节。

幸运的是,原始值对于单个字节来说也太大了,所以我们知道它使用的是 32 位立即数。

您没有显示足够的信息来判断它是使用add eax,imm32没有 ModR/M 字节的短格式,还是使用add r/m32, imm32长 1 个字节的编码。请参阅http://felixcloutier.com/x86/ADD.html了解05 id(EAX 短格式)与81 /0 id(通用格式),其中id= 立即双字。

它很可能是 EAX 短格式:汇编程序通常选择最短的编码。但是如果没有看到问题中的原始机器代码,我不能给你一个有保证的答案。就像+1,但可能是+2。或者 + 更多,如果有一些你的反汇编没有显示的前缀。

但无论如何,立即数仍然是指令的最后 4 个字节。


推荐阅读