az1981cn 发表于 2022-12-7 22:44

如何修改EXE文件的数组初始化数值?

本帖最后由 az1981cn 于 2022-12-9 11:45 编辑

各位大佬,我有一个MFC程序,我自己写的,源代码也有,里面使用了一个大的初始化数组,大概有512字节。
为了不重新编译程序而修改初始化数组的值,我在源代码里面将数组的所有值初始化为0xAA,之后希望使用二进制编辑软件(如winhex)打开exe文件可以直接找到0xAA的大数组位置从而修改。

目前遇到了一个问题,就是用winhex打开exe文件后,找不到大块的0xAA位置,难道这种方法不行吗?求指导和交流,谢谢。

submariner 发表于 2022-12-7 23:12

应该可以,不过你得注意,如果你的数据类型是单字节,应该有大片的数据,如果是其它类型,你得考虑数据在计算机中的表示方法

popdes 发表于 2022-12-8 00:09

你可以0xAA生成exe一次,0x55生成一次exe,然后用hex对比工具找下哪一块是不同的,然后你懂的

无闻无问 发表于 2022-12-8 06:54

兄弟,数组初始化存储应该是栈吧,怕是找不到哟

ssjjtt 发表于 2022-12-8 08:22

这咋搞,数据多得怎么处理

cloud2010 发表于 2022-12-8 08:25



先用个简单的代码试下,一条赋值语句一条输出语句,试试能不能成功。

wihn 发表于 2022-12-8 09:43

在程序运行之前数组里面不是0xAA,因为程序还没运行,数组没有初始化,这个时候你去找0xAA是找不到的。如果用静态数组,在声明时初始化,应该可以找到。

songwei1984 发表于 2022-12-8 11:31

popdes 发表于 2022-12-8 00:09
你可以0xAA生成exe一次,0x55生成一次exe,然后用hex对比工具找下哪一块是不同的,然后你懂的

这位老哥的方法应该可以。

爱飞的猫 发表于 2022-12-8 23:59

> 我在源代码里面将数组的所有值初始化为0xAA

要这种写法才行:

```c
char g_data[] = {0xAA,0xAA,0xAA,0xAA, ...}
```

如果你是这种写法就不行:

```c
char g_data;

int main() {
memset(g_data, sizeof(g_data), 0xaa);
}
```

没看到你的代码,不知道你是怎么实现的。

如果你是希望调试阶段能够读取不同的数据,可以使用外部文件,并使用宏来控制只在调试阶段填充:

```cpp
#if !NDEBUG
{
std::ifstream ifs(L"C:\\我的文件", std::ios::binary);
ifs.read((char*)g_data, sizeof(g_data));
}
#endif
```

az1981cn 发表于 2022-12-9 11:42

谢谢楼上所有大佬的回复,谢谢9楼的代码,谢谢3楼的灵巧方法。我已经测试成功了,这几天把PE文件的结构也学习了一遍,发现这种方式可行。

需要注意的就是9楼提醒的,数组必须全部初始化,不能简化方式初始化。
另外使用3楼的方法,大大加速了寻找数据的位置,但是需要注意两次编译时仅可以修改数组初始化值,如果修改了程序即使还原回来,编译的代码也会有所不同(最好增量编译)。

这种方法得到的exe文件和重新编译后得到的exe文件基本完全相同,唯一不同的是文件的时间标签区别,但是这个标签完全不影响程序运行。

页: [1]
查看完整版本: 如何修改EXE文件的数组初始化数值?