吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1089|回复: 9
上一主题 下一主题
收起左侧

[已解决] 如何修改EXE文件的数组初始化数值?

[复制链接]
跳转到指定楼层
楼主
az1981cn 发表于 2022-12-7 22:44 回帖奖励
本帖最后由 az1981cn 于 2022-12-9 11:45 编辑

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

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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
submariner 发表于 2022-12-7 23:12
应该可以,不过你得注意,如果你的数据类型是单字节,应该有大片的数据,如果是其它类型,你得考虑数据在计算机中的表示方法
3#
popdes 发表于 2022-12-8 00:09
你可以0xAA生成exe一次,0x55生成一次exe,然后用hex对比工具找下哪一块是不同的,然后你懂的

免费评分

参与人数 1热心值 +1 收起 理由
az1981cn + 1 热心回复!

查看全部评分

4#
无闻无问 发表于 2022-12-8 06:54
兄弟,数组初始化存储应该是栈吧,怕是找不到哟
5#
ssjjtt 发表于 2022-12-8 08:22
这咋搞,数据多得怎么处理
6#
cloud2010 发表于 2022-12-8 08:25


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

7#
wihn 发表于 2022-12-8 09:43
在程序运行之前数组里面不是0xAA,因为程序还没运行,数组没有初始化,这个时候你去找0xAA是找不到的。如果用静态数组,在声明时初始化,应该可以找到。
8#
songwei1984 发表于 2022-12-8 11:31
popdes 发表于 2022-12-8 00:09
你可以0xAA生成exe一次,0x55生成一次exe,然后用hex对比工具找下哪一块是不同的,然后你懂的

这位老哥的方法应该可以。
9#
爱飞的猫 发表于 2022-12-8 23:59

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

要这种写法才行:

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

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

char g_data[100];

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

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

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

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

免费评分

参与人数 1吾爱币 +1 收起 理由
az1981cn + 1 热心回复!

查看全部评分

10#
 楼主| az1981cn 发表于 2022-12-9 11:42 |楼主
谢谢楼上所有大佬的回复,谢谢9楼的代码,谢谢3楼的灵巧方法。我已经测试成功了,这几天把PE文件的结构也学习了一遍,发现这种方式可行。

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

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

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表