assembly - 如何在知道偏移量的情况下使用 C++ 更改 ADD EAX 上的值
问题描述
所以我有这个:
Offset 0x007FF77D is ADD EAX, 0x1F7
我想用 C++ 将 0x1F7 更改为 0x1F8,类似于
*(BYTE*)(0x007FF77F) = 0x1F8
但据我所知,这不仅仅是 (0x007FF77F),我还需要添加 + 1、+ 2 等内容。我显然不是专家,所以我不知道应该是什么。
解决方案
在 x86 机器代码中,如果有立即数,它总是最后一个或多个字节,在 modrm + 可选 disp8/disp32 之后。
指令的最后 4 个字节是 32 位立即数,采用本机字节序,因此您可以0x1f8
从int32_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 个字节。
推荐阅读
- javascript - 如何在javascript中检索单引号单词形式的句子?
- python - 如何将排列的输出放入列表中
- javascript - 尽管使用加载事件加载了第三方脚本,但 PageSpeed 得分没有提高
- postgresql - 如何设置我的 Web 应用程序数据库以在另一台机器上使用 postgres 数据库?
- php - 我将如何创建一个返回数组下一级的函数?
- tomcat - Redisson Tomcat 会话复制唯一 JSESSIONID
- networking - 使用 scapy 回复传入的数据包
- omnet++ - $ParameterName 定义的 INET sink 节点的位置未更新
- neo4j - Neo4j 企业 4.2.9 中未处理的非特定错误
- r - 将多列中的列值更改为 R 中的 NA