Windows EXE/DLL:啥是“打包映像”

Posted

技术标签:

【中文标题】Windows EXE/DLL:啥是“打包映像”【英文标题】:Windows EXE/DLL: what is a "packed image"Windows EXE/DLL:什么是“打包映像” 【发布时间】:2016-02-17 03:37:46 【问题描述】:

Process Explorer 有时将 EXE 显示为“打包的图像”,但这是什么意思。

我发现:使用 /ZI 选项编译 exe(使用 Visual C++ 2010)会生成打包图像,但 /Zi 不会。为什么会有这样的差异?

顺便说一句:使用/ZI 编译的 DLL 也被视为“打包映像”并标记为紫色。

【问题讨论】:

阅读 Visual Studio 文档:/Z7, /Zi, /ZI (Debug Information Format),另请参阅 Understanding Process Explorer。 但是那个 MSDN 页面没有说明“打包的图像”;并且该 howtogeek 页面也没有说明 /Zx 编译器选项。 在执行之前必须将其代码解压缩到内存中的文件。恶意软件的常见迹​​象。 forum.sysinternals.com/packed-images_topic442.html 通过一些启发式分析检测到打包的图像,因此各种/Z 选项产生的字节可能会被Process Explorer 的分析器所抛弃。 【参考方案1】:

“打包映像”是一种压缩可执行代码以使文件更小的映像。典型的文件大小减少徘徊在 50% 左右。它在运行时使用“加载器”在开始执行之前将数据解压缩回可执行代码。在过去磁盘存储容量和网络带宽有限的情况下,它很有用。

在 TB 级磁盘和兆位网络的今天,这是一种异味,打包也可以用来隐藏恶意代码。当然是 Process Explorer 颜色不同的原因。

PE 用于检测包装的确切启发式方法没有记录。当然不是,那样会很容易被规避。这不是微不足道的,没有标准的方法来实现打包。粗略地说,它会查看可执行文件中的部分,并在其中太多看起来像不可执行代码时引发蓝旗。

是的,当您使用 /ZI 时,就会有很多。更重要的是链接器的 /INCREMENTAL 选项,它在您使用 /ZI 时自动打开。它允许您在调试时编写代码,即 Edit+Continue 选项。并快速重新链接可执行文件,而无需链接器完全重新生成文件。这仅在可执行文件中有大量空白空间可用于添加新机器代码字节时才有效。那是蓝旗。

当然,这不是一个真正的问题,您的用户只会看到您程序的发布版本。它是在没有 /ZI 和 /INCREMENTAL 的情况下构建的。

【讨论】:

感谢您的信息,这听起来很合理。我检查了 /ZI 输出和 /Zi 输出的 .text 部分。二进制文件的内容看起来很不一样,.text 的大小是 142598 vs 136722,我认为其中大部分是来自 LIBCMT.lib 的代码。只是仍然很难想象为什么这会成为蓝旗。 Process Explorer 可能不会公开如何识别打包图像,但 Process Hacker 会如您在我的回答中看到的那样【参考方案2】:

来自Process Hacker source code:

如果满足以下条件,则打包图像:

    它引用的模块少于 3 个,并且 它导入的函数少于 5 个,并且 它不使用 Native 子系统。

或者:

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

或者:

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

或者:

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

如果一张图片只有一个导入自 一个名为“mscoree.dll”的模块。

您还可以查看源代码以了解如何确定图像是否可能已打包。

【讨论】:

【参考方案3】:

打包图像(紫色)——这些进程可能包含隐藏在其中的压缩代码,或者至少 Process Explorer 认为它们是通过使用启发式算法来实现的。如果您看到紫色进程,请务必扫描恶意软件!

【讨论】:

以上是关于Windows EXE/DLL:啥是“打包映像”的主要内容,如果未能解决你的问题,请参考以下文章

windows下安装mosquitto

给Delphi程序添加版本信息(EXE和Dll)

给Delphi程序添加版本信息(EXE和Dll)

PE病毒初探——向exe注入代码

LIB和DLL的引用

在 Windows 7 事件日志中,啥是“源”?