无需重编译:修改ELF可执行文件静态字节数组的方案探讨
解决方案:无需重编译修改自解压程序的压缩数据
方案一:占位符替换法
- 预先在自解压程序源码里定义固定大小的占位符数组,比如:
// 预设足够大的占位空间,比如10MB,用固定字节填充便于识别 const unsigned char compressedData[10*1024*1024] = {0xAA, 0xAA, ...}; const size_t uncompressedSize = 0; // 初始占位值 - 编译完成后,直接在二进制文件中扫描这段固定填充字节的连续区域,以及
uncompressedSize的存储位置。 - 实际生成自解压文件时,将压缩后的真实数据覆盖到占位符区域,同时更新
uncompressedSize的数值。注意必须保证真实数据大小不超过预设的占位容量,避免破坏程序其他内容。
方案二:自定义可扩展段(优化版)
- 编译自解压程序时,通过链接脚本创建一个可写且放在程序末尾的自定义段(例如命名为
.compressed_data),将compressedData和uncompressedSize都放到这个段内。 - 使用LIEF修改时只需处理该自定义段:
- 定位到自定义段,调整其
size和virtual_size字段以容纳新的压缩数据。 - 将真实压缩数据写入段内容区域,同步更新
uncompressedSize的值。 - 由于段位于程序末尾,扩展时无需调整其他段的地址和偏移,操作复杂度大幅降低。
- 定位到自定义段,调整其
简化实现的小技巧
- 在占位符开头添加特殊标记(比如
0xDEADBEEF),无需硬编码偏移,直接扫描二进制文件即可定位占位区域。 - 将
uncompressedSize放在标记位后的固定偏移位置,方便快速找到并修改。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

