Windows EXE/DLL:什么是"打包图像"

Jim*_*hen 10 c++ windows process

Process Explorer有时会将EXE显示为"打包图像",但它的含义是什么.

我发现的是:编译一个exe(使用Visual C++ 2010),/ZI选项结果是打包图像,但/Zi没有.为何如此差异?

BTW:编译的DLL /ZI也被认为是"打包图像"并标记为紫色.

在此输入图像描述

Han*_*ant 10

"打包图像"是指压缩可执行代码以使文件更小的打印图像.典型的文件大小减少徘徊在50%左右.它在运行时使用"加载器"在开始执行之前将数据解压缩回可执行代码.在过去,磁盘存储容量有限,网络带宽有限,这很有用.

今天有了TB级磁盘和兆位网络,这是一种气味,也可以利用打包来隐藏恶意代码.当然,Process Explorer为其添加不同颜色的原因.

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

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

当然不是真正的问题,您的用户只会看到您的程序的Release版本.哪个是没有/ ZI而没有/ INCREMENTAL.


Bru*_*ell 5

进程黑客源代码

在以下情况下打包图像:

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

或者:

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

或者:

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

或者:

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

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

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