有没有人可以建议二进制压缩算法?

Does anyone can suggest binary compression algorithm?

我正在做一个加壳器(运行一次压缩)来研究Windows PE格式文件。我知道一些数据压缩算法,如 RLE、LZW、Huffman-endoing 等。但是哪种算法最适合压缩二进制数据。就像.exe文件?有没有人可以建议哪种压缩二进制数据最好?

对于初学者,您应该从 LZ77 or LZ78 algorithm 开始,它提供了很好的压缩率和一个小的解压存根(显然,一个小的解压存根是打包程序的必备条件)。

LZ7x 算法之后是 LZMA 算法,它提供(通常)比 LZ7x 算法更好的压缩。

如果您以前从未写过加壳程序,我建议您主要使用 PIC (Position Independent Code) 风格的低级语言(C 是事实上的语言)编写解压存根需要时用汇编语言编写的一些小部分。这样做的好处是让编译器为您完成大部分矛盾的事情(至少第 1 点和第 2 点):

  1. 解压存根代码长度必须最小
  2. 解压存根代码的速度必须是最优的
  3. 压缩和解压缩的内存使用必须保持在合理的范围内

然后您可以根据您的方便调整输出程序集,以便在上述两点之间取得良好的 trade-off。


一旦你对压缩理论有了很好的理解,你应该明确地寻求实现一个 PAQ 派生的压缩器。

跟随 PAQ 领导有多个优势:

  • 在多个领域(文本、图像)被认为是最好的压缩器 和可执行的,尽管每次都有不同的建模上下文)。查看各种基准测试 here and here.

  • 它是开源的(并遵循 GPL 许可证)。

首先尝试特别关注 PAQ8PX 变体。不过,在生成的压缩 PE 文件中注入最小(长度)和快速解压存根将是这项工作中最困难的部分。

PAQ算法也用在了kkrunchy a well-known PE compressor by the farbrausch demoscene group. A quite good glimpse at its internals is explained here.


最后,如果您不熟悉数据压缩理论,我建议您首先阅读非常好的介绍 Data Compression Explained by Matt Mahoney (author of PAQ) and the wiki book about data compression theory

请记住,压缩始终是 trade-off:最佳压缩率并不总是 end-users 想要的。如果您需要 256 GB 内存或等待 5 分钟或有 10 MB 字节的解压存根来解压,这显然不是正确的路径...