购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

18.4 文件打包发布

18.4.1 Costura.Fody

在.NET项目中往往需要引入第三方组件包,这些包通常包含很多.dll文件,这些托管的.dll文件需要随着应用程序一起生成和发布部署。比如引入Newtonsoft.Json序列化组件,项目打包时会将Newtonsoft.Json.dll也一起复制到bin目录下,以确保运行时能够正确加载和调用,如图18-61所示。

图18-61 单独生成第三方.dll文件

为了简化部署流程,减少因管理多个.dll文件而可能引入的复杂性和稳定性风险,可以采用Costura.Fody这样的文件打包工具。Costura.Fody是一个基于Fody的.NET库,它能够自动将项目依赖的第三方.dll文件嵌入主程序集(通常是.exe文件)中,从而在部署时无须单独分发这些.dll文件,极大地简化应用程序的分发和维护工作。

Costura.Fody的基本用法如下:

首先,在.NET项目中安装Costura.Fody,这通常可以通过NuGet包管理器轻松完成。在Visual Studio中,可以在“NuGet包管理器”窗口中搜索“Costura.Fody”并安装它,最新版本为5.7.0,如图18-62所示。

图18-62 通过NuGet包管理器安装Costura.Fody

然后,Costura.Fody会在项目的根目录下自动创建一个名为FodyWeavers.xml的配置文件,这个文件用于控制Costura.Fody的行为。默认情况下不需要修改这个文件,因为它会尝试合并项目引用的所有.dll文件,某些特殊的场景下可以通过编辑此文件来指定要排除或特别包含的.dll文件,如图18-63所示。

图18-63 FodyWeavers.xml文件

经过编译后可以看到,Debug目录生成的文件中并没有Newtonsoft.Json.dll和Costura.dll,而生成的LineDDA.exe可执行文件体积增大到295KB,这表明在编译过程中已自动将.dll文件嵌入可执行文件中,如图18-64所示。

图18-64 第三方.dll文件被打包到项目中

在Debug目录下可以选择仅保留LineDDA.exe可执行文件,根本不需要额外的配置文件或调试信息文件。接着,使用dnSpy查看生成的LineDDA.exe,可以发现引入的.dll文件全部被打包到资源目录下,LineDDA.exe通过内置的AssemblyLoader在运行时从资源目录中动态加载嵌入的.dll文件,如图18-65所示。这样可以确保应用程序能够正常运行,而不需要外部.dll文件的支持。

图18-65 使用dnSpy查看第三方.dll资源所在位置

18.4.2 ILMerge

ILMerge(Intermediate Language Merger)是一款在微软社区被广泛认可的打包工具,常用于将多个.NET程序集合并为一个程序集。ILMerge的GitHub地址为https://github.com/dotnet/ILMerge,其中包含较为详细的文档。在Visual Studio中使用NuGet包管理器下载并安装即可,安装命令为Install-Package ilmerge-Version 3.0.29,如图18-66所示。

图18-66 通过NuGet包管理器使用命令行安装ILMerge

安装后,可以在当前Visual Studio项目的packages文件夹下找到对应的可执行文件ILMerge.exe,如图18-67所示。

图18-67 ILMerge.exe所在的目录

ILMerge的基本用法如下:

ILMerge.exe是一个命令行工具,需要注意指定.NET版本,其命令行参数比较复杂,我们直接在命令提示符下运行,从输出的内容中可见命令参数及使用说明,如图18-68所示。

图18-68 ILMerge.exe运行后输出的命令参数及使用说明

该工具提供了很多命令参数,这里仅对合并程序集时用到的参数做简要说明,如表18-2所示。

表18-2 ILMerge常用参数说明

下面仍以LineDDA.exe作为实验程序,当使用ILMerge.exe合并第三方程序集Newtonsoft.Json.dll时,可以运行如下命令。

如果一切顺利,合并后重新生成的new.exe文件为796KB,如图18-69所示。

图18-69 ILMerge.exe合并生成新文件输出日志

对新生成的new.exe文件进行功能性完整测试,尝试执行一段编码后的shellcode,成功启动了本地计算器,如图18-70所示。

图18-70 测试启动本地计算器进程

接着,我们可以使用dnSpy进行逆向分析,查看合并之后的new.exe文件,在工具的左侧资源管理器中出现Newtonsoft.Json命名空间,说明已经将Newtonsoft.Json.dll成功嵌入可执行文件中,如图18-71所示。

图18-71 dnSpy反编译查看资源

另外,ILMerge还有一个GUI版本,但合并后生成的可执行文件在运行时会抛出异常,感兴趣的读者可自行深入研究,如图18-72所示。

图18-72 ILMerge的GUI版本 /Lrr5CZY/GDeOSW3S9+Ne8npYRhHQSIsyiK+N8Jm+XZ83f2XflKKTP5UP2hZgXUq

点击中间区域
呼出菜单
上一章
目录
下一章
×