电脑装配网

了解DLL劫持从零到CobaltStrike上线免杀

 人阅读 | 作者yiyi | 时间:2023-07-28 07:04

前置知识

什么是DLL

计算机中,有些文件专门用于存储可以重复使用的代码块,例如常用的函数或类,我们通常称其为"库"(Library),以c语言举例,如下为大家展示的就是一个函数库,其提供了 add 和 sub 两个函数:// math.cint add(int a, int b) {return a + b;}int sub(int a, int b) {return a - b;}所谓链接库?即将我们上述的这个 math.c 源代码文件通过编译器进行编译后得到的二进制文件。一个完整的 C 语言项目可能包含多个 .c 源文件,项目运行需要经过 "编译"和"链接"两个阶段:1.编译:由编译器逐个对 c 源代码文件做词法分析、语法分析等操作,最终生成多个目标二进制文件,但由于它们相互之间会调用对方的函数或变量,还可能会调用某些链接库中的函数和变量,编译器无法跨文件找到它们确切的存储位置,所以这些目标二进制文件无法单独运行。2.链接:对于每个目标二进制文件中缺失的函数和变量的存储地址,由链接器负责修复,并最终将所有的目标文件和链接库组织成一个可执行文件。链接器完成链接工作的方式有两种:(1)无论目标二进制文件中缺失的地址位于其他其它目标文件还是链接库,链接器都会逐个找到各个目标文件中缺失的地址,采用此链接方式生成的可执行文件,可以独立载入内存中运行,我们称这种方式为静态链接,用到的链接库为静态链接库;(2)链接器先从所有目标二进制文件中找到部分缺失的地址,然后将所有目标文件组织成一个可执行文件。如此生成的可执行文件,仍然缺失部分函数和变量的地址,待文件执行时,需连同所有的链接库文件一起载入内存,再由链接器完成剩余的地址修复工作,才能正常执行。这种方式中,链接所有目标文件的方法仍属于静态链接,而载入内存后进行的链接操作称为动态链接,此时用到的链接库称为动态链接库DLL(Dynamic Link Library)。使用动态链接库好处在于减小了程序的体积,解决了空间的浪费,方便程序的更新和升级等等。

DLL加载过程

什么是DLL导出函数

在windows平台上,动态链接库的函数或者变量要想被外界调用,必须在函数声明过程中通过__declspec(dllexport)修饰,而这些函数被称为导出函数,类似如下:__declspec(dllexport) int add(int a, int b);

隐式加载

以下图展示了隐式加载的过程:1.左边是dll程序编译过程,生成了 dll 文件和一个 lib 文件;这里的 lib 文件不是指的静态链接库,而是列出了这个 dll 中哪些函数和变量允许被外界调用,记录的信息包含函数和变量的名称以及它们在动态库中的存储位置。2.右边是主程序exe的编译过程,其需要引入dll程序的头文件,该头文件声明了要主程序需要使用的dll的导出函数,经过编译后生成的目标二进制文件,需要经过静态链接将lib文件和目标二进制文件链接到一起形成二进制可执行文件。3.最后可执行文件在载入内存后,同时由动态链接器识别到主程序所要引入的dll,进而将所需要的dll也载入内存,之后进程的主线程开始执行,应用程序启动运行。

本文链接:『转载请注明出处』