如果.NET可执行文件是PE文件,为什么像UPX这样的所有打包程序“腐败”它?为什么UPX不能用于.NET可执行文件?
回答
UPX是专为原生申请。这些是直接编译到机器码的应用程序。
针对.NET Framework的可执行文件不是本机应用程序,而是管理的。换句话说,它们在运行时环境(公共语言运行时,或CLR)之上运行,并被编译为“中间语言”(IL),直到运行时才编译为机器语言(此过程称为JIT,或即时编译)。
UPX可以直接处理非托管机器码,但它不适用于托管应用程序。如果JIT编译器经过压缩并因此无法读取,它将如何即时编译应用程序的代码?它不会;它会看到文件已损坏。
虽然没有大的损失。今天压缩可执行文件比缺点有更多的缺点。除此之外,由于托管应用程序被编译为IL,所以它们通常比首先等同的非托管应用程序小。
但是你不能解释为什么UPX无法处理托管指令。我确信有一个原因,但你没有提到它。 “如果CPU压缩并因此无法读取,CPU将如何运行本机代码?它不会;它会看到文件已损坏。”几乎和UPX为什么不能压缩x86二进制文件一样好。例如,它可以在IL EXE周围放置一个真正的EXE,并将IL EXE解压缩到另一个文件,如https://en.wikipedia.org/wiki/UPX –
我想我已经介绍过了。 UPX直接处理非托管代码。它解码,所以它的工作。它不适用于JIT编译的应用程序,因为UPX的设计不是预先解压缩代码并将其提供给JIT编译器。是的,我不认为你有任何技术上的原因不能为JIT编译的应用程序编写打包程序。但是,至少在我写这个答案时,UPX不是。 –
- 1. 为什么可执行文件不可执行?
- 2. 为什么我的Makefile不能创建可执行文件?
- 3. 为什么我不能像这样复制可执行文件?
- 4. 为什么行动不执行功能?
- 5. 为什么我的Eclipse可执行文件夹不能双击运行?
- 6. 当由.NET编译时,可执行文件包含什么?
- 7. 为什么这个批处理文件不能自动执行?
- 8. 为什么我不能执行scala文件?
- 9. 为什么不g ++覆盖可执行文件
- 10. 为什么不执行此功能?
- 11. proxy.cgi为什么不能执行?
- 12. 为什么finally块不能执行?
- 13. 为什么这个before_filter不能执行?
- 14. 为什么CreateFileAsync()不能执行?
- 15. 为什么我不能执行RSpec?
- 16. 为什么else分支不能执行?
- 17. 为什么这最后不能执行?
- 18. 为什么From行不能用于我的邮件功能?
- 19. 创建NuGet包 - 为什么这个文件夹结构不能用于.NET 4.0?
- 20. 在ant任务Exec中,为什么为可执行文件=“cmd”提供了<arg value =“/ c”/>?其他可能的可执行文件是什么?
- 21. 为什么我能够在运行时重命名Windows Service可执行文件?
- 22. tclsh85可执行文件和tclsh85s可执行文件有什么区别?
- 23. 什么可执行文件启动了我的可执行文件?
- 24. 什么是JuliaLang等同于Python的sys.exe可执行文件?
- 25. wix不能更新可执行文件
- 26. 为什么我不能使用.net实体框架执行SQL函数?
- 27. 为什么在执行时不能执行重载?
- 28. 为什么不执行.vimrc?
- 29. 为什么不执行DispatchQueue.main.async?
- 30. 在发布版本上使用UPX(可执行压缩程序)?
我想你在谈论“[Ultimate Packer for Executables](http://upx.sourceforge.net/)”,当你使用“UPX”的缩写? –