Mic*_*ick 37 c++ compression delphi winapi upx
我之前使用过UPX来减少我的Windows可执行文件的大小,但我必须承认我对这可能产生的任何负面影响都很天真.所有这些包装/拆包的缺点是什么?
是否存在任何人建议NOT UPX-ing可执行文件的情况(例如,在编写DLL,Windows服务或定位Vista或Win7时)?我在Delphi中编写了大部分代码,但我也使用UPX来压缩C/C++可执行文件.
另外,我没有尝试使用UPX来保护我的exe不被反汇编程序,只是为了减少可执行文件的大小并防止粗略的篡改.
Lar*_*ens 46
原因是使用EXE压缩器存在缺点.最为显着地:
在启动压缩的EXE/DLL时,所有代码都会在一次传递中从磁盘映像解压缩到内存中,如果系统内存不足并被强制访问交换文件,则会导致磁盘抖动.相反,对于未压缩的EXE/DLL,OS根据需要为代码页分配内存(即,当它们被执行时).
压缩的EXE/DLL的多个实例在内存中创建多个代码实例.如果您有一个包含1 MB代码的压缩EXE(压缩前),并且用户启动了5个实例,则会浪费大约4 MB的内存.同样,如果您有一个1 MB的DLL并且由5个正在运行的应用程序使用,则会浪费大约4 MB的内存.使用未压缩的EXE/DLL,代码只存储在内存中一次,并在实例之间共享.
http://www.jrsoftware.org/striprlc.php#execomp
Oli*_*sen 19
我很惊讶这还没有被提及,但使用UPX打包的可执行文件也增加了从启发式反病毒软件产生误报的风险,因为统计上很多恶意软件也使用UPX.
小智 13
有三个缺点:
因此,如果您的EXE或DLL包含大量资源,则上述缺点更多是一个问题,但是,鉴于可执行文件和可用内存的相对大小,它们在实践中可能不是很重要,除非您谈论DLL许多可执行文件(如系统DLL)使用.
要在其他答案中消除一些不正确的信息:
Jim*_*eth 10
唯一重要的时间是从互联网下载期间.如果你使用的是UPX,那么你实际上会比使用7-zip时更糟糕(基于我的测试7-Zip是UPX的两倍).然后,当它在目标计算机上实际上被压缩时,性能会降低(请参阅Lars的回答).因此UPX不是文件大小的好解决方案.只需7zip整个事情.
至于防止篡改,它也是一个失败.UPX也支持解压缩.如果有人想要修改EXE,那么他们会看到它是用UPX压缩然后解压缩它.您可能放慢速度的可能破解程序的百分比并不能证明这种努力和性能损失是正确的.
更好的解决方案是使用二进制签名或至少只是哈希.一个简单的哈希验证系统是获取二进制的哈希值和一个秘密值(通常是一个guid).只有您的EXE知道秘密值,因此当它重新计算哈希值以进行验证时,它可以再次使用它.这不是完美的(可以检索秘密值).理想的情况是使用证书和签名.
如今,磁盘上可执行文件的最终大小在很大程度上无关紧要。您的程序加载速度可能快几毫秒,但一旦开始运行,差异就无法区分了。
有些人可能对您的可执行文件更加怀疑,因为它是用 UPX 压缩的。根据您的最终用户,这可能是也可能不是一个重要的考虑因素。