动态链接库DLL及docker容器技术原理详解

1.前言

1.1大纲

        小伙伴们周末快乐,作者今天为大家带来了关于C/C++中动态链接的知识,以及在我们安全行业中一直炙手可热的容器技术docker的底层原理(Linux系统下)。

        大家对于底层一直有一种发自内心的排斥和恐惧,认为其过于复杂和抽象,并且需要耗费大量时间投入还可能得不到结果。那么恭喜你碰到了本作者,我会用最简洁明了的比喻,带你理解那些抽象复杂的底层知识,话不多说,准备发车。

1.2同款学习资料

        下面是作者学习过的C语言基础教程(千峰)以及将C/C++知识用于安全逆向实战的进阶教程(51HOOK),对于逆向一途的朋友们,肯定对hook印象深刻,应该也能从这个名字看出其方向。

学习建议:建议大家先将千峰的c语言基础认真学习完,对c语言的基础知识熟练之后,再去学习C++(C++已经有了后续高级语言的影子,简化了大量的底层操作,不利于对计算机底层工作的理解)以及更加进阶的二进制逆向(反汇编)领域,扎实的基础是万丈高楼屹立百年的基石。

2.动态链接

2.1什么是动态链接

2.1.1理念性讲解

        所谓动态链接就是指我们程序中用到的一些函数是共用的,它并不在我们自身程序内,而是由操作系统或其它第三方提供的,可以由很多个程序共同使用的库函数,在Windows系统中也就是我们常见的以.dll为结尾的文件,在Linux系统中则是.so文件。

2.1.2实例性讲解

        假设一个程序就是小区中的一户家庭,而动态链接库就好比小区的物业,当我们需要缴纳物业费或者有其它需要物业处理的需求时,我们小区中的每一户人家都可以在同一时间或不同时间去找同一个物业,他能够“同时”处理我们每一户人家的需求。

        补充:这里提及“同时”处理是为了严谨性,因为进程在并发运行的过程中存在是否为有限资源的考量,并通过信号量机制来解决进程同步或进程互斥中有限资源使用的问题,动态链接库并非有限资源,因此可以“同时”使用,无需担心资源占用导致的进程阻塞等问题(感兴趣的小伙伴可以深入学习一下操作系统原理)。

2.1.3静态链接

        这里简单提及一下静态链接,由于比较简单就不详细介绍。还是以住户和物业为例,静态链接则类似于在每一户人家中单独配备了一个物业。说到这里想必大家应该能看出其优劣,优点在于程序运行更加高效和稳定,缺点在于需要多占用大量的内存空间。而内存本身造价昂贵,因此大部分情况下采用动态链接的方式。

2.2动态链接种类及特点

2.2.1动态链接分类

        动态链接主要分为两类,分别是装入时动态链接运行时动态链接

2.2.2装入时动态链接原理及特点

2.2.2.1理念性讲解

        当我们运行一个程序时,操作系统会将其代码先从磁盘加载进内存,并在同一时刻将其所需要用到的动态链接库文件(dll)也全部加载进内存,然后将我们程序中对应的代码调用的地址全部修正为对应的动态链接库函数所在的地址,使其在运行时能找到对应代码。

2.2.2.2实例性讲解

        还是将程序类比为住户,程序加载进内存的过程可以看作我们入住小区的过程;当我们入住小区之后,未来肯定会有物业需求、购物需求等等(注意:是未来会有,而不是当下立马就有)。而装入时动态链接则是在我们入住小区的同时,就告诉我们物业在哪里,超市在哪里,那么我们后续有相应需求时,就可以根据入住小区时得知的地址找到超市和物业。

2.2.2.3特点

        优点:我们在一开始就知道了物业和超市的位置,当我们有需求时,就可以直接找到他们,因此程序执行效率较高。

        缺点:如果后来物业和超市的位置发生了变化,我们还根据一开始得知的地址去寻找,那结果必然是无法找到的;并且由于只是认为我们未来可能有购物的需求,就在小区内建立了超市,如果一直没有去超市,就白白浪费了小区空间(即内存空间)。

2.2.3运行时动态链接原理及特点

2.2.3.1理念性讲解

        当我们运行一个程序,使其被加载进内存时,并不会将需要用到的所有动态链接库也同时加入内存,而是将其延迟到了真正要使用时(即对应的调用代码执行时),才会将其加载进内存,并修改源程序中对应的地址值,使其能够找到动态链接库函数。

2.2.3.2实例性讲解

        仍将程序类比为住户,也就是说当我们入住小区时,并不会立即在小区建造超市和物业,而是当我们提出购物需求时,才会建造超市并告诉我们位置。

2.2.3.3特点

        优点:不难看出,由于在我们提出需求前并没有物业和超市,因此节省了小区的空间(即内存空间);并且在提出需求后才建造并告知我们地址,也不会出现地址变化找不到超市的情况(至于地址为什么会变化,有兴趣的小伙伴可以学习一下操作系统中的调度算法)。

        缺点:由于我们提出购物需求时,需要先建造超市再告知我们地址,因此无法立即前往超市,效率上就有所降低。

2.3动态链接跨平台性(扩展知识)

2.3.1概述

        这里是作者临时起意的扩展知识,需要对二进制有一定程度的理解,小伙伴们酌情观看。

2.3.2动态链接库本质

        动态链接库本质上是一堆二进制数据,即可以直接在cpu上运行的二进制指令,而不是像其它高级语言库函数那样的对应高级语言的代码。

2.3.3是否可跨平台

        动态链接库是不具有跨平台性的,虽然Windows系统和Linux系统都遵循x86指令集架构,但在系统调用层面的实现,它们彼此的设计和对应的中断向量表和中断号具有极大的差异,是无法相互兼容的。这也是所有应用程序都提供不同操作系统下载的根本原因之一。

        小tips:emmm......其实是有解决办法的,原谅作者懒得写了。

2.4visual studio创建动态链接库

2.4.1概述

        这里简单教大家一下使用vs创建动态链接库的过程。

2.4.2创建步骤

1.新建项目->选择动态链接库:

MFC动态链接库和动态链接库的区别在于一个可以使用微软提供的其它库函数,来提高开发效率,另一个则需要自己实现所有功能(MFC类似于框架的作用),自己酌情选择。

2.创建好后就是如下图的目录结构,可以自行引入其它库函数,并编写代码(编写前先去了解dll项目结构):

3.写好之后,生成解决方案即可获取dll文件:

3.docker容器本质

3.1什么是docker

        docker是一种容器技术,本质上是为了实现容器与物理机和其它服务容器隔离且互不影响的同时,还能够便捷的一键化部署服务,类似于轻量级的虚拟机,只取自己需要的资源,而不是完整资源。

3.2docker如何实现隔离性

3.2.1概述

        在Linux系统中,docker通过利用Linux内核提供的namespace和cgroup实现隔离性和资源限制。

3.3.2namespace讲解和docker隔离性本质

3.3.2.1理论性讲解

        namespace也就是命名空间,默认情况下,我们所有的用户级程序都是运行在同一个命名空间中的,它们共享pid、文件系统、网络接口等资源。而docker则是向Linux内核申请了一个全新的命名空间,这个命名空间与我们物理机原本的默认命名空间是隔离的,因此就实现了docker的隔离性。

3.3.2.2实例性讲解

        可以把命名空间看作我们的一个房间,默认情况下,大家都生活在一个房间内,我们可以共同使用这个房间中的一切资源,也能彼此便捷的进行交流。而docker则是申请了一个新的房间,它可以使用自己房间中的一切,但是却与我们默认房间有一墙之隔,我们彼此之间无法直接进行交流,因此就实现了隔离性。

3.3.3cgroup概述

        cgroup是Linux内核提供的限制一个程序可以使用多少cpu等各种资源的接口,类似于我们在Windows系统设置虚拟机时,会手动限制虚拟机的磁盘大小、内存空间等资源。

3.3docker逃逸本质

3.3.1理论性讲解

        通过上述的知识,我们可以知道,docker与我们物理机是处在不同的命名空间的,但是很多时候docker需要能够与物理机进行交互,因此提供了一些交流的接口,例如我们最常见的数据卷(数据卷本身是为了保存docker中的数据,避免随着docker容器的停止而消失,因为默认情况下docker运行在内存中,不会对磁盘数据产生影响)通过这些机制可以使得docker容器对物理机所在的命名空间产生影响,从而达到逃逸的目的。

3.3.2实例性讲解

        还是以房间为例,虽然"我们"住在不同的房间,房间内资源能够满足"我们"的日常所需,但偶尔"我们"仍然需要相互交流,那么"我们"就可以通过打开房门来进行彼此间的交流,房门就是沟通"我们"之间的桥梁,如果"我"(docker容器)通过房门给了"你"(物理机)一个有毒物质,而你没有进行检查就放在了自己房间内,那么你的房间就被我成功"污染"了。

3.3.3补充

        对于docker的细节原理,还有很多知识没有进行讲解,如果小伙伴们对其感兴趣可以留言,后续有时间作者可以单开一次专门讲解docker底层的细节,以及各种逃逸的骚操作。

4.总结

        老样子,没啥想说的,大周末的好好享受周末时光,有缘再见,拜了个拜......

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值