0x01 DLL简介
动态链接库(Dynamic-Link-Library,缩写dll), 是微软公司在微软视窗操作系统中实现共享函数库概念的一种实现方式。这些库函数的扩展名是 .DLL、.OCX(包含 ActiveX 控制的库)或者 .DRV(旧式的系统的驱动程序)。
其中的动态链接是指,将一部分常常会共享的代码(静态链接的 OBJ 程序库)制作成 DLL 档,当可执行文件调用到 DLL 档内的函数时,Windows 操作系统才会把 DLL 档加载存储器内,DLL 档本身的结构就是可执行档,当程序有需求时函数才进行链接。
与之相关的还有静态数据连接库(lib)的概念
0x02 DLL 调用
调用方式:静态调用:产生一个 LIB 文件,作为 DLL 的导入库,包含了 DLL 的相关信息,提供寻找 DLL 的链接,不提供函数实现代码;动态调用:不产生额外文件,但需要使用LoadLibrary和GetProcAddress API 函数来装载。
调用约定:指参数传递顺序、传递方式、清栈负责者。常见调用约定有:__cdecl、__stdcall、__fastcall、__thiscall、__clrcal。
常见 DLL :Kernel32.dll主要包含管理内存、进程和线程的函数;user32.dll主要包含用于执行用户界面任务的函数;GDI32.dll主要包含用于画图和显示文本的函数。
0x03 与 lib 文件区别
lib 是编译时用到的,dll 是运行时用到的。如果要完成源代码的编译,只需要 lib;如果要使动态链接的程序运行起来,只需要 dll 。
如果有 dll 文件,那么 lib 一般是一些索引信息,记录了 dll 中函数的入口和位置,dll 中是函数的具体内容;如果只有 lib 文件,那么这个 lib 文件是静态编译出来的,索引和实现都在其中。
使用静态编译的 lib 文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。
动态链接的情况下,有两个文件:一个是 LIB 文件,一个是 DLL 文件。LIB 包含被 DLL 导出的函数名称和位置,DLL 包含实际的函数和数据,应用程序使用 LIB 文件链接到 DLL 文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是 DLL中 相应函数代码的地址,从而节省了内存资源。DLL 和 LIB 文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用 lib 文件或者没有 lib 文件,可以用 WIN32 API 函数 LoadLibrary 、 GetProcAddress 装载。
0x04 DLL 编写
待更新