【问题标题】:Reuse of characters in compiled .exe file重用已编译 .exe 文件中的字符
【发布时间】:2016-05-09 07:11:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c binary dos elf


    【解决方案1】:

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

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

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

    【讨论】:

    • 同样,“SOFT”和“DISK, INC”之间有两个额外的字节——这也是字节压缩的典型指示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多