动态载入 DLL

动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数。

方法是:用 LoadLibrary 函数加载动态链接库到内存,用 GetProcAddress函数动态获得 DLL 函数的入口地址。当一个 DLL 文件用 LoadLibrary 显式加载后,在任何时刻均可以通过调用 FreeLibrary 函数显式地从内存中把它给卸载。

动态调用使用的 Windows API 函数主要有 3 个, 分别是 LoadLibrary、 GetProcAddress 和FreeLibrary。

我们分别详细介绍这三个函数的功能,因为无论学习编程还是逆向这是三个函数都是非常常用滴。

(1)LoadLibrary 函数

注:Delphi 中还提供了 SafeLoadLibrary 函数,它封装了 Loadlibrary 函数,可以装载由 Filename 参数指定的 WindowsDLL或 Linux 共享对象。它简化了DLL的装载并且使装载更加安全。

[格式]:

function LoadLibrary(LibFileName : PChar): Thandle;

复制代码

[功能]:加载由参数 LibFileName 指定的 DLL 文件。

[说明]:参数 LibFileName 指定了要装载的 DLL 文件名,如果 LibFileName 没有包含一个路径,系统将按照:当前目录、Windows 目录、Windows 系统目录、包含当前任务可执行文件的目录、列在 PATH 环境变量中的目录等顺序查找文件。

如果函数操作成功,将返回装载 DLL 库模块的实例句柄,否则,将返回一个错误代码,错误代码的定义如下表所示。

错误代码

含义

0

系统内存不够,可执行文件被破坏或调用非法

2

文件没有被发现

3

路径没有被发现

5

企图动态链接一个任务错误或者有一个共享或网络保护错误

6

库需要为每个任务建立分离的数据段

8

没有足够的内存启动应用程序

10

Windows版本不正确

11

可执行文件非法或不是Windows应用程序,或在.  EXE映像中有错误

12

应用程序为一个不同的操作系统设计(如OS/2)

13

应用程序为MS  DOS   4. 0设计

14

可执行文件的类型不知道

15

试图装载一个实模式应用程序(为早期Windows版本设计)

16

试图装载包含可写的多个数据段的可执行文件的第二个实例

19

试图装载一个压缩的可执行文件(文件必须被解压后才能被装载)

20

DLL文件非法

21

应用程序需要32位扩展

假如在应用程序中用 LoadLibrary 函数装入某一个 DLL 前, 其他应用程序已把该 DLL 装入内存中了,则系统将不再装入该 DLL 的另一个实例,而是使该 DLL 的“引用计数”加 1 。

(2)GetProcAddress 函数

[格式]:

function GetProcAddress(Module:Thandle; ProcName:PChar): TfarProc;

复制代码

[功能]:返回参数 Module 指定的模块中,由参数 ProcName 指定的过程或函数的入口地址。

[说明]:参数 Module 包含被调用函数的 DLL 句柄,这个值由 LoadLibrary 返回, ProcName

是指向含有函数名的以 nil 结尾的字符串指针,或者可以是函数的次序值,但大多数情况下,用函数名是一种更稳妥的选择。如果该函数执行成功,则返回 DLL 中由参数 ProcName 指定的过程或函数的入口地址,否则返回 nil 。

(3)FreeLibrary 函数

[格式]:

procedure  FreeLibrary(Module: Thandle);

复制代码

[说明]:将由参数 Module 指定的 DLL 文件从内存中卸载 1 次。

[说明]:Module 为 DLL 库的句柄。这个值由 LoadLibrary 返回。由于 DLL 在内存中只装载一次,因此调用 FreeLibrary 首先使 DLL 的引用计数减 1,如果计数减为 0 则卸载该 DLL。

[注意]:每调用一次 LoadLibrary 函数就应调用一次 FreeLibrary 函数,以保证不会有多余的库模块在应用程序结束后仍留在内存中,否则导致内存泄漏。

dll侧加载_动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...相关推荐

  1. 【转载】动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...

    原文地址:https://www.cnblogs.com/westsoft/p/5936092.html 动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行 ...

  2. 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)

    x动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 G ...

  3. dll侧加载_win7系统开机提示xxxdll模块已加载但找不到入口点的解决方法

    很多小伙伴都遇到过win7系统开机提示xxxdll模块已加载但找不到入口点的困惑吧,一些朋友看过网上零散的win7系统开机提示xxxdll模块已加载但找不到入口点的处理方法,并没有完完全全明白win7 ...

  4. dll侧加载_WORD打开时出现加载DLL错误解决方法

    WORD 打开时出现加载 DLL 错误解决方法 1 . 接下来看看解决办法, 按组合键 WIN + R 或者按开始 --- 运行, 打开运行窗口, 2 .在运行对话框中输入或者复制粘贴 " ...

  5. vs2019加载调试动态库dll文件

    创建一个hello world 的空项目 根据dll文件时多少位的就配多少,然后点击运行 将dll相关的头文件全部拷贝到测试项目中 将dll文件和lib也同时拷在测试文件的cpp同目录下 将编写dll ...

  6. oracle oci.dll无法加载_基于OGG 实现Oracle到Kafka增量数据实时同步

    背景 在大数据时代,存在大量基于数据的业务.数据需要在不同的系统之间流动.整合.通常,核心业务系统的数据存在OLTP数据库系统中,其它业务系统需要获取OLTP系统中的数据.传统的数仓通过批量数据同步的 ...

  7. go语言 不支持动态加载_动态语言支持

    go语言 不支持动态加载 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它 ...

  8. easyui tree动态加载_动态路由:Gin vs SpringMVC

     这两天在接触Gin,对它的动态路由功能比较感兴趣,特意做了笔记,顺便跟SpringMVC作下对比. 1.简介  Gin是使用Go/golang语言实现的HTTP Web框架.接口简洁,性能极高.截止 ...

  9. delphi listview1添加指定列_对表格的列进行批量处理的函数详解

    Table.TransformColumns Table.TransformColumns(table as table, transformOperations as list, optional ...

最新文章

  1. 挑战8门UDACITY课程学习方法总结
  2. 重新认识 Delphi
  3. GridView 控件的执行顺序
  4. Running Maven project on Tomcat from Eclipse
  5. linux(centOS7,mini),python环境的搭建
  6. 在linux中添加字典,为 Ubuntu 的 Vim 添加英文字典
  7. 解决idea的html代码中使用es6语法报错的问题
  8. Fushsia:一次对操作系统的重构
  9. AI对话机器人实现原理
  10. 基于单片机USB接口的温度控制器
  11. 斐讯k2路由虚拟服务器,斐讯K2P不死uboot分享带dhcp server功能
  12. 斐讯K3官改,安装onmp教程,回馈社区。
  13. Java常量池原理以及垃圾回收
  14. Label free定量蛋白质组学
  15. 如何购买阿里云服务器呢?
  16. nginx+fastdfs 502异常解决
  17. 码云最火开源项目 TOP 50
  18. C++ 学习(基础语法篇)
  19. 7-6 程序员买西瓜 (5分)
  20. 【pygame学习+实战】第一篇:游戏最小系统

热门文章

  1. jQuery+toggle
  2. 支付时报错java.lang.RuntimeException: 【微信统一支付】发起支付, returnCode != SUCCESS, returnMsg = appid和mch_id不匹配
  3. VB版双语对照制作助手
  4. Spring Boot基础
  5. 【BZOJ1433】【codevs2347】假期的宿舍,最大流
  6. 【BZOJ28431180】极地旅行社,LCT练习
  7. 每日小记2017.3.7
  8. 【英语学习】【WOTD】commemorate 释义/词源/示例
  9. Spring IOC(控制反转)思想笔记
  10. java old区_一次Jvm old过高的排查过程实战记录