在Windows系统中,我们经常接触各种 .dll
文件,无论是在使用类库、调用系统 API,还是在安全研究、逆向分析中,DLL 都是一个不可绕过的重要组成部分。本文将系统性地展开分析这些基础知识,彻底搞清楚 DLL 背后的真实面貌。
最近有朋友问我这样一个问题:.NET 程序集和 C++ 写的 DLL 是一样的吗?虽然后缀名都是 .dll
,它们有什么本质不同?
这个问题看似简单,实则涉及多个知识层面:托管与非托管、程序集结构、反射机制、运行时加载方式等等。
1.1 什么是 DLL?
DLL,全称 Dynamic++ Link Library(动态链接库),最早用于 C/C++ 程序在运行时动态调用外部代码模块。其作用是将常用功能封装成独立的模块,便于程序之间共享和重用。
在 .NET 世界中,.dll
不再是单纯的机器码库,而是可以包含 托管代码和元数据 的 .NET 程序集(Assembly)。
通俗的说我们编写的C#代码只能在.NET运行时中执行,经过编译会生成 .dll 或 .exe 文件,这些文件必须在.NET运行时下执行的代码称为托管代码,包含这些托管代码的二进制单元就是 .NET 的Assembly程序集。虽然都是 .dll
文件,但从内容结构到运行方式,.NET 程序集和 C/C++ 动态链接库是完全不同的两种东西。
1.2 程序集组成
每个程序集文件主要由IL代码、Metadata元数据、Manifest清单和资源文件组成。其中,IL代码和元数据会先被编译为一个或多个托管模块,然后托管模块和资源文件会被合并成程序集。
程序集文件中占比最大的一般是 IL 代码。IL 代码和 Java 字节码相似,它不包含平台特定的指令,它只在必要的时候被 .NET Core 运行时中的 JIT 编译器编译成机器码。
1.3 IL 代码
我们先来看看下面这样一段简单的 C# 代码被编译成 IL 代码会是什么样子。C# 代码如下所示。
publicclassCalculator{publicintAdd(int num1,int num2){return num1 + num2;}}
经过编译后,在项目的 binDebug 目录会生成一个与项目名称同名的 dll 程序集文件。我们使用 ildasm.exe 工具打开这个文件,定位到 Calculator 的 Add 方法,可以看到 Add 方法的 IL 代码,如图2-13所示。
这就是 IL 代码的样子,如果使用 VB 或 F# 编写相同的 Add 方法,它生成的 IL 代码会是一样的。由于程序集中的 IL 代码不是平台特定的指令,所以 IL 代码必须在使用前调用 JIT 编译器进行即时编译,将其编译成特定平台的本地代码,才能在该平台运行起来。
1.4 程序集清单
.NET 程序集还包含描述程序集本身的元数据,我们称之为清单。清单记录了当前程序集正常运行所需的所有外部程序集、程序集的版本号、版权信息等等。与类型元数据一样,生成程序集清单也是由编译器的工作。
同样地,还是以上面 Calculator 类所在项目为例,在 ildasm.exe 工具打开的程序集的目录树中,双击 MAINFEST 即可查看程序集的清单内容,如图2-14所示。
可以看到,程序集清单首先通过 .assembly extern 指令记录了它所引用的外部程序集。接着是当前程序集本身的信息,记录了程序集本身的各种特征,如版本号、模块名称等。
1.5 私有程序集
.NET私有程序集是指仅在特定应用程序或组件内部使用的程序集,通常不会被部署到GAC全局程序集缓存中,而是随着应用程序的打包发布部署在文件夹中,比如构建ConsoleJSON.exe可执行文件时,因为内部添加引用了JSON.NET这个开源组件,因此Visual Studio会把Newtonsoft.Json.dll复制到bin目录下,如图2-15所示。
因此私有程序集优点在于灵活部署,即使不小心移除了私有程序集,也不会担心破坏主机上其他应用程序的正常运行。
1.6 小结
.NET私有程序虽然 .dll
后缀相同,但背后差异极大。.NET 程序集是包含 IL 代码的托管程序集,而 C/C++ 编译的 DLL 是操作系统直接运行的本地模块。理解它们的结构与加载方式,对开发、架构、安全都有极大的帮助。
02. 扩展阅读学习 以上知识点已收录于新书《.NET安全攻防指南》第2.2节,并且有完整详细的介绍,如下图所示。
另外,全书共计25章,总计1010页,分为上下册,横跨.NET Web代码审计与红队渗透两大领域。
上册深入剖析.NET Web安全审计的核心技术,帮助读者掌握漏洞发现与修复的精髓;
下册则聚焦于.NET逆向工程与攻防对抗的实战技巧,揭秘最新的对抗策略与技术方法。
自《.NET安全攻防指南》上线以来,许多读者已抢先下单成功购入并收到了书籍,反响热烈,好评如潮!
感谢大家的支持与肯定,我们也将持续为大家带来更多优质的.NET安全研究成果!原价258元,现限量优惠,全套仅售141元,数量有限!
点击京东链接:https://item.jd.com/10140917044329.html 或者打开手机京东APP即可下单购买。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...