我之前使用过UPX来缩小我的Windows可执行文件的大小,但是我必须承认,我对它可能产生的任何负面影响都很幼稚。这种打包/解包的方法会有什么副作用呢?
在某些情况下,是否有人建议不要将可执行文件压缩使用UPX(例如,在编写DLL、Windows服务或针对Vista或Win7时)?我大多数的代码都是用Delphi编写的,但我也用UPX压缩C/C++可执行文件。
另外一方面,我并不是在尝试通过运行UPX来保护我的exe免受反汇编器的攻击,而仅仅是为了减小可执行文件的大小和防止粗略篡改。
我之前使用过UPX来缩小我的Windows可执行文件的大小,但是我必须承认,我对它可能产生的任何负面影响都很幼稚。这种打包/解包的方法会有什么副作用呢?
在某些情况下,是否有人建议不要将可执行文件压缩使用UPX(例如,在编写DLL、Windows服务或针对Vista或Win7时)?我大多数的代码都是用Delphi编写的,但我也用UPX压缩C/C++可执行文件。
另外一方面,我并不是在尝试通过运行UPX来保护我的exe免受反汇编器的攻击,而仅仅是为了减小可执行文件的大小和防止粗略篡改。
使用EXE压缩器也有缺点,其中最明显的是:
在启动被压缩的EXE/DLL时,所有代码都会在一次内存读取中从磁盘镜像解压到内存中,如果系统内存不足且被迫访问交换文件,则可能导致磁盘抖动。与此相反,未经压缩的EXE/DLL会根据需要(即执行时)由操作系统为代码页分配内存。
多个压缩的EXE/DLL实例会在内存中创建多个代码副本。例如,如果你有一个包含1 MB代码(压缩前)的压缩EXE,并启动了5个实例,则将浪费约4 MB的内存。同样地,如果你有一个1 MB的DLL并且它被5个正在运行的应用程序使用,则将浪费约4 MB的内存。而未压缩的EXE/DLL只需在内存中存储一次代码,在多个实例之间共享。
upx original.exe -o compressed.exe
压缩然后解压缩 upx -d compressed.exe -o original-decompressed.exe
可执行文件将像 exe 文件一样正常运行,其中操作系统在实例之间共享代码并且没有磁盘抖动? - Phani Rithvij我很惊讶这一点还没有被提到,但使用UPX压缩的可执行文件也增加了启发式杀毒软件产生误报的风险,因为统计数据显示许多恶意软件也使用了UPX。
UPX Scrambler
,它可以自动完成此操作)。 - user257319以下是三个缺点:
因此,如果您的EXE或DLL包含大量资源,则上述缺点可能更加突出,但否则,在实践中它们可能不是太大的问题,考虑到可执行文件的相对大小和可用内存,除非你谈论的是被许多可执行文件(如系统DLL)使用的DLL。
为了纠正其他答案中的一些错误信息:
现在,磁盘上可执行文件的最终大小已经不再重要。你的程序可能会加载得更快一些毫秒,但一旦开始运行,差异是无法区分的。
有些人可能会因为你的可执行文件使用了UPX压缩而更加怀疑它。根据你的最终用户,这可能或可能不是一个重要的考虑因素。
没有缺点。
但需要说明的是,UPX存在一个非常普遍的误解,即--
实际上,您正在构建一个具有"加载器"职责的新可执行文件,而"真正"的可执行文件将被削减部分并压缩,作为加载器可执行文件的二进制数据资源(无论原始可执行文件中的资源类型如何)。
使用反向工程方法和工具进行教育目的或其他目的,将向您显示有关"加载器可执行文件"的信息,而不是有关原始可执行文件的可变信息。
UPX被误报的原因是因为其开放许可使恶意软件作者可以毫无顾虑地使用和修改它。当然,这个问题在整个行业中都是固有的,但不幸的是,伟大的UPX项目也受到了这个问题的困扰。
更新:请注意,随着Taggant项目的完成,假阳性问题将得到改善,前提是UPX支持它(或其他任何东西)。
在我看来,经常使用UPX是毫无意义的,但原因已经在上面解释过了,主要是内存比磁盘更昂贵。
Erik:LZMA stub可能会更大。即使算法更好,也不总是有净增益。