重新使用已编译的.exe文件中的字符

时间:2016-01-31 22:25:17

标签: c binary dos elf

很久以前,出于好奇,我尝试了十六进制编辑游戏的可执行文件" Dangerous Dave"。 我查看了文件中找到的任何字符串,并进行了一些随机编辑,看看它是否真的会改变游戏中显示的文字。

我很惊讶地看到了结果,我现在使用十六进制编辑器和DOSBox重新创建了结果: enter image description here

可以看出,编辑两个字符" RO"在字符串" ROMERO"导致4个字符被更改,结果变为" ZUMEZU"。似乎程序正在重用这两个字符并在该字符串的开头和结尾打印它们。

这是什么原因?我的第一个猜测是尝试使可执行文件变小,但只是重用字符的代码可能需要比保存的2个字节更多的空间。 这只是作者完成的技巧,还是只是一些编译器的巫术?

1 个答案:

答案 0 :(得分:5)

Tricky肯定地说没有逆向工程,但我的猜测是程序中的很多常量数据是使用LZ family中的算法压缩的。这些压缩方案基本上以您观察到的方式工作:它们将重复的子字符串编码为对先前已解码的文本的引用。

这些压缩算法可能不仅仅用于这一个字符串,而且不仅仅用于文本;它们很可能也用于压缩其他数据,例如图形或关卡布局。简而言之,使用此算法可能会节省大量资金!

这些压缩算法在旧游戏中的使用在节省磁盘空间方面很常见,但不是自动的 - 这个算法的实现很可能是Romero自己添加的。