C++ Windows EXE/DLL:什么是“a”;“压缩图像”;

C++ Windows EXE/DLL:什么是“a”;“压缩图像”;,c++,windows,process,C++,Windows,Process,Process Explorer有时会将EXE显示为“打包图像”,但这意味着什么 我发现:编译exe(使用Visual C++ 2010)用 /ZI/C> >选项会导致打包的图像,但是>ZI不会。为什么会有这样的差异 顺便说一句:用/ZI编译的DLL也被视为“压缩映像”,并标记为紫色 压缩图像是一种压缩可执行代码以使文件更小的图像。典型的文件大小缩减在50%左右。它在运行时使用“加载器”将数据解压回可执行代码,然后再开始执行。在磁盘存储容量和网络带宽有限的旧时代,它很有用 如今,对于TB级磁盘和

Process Explorer有时会将EXE显示为“打包图像”,但这意味着什么

我发现:编译exe(使用Visual C++ 2010)用<代码> /ZI/C> >选项会导致打包的图像,但是>ZI不会。为什么会有这样的差异

顺便说一句:用
/ZI
编译的DLL也被视为“压缩映像”,并标记为紫色

压缩图像是一种压缩可执行代码以使文件更小的图像。典型的文件大小缩减在50%左右。它在运行时使用“加载器”将数据解压回可执行代码,然后再开始执行。在磁盘存储容量和网络带宽有限的旧时代,它很有用

如今,对于TB级磁盘和兆比特网络来说,这是一种气味,包装也可以被用来隐藏恶意代码。当然,Process Explorer的颜色会有所不同的原因

PE用于检测包装的确切启发式方法没有记录。当然不是,这会使它很容易规避。这不是小事,没有标准的方法来实现包装。粗略地说,它会查看可执行文件中的部分,当太多的部分看起来像不可执行代码时,它会发出蓝色标志

是的,当你使用/ZI时,会有很多。更重要的是链接器的/INCREMENTAL选项,在使用/ZI时自动打开。它允许您在调试时编写代码,编辑+继续选项。并快速重新链接可执行文件,而无需链接器完全重新生成该文件。这只能在可执行文件中有大量空白空间(可用于添加新的机器代码字节)时工作。那是一面蓝旗

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

来自:

如果出现以下情况,则会打包图像:

  • 它引用的模块少于3个,并且
  • 它导入的函数少于5个,并且
  • 它不使用本机子系统
  • 或:

  • 功能与模块的比率低于3(平均每个模块导入的功能少于3个),并且
  • 它引用了2个以上的模块,但少于6个模块
  • 或:

  • 功能与模块的比率低于2(平均每个模块导入的功能少于2个),并且
  • 它引用了5个以上的模块,但不到31个模块
  • 或:

  • 它没有名为“.text”的节
  • 如果一个图像只有一次从导入,则该图像不被视为已打包 名为“mscoree.dll”的模块


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

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

    阅读VisualStudio文档:,也可以看到。但是MSDN页面没有说明“打包图像”;howtogeek页面也没有提到/Zx编译器选项。文件,这些文件的代码在执行之前必须解压到内存中。恶意软件的常见标志。压缩图像是通过一些启发式分析检测到的,因此各种
    /Z
    选项产生的字节可能会使Process Explorer的分析器失效。谢谢您提供的信息,听起来很合理。我检查/ZI输出和/ZI输出的
    .text
    部分。二进制文件的内容看起来非常不同,.text的大小是142598对136722,我认为其中大部分是LIBCMT.lib中的代码。仍然很难想象为什么会出现蓝色标志。Process Explorer可能不会公开如何识别打包图像,但Process Hacker会这样做,正如您在我的回答中所看到的