Windows EXE/DLL: 什么是“packed image”?

12

Process Explorer有时会将EXE标记为“packed image”,但这是什么意思呢。

我所了解的是:使用/ZI选项编译exe(使用Visual C++ 2010)会导致打包图像,但/Zi则不会。 为什么会有这样的差异呢?

顺便说一句:使用/ZI编译的DLL也被认为是“packed image”并标记为紫色。

enter image description here


阅读Visual Studio文档:/Z7,/Zi,/ZI(调试信息格式),并查看了解Process Explorer - Remy Lebeau
但是那个MSDN页面并没有提到“压缩图像”,而那个howtogeek页面也没有提到/Zx编译器选项。 - Jimm Chen
需要在执行之前将其代码解压到内存中的文件。这是恶意软件的常见标志。http://forum.sysinternals.com/packed-images_topic442.html - Ryan Bemrose
一些启发式分析可以检测到压缩图像,因此各种/Z选项生成的字节可能会干扰Process Explorer的分析器。 - Remy Lebeau
3个回答

14

“压缩图像”是指将可执行代码进行压缩,以达到减小文件大小的目的。典型的文件大小减小幅度约为50%。它使用“加载器”在运行时将数据解压回可执行代码,然后开始执行。在存储容量有限和网络带宽有限的旧时代非常有用。

如今,随着拥有千兆字节磁盘和兆比特网络,这种方法已经过时了,压缩还可能被利用来隐藏恶意代码。这也是Process Explorer将其标记为不同颜色的原因。

PE用于检测打包的确切启发式算法未经记录。当然没有,否则绕过它就太容易了。这并不简单,没有标准的打包实现方法。大致上看一下可执行文件中的部分内容,当太多部分看起来像非可执行代码时,则会引发蓝色警报。

当你使用/ZI时,确实会有很多问题。更重要的是链接器的/INCREMENTAL选项,在使用/ZI时自动打开。这允许您在调试时编写代码,使用编辑+继续选项快速重新链接可执行文件,而无需完全重新生成文件。这只有在可执行文件中有大量空白空间可用于添加新的机器代码字节时才能起作用。这是一个蓝色警报。

当然,并不是真正关心的问题,您的用户只会看到程序的发布版本。这是没有使用/ZI和/INCREMENTAL编译的版本。


谢谢您提供的信息,听起来很有道理。我检查了 /ZI 输出和 /Zi 输出的 .text 部分。二进制内容看起来非常不同,.text 的大小为 142598 vs 136722,我认为其中大部分是来自 LIBCMT.lib 的代码。只是仍然难以想象为什么会导致蓝屏。 - Jimm Chen
Process Explorer可能不会公开如何识别打包图像,但是正如您在我的答案中所看到的那样,Process Hacker可以做到。 - Bruno Zell

5
Process Hacker源代码

图像被打包如果:

  1. 它引用少于3个模块,并且
  2. 它导入少于5个函数,并且
  3. 它不使用本地子系统。

或者:

  1. 功能到模块比率低于3(平均每个模块导入的函数少于3个),并且
  2. 它引用超过2个但少于6个模块。

或者:

  1. 功能到模块比率低于2(平均每个模块导入的函数少于2个),并且
  2. 它引用超过5个但少于31个模块。

或者:

  1. 它没有名为“.text”的部分。

如果只有一个来自名为“mscoree.dll”的模块的导入,则不认为该图像被打包。

您还可以查看源代码,以确定图像是否可能已打包或未打包。


0
紧凑图像(紫色)- 这些进程可能包含隐藏的压缩代码,或者至少Process Explorer通过使用启发式算法认为它们包含压缩代码。如果您看到紫色进程,请确保进行恶意软件扫描!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接