之前我曾使用UPX来减少我的Windows可执行文件的大小,但我必须承认我对这可能产生的任何负面影响都很天真。所有包装/拆包的缺点是什么?
是否存在任何人建议NOT UPX-ing可执行文件的情况(例如,在编写DLL,Windows服务或定位Vista或Win7时)?我在Delphi中编写了大部分代码,但我也使用UPX来压缩C / C ++可执行文件。
另一方面,我不在某些尝试中运行UPX以保护我的exe不被反汇编程序,只是为了减少可执行文件的大小并防止粗略的篡改。
答案 0 :(得分:45)
原因是存在缺点 使用EXE压缩机。最值得注意的是:
启动压缩的EXE / DLL后,所有代码都是 从磁盘映像解压缩到 一次通过内存,这可能会导致 如果系统处于低电平状态,则磁盘抖动 内存并被迫访问 交换文件。与...对比 未压缩的EXE / DLL,操作系统 为代码页分配内存 需求(即执行时)。
压缩的EXE / DLL的多个实例创建多个 内存中代码的实例。如果 你有一个压缩的EXE 包含1 MB的代码(之前 压缩)并且用户启动5 它的实例,大约4 MB 记忆浪费了。同样,如果你 有一个1 MB的DLL,它被使用 由5个正在运行的应用 大约4 MB的内存 浪费了。使用未压缩的EXE / DLL, 代码只存储在内存中一次 在实例之间共享。
答案 1 :(得分:19)
我很惊讶这还没有被提及但是使用UPX打包的可执行文件也增加了从启发式防病毒软件产生误报的风险,因为统计上很多恶意软件也使用UPX。
答案 2 :(得分:13)
有三个缺点:
因此,如果您的EXE或DLL包含大量资源,则上述缺点更多是一个问题,但是,鉴于可执行文件和可用内存的相对大小,它们在实践中可能不是很重要,除非您是谈论许多可执行文件(如系统DLL)使用的DLL。
在其他答案中消除一些不正确的信息:
答案 3 :(得分:10)
唯一重要的时间是从互联网下载期间。如果您使用的是UPX,那么实际上您的性能会比使用7-zip时更差(基于我的测试,7-Zip是UPX的两倍)。然后,当它在目标计算机上实际上被压缩时,性能会降低(请参阅Lars的回答)。因此UPX不是文件大小的好解决方案。只需7zip整个事情。
就防止篡改而言,它也是 FAIL 。 UPX也支持解压缩。如果有人想要修改EXE,那么他们会看到它是用UPX压缩然后解压缩它。您可能放慢速度的可能破解程序的百分比并不能证明这种努力和性能损失是合理的。
更好的解决方案是使用二进制签名或至少只是哈希。一个简单的哈希验证系统是获取二进制的哈希值和一个秘密值(通常是一个guid)。只有您的EXE知道秘密值,因此当它重新计算哈希值以进行验证时,它可以再次使用它。这不是完美的(可以检索秘密值)。理想的情况是使用证书和签名。
答案 4 :(得分:4)
磁盘上可执行文件的最终大小现在基本上无关紧要。您的程序可能会加载几毫秒,但一旦开始运行,差异就无法区分。
有些人可能因为使用UPX进行压缩而对您的可执行文件更加怀疑。根据您的最终用户,这可能是也可能不是重要的考虑因素。
答案 5 :(得分:2)
我最后一次尝试在托管程序集上使用它时,它使它非常糟糕,以至于运行时拒绝加载它。这是我唯一能想到你不想使用它的时间(而且,实际上,自从我尝试过这么久以后情况甚至可能会更好)。我过去在所有类型的非托管二进制文件中广泛使用它,从来没有遇到过问题。
答案 6 :(得分:2)
如果您唯一感兴趣的是减少可执行文件的大小,那么您是否尝试使用和不使用运行时包来比较可执行文件的大小?当然,您还必须包括整个软件包的大小以及可执行文件,但如果您有多个使用相同基本软件包的可执行文件,那么您的节省将会相当高。
要看的另一件事是您在程序中使用的图形/字形。通过将它们合并到包含在全局数据模块中的单个Timagelist而不是在每个表单上重复它们,可以节省相当多的空间。我相信每个图像都以十六进制形式存储在表单资源中,这意味着每个字节占用两个字节...您可以通过使用TResourceStream从RCData资源加载图像来缩小这一点。
答案 7 :(得分:1)
答案 8 :(得分:1)
查找“未知”病毒的病毒扫描程序可以将UPX压缩的可执行文件标记为有病毒。我被告知这是因为有几种病毒使用UPX来隐藏自己。我在软件上使用了UPX,迈克菲将该文件标记为有病毒。
答案 9 :(得分:1)
UPX之所以有这么多误报是因为它的开放许可允许恶意软件作者使用和修改它而不受惩罚。当然,这个问题是该行业固有的问题,但遗憾的是,UPX项目很受此问题的困扰。
更新:请注意,当Taggant项目完成后,假设UPX支持,则可以增强使用UPX(或其他任何内容)而不会导致误报的能力。
答案 10 :(得分:1)
没有任何缺点。
但仅仅是FYI,关于UPX存在一个非常普遍的误解 -
基本上,您正在构建一个具有" loader"的新可执行文件。责任和真实的"可执行文件,正在进行分段剥离和压缩,作为加载程序可执行文件的二进制数据资源放置(无论资源类型是否在原始可执行文件中)。
使用逆向工程方法和tools用于教育目的或其他将向您显示有关"加载程序可执行文件"的信息,而不是有关原始可执行文件。
答案 11 :(得分:0)
我相信它可能无法在已启用DEP(数据执行保护)的计算机上运行。
答案 12 :(得分:0)
Windows加载二进制文件时,首先要做的就是导入/导出表解析。即,无论导入表中指示了什么API和DLL,它都会首先将DLL加载到随机生成的基址中。然后,在DLL函数中使用基地址加偏移量,此信息将更新到“导入表”。
EXE没有导出表。
所有这些事情甚至在跳转到原始入口点执行之前就发生了。
然后从入口点开始执行后,EXE将运行一小段代码,然后再启动解压缩算法。这小段代码也意味着所需的Windows API将会非常小,从而导致导入表也很小。
但是在二进制文件解压缩后,如果它开始使用以前未解析的任何Windows API,则很可能会崩溃。因此,在执行解压缩的代码之前,解压缩例程必须为解压缩的代码内的所有引用的Window API解析并更新导入表。
参考:
https://malwaretips.com/threads/malware-analysis-2-pe-imports-static-analysis.62135/