【逆向】动态链接库

动态链接库

1. 动态链接库的定义

  • 动态链接库英文DLL,是Dynamic Link Libarary的缩写。
  • Dll中包含若干公用的代码、数据等,可供其他模块(DLL或exe文件等)使用。
  • Dll中并不是所有的函数都必须供其他模块使用,只有经过导出(export) 后才允许被外部正常调用。

2. 动态库的由来:

Dll最初用于节约应用程序所需要的磁盘空间和内存空间。早前在传统的非共享库中,一部分代码简单的附加到调用的程序中。如果两个程序同时调用同一个子程序,就会出现两份代码。

WindowsAPI就存在于动态链接库中。对于多个进程共同使用的Dll文件来说,在物理内存中只有一份文件,不过是被分别映射到了不同的进程内存空间,从而极大的降低了内存的消耗。

3. Dll与ExE程序区别

入口函数:DllMain函数是DLL模块的默认入口点。当windows加载DLL模块时调用这一函数。
如果没有DLLMain函数程序也能正常运行 此函数是可选函数。

对于dll项目,编译器通常会产生两个文件,分别是.DLL .lib。其中dll是动态链接库,保存了所有的代码和数据,lib是导入库,保存了一些符号和地址的对应信息。不能单独使用,必须与dll共存,用于动态链接库的隐式链接。

4. DLL导出

作为一个DLL文件,它的最大作用就是提供函数给其他的模块使用,提供的函数叫导出函数。
导出方式:1、声明导出 2、模块定义文件导出。
除了导出函数外,dll文件还可以导出变量,c++类。

导出方式:

  1. 声明导出

    extern “C” _declspec(dllexport) function

  2. 模块定义文件导出

    1. 定义文件export.def
    2. 编写代码
    LIBRARY "mydll"
    EXPORTS
    my_min @ 1
    
    1. 项目属性 -> 链接器 -> 输入,将模块定义文件设置为“export.def”
      在这里插入图片描述

5. DLL导入

  1. 通过隐式链接的方式调dll导出的函数。

    #pragma comment(lib,“xx.lib”)

  2. 通过显式链接方式调用导出函数。

    • LoadLibrary();API函数。

    //加载dll
    HMODULE hModule = LoadLibraryW(L"mydll.dll");
    //获取相应函数
    GetProcAddress(hModule,“”);
    FreeLibrary();

6. 静态库

静态库又叫对象库,其中的代码在运行连接器进行静态链接时被添加到程序的.exe文件中,静态链接库最终会与调用程序融为一体,其文件后缀也是.lib

静态链接库只能使用隐式链接。静态链接库在程序编译前,在链接过程会被直接添加到目标应用程序中,会加大应用程序的体积。

猜你喜欢

转载自blog.csdn.net/Dajian1040556534/article/details/130624264