dll侧加载_动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...
动态载入 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)...相关推荐
- 【转载】动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...
原文地址:https://www.cnblogs.com/westsoft/p/5936092.html 动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行 ...
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
x动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 G ...
- dll侧加载_win7系统开机提示xxxdll模块已加载但找不到入口点的解决方法
很多小伙伴都遇到过win7系统开机提示xxxdll模块已加载但找不到入口点的困惑吧,一些朋友看过网上零散的win7系统开机提示xxxdll模块已加载但找不到入口点的处理方法,并没有完完全全明白win7 ...
- dll侧加载_WORD打开时出现加载DLL错误解决方法
WORD 打开时出现加载 DLL 错误解决方法 1 . 接下来看看解决办法, 按组合键 WIN + R 或者按开始 --- 运行, 打开运行窗口, 2 .在运行对话框中输入或者复制粘贴 " ...
- vs2019加载调试动态库dll文件
创建一个hello world 的空项目 根据dll文件时多少位的就配多少,然后点击运行 将dll相关的头文件全部拷贝到测试项目中 将dll文件和lib也同时拷在测试文件的cpp同目录下 将编写dll ...
- oracle oci.dll无法加载_基于OGG 实现Oracle到Kafka增量数据实时同步
背景 在大数据时代,存在大量基于数据的业务.数据需要在不同的系统之间流动.整合.通常,核心业务系统的数据存在OLTP数据库系统中,其它业务系统需要获取OLTP系统中的数据.传统的数仓通过批量数据同步的 ...
- go语言 不支持动态加载_动态语言支持
go语言 不支持动态加载 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它 ...
- easyui tree动态加载_动态路由:Gin vs SpringMVC
这两天在接触Gin,对它的动态路由功能比较感兴趣,特意做了笔记,顺便跟SpringMVC作下对比. 1.简介 Gin是使用Go/golang语言实现的HTTP Web框架.接口简洁,性能极高.截止 ...
- delphi listview1添加指定列_对表格的列进行批量处理的函数详解
Table.TransformColumns Table.TransformColumns(table as table, transformOperations as list, optional ...
最新文章
- 挑战8门UDACITY课程学习方法总结
- 重新认识 Delphi
- GridView 控件的执行顺序
- Running Maven project on Tomcat from Eclipse
- linux(centOS7,mini),python环境的搭建
- 在linux中添加字典,为 Ubuntu 的 Vim 添加英文字典
- 解决idea的html代码中使用es6语法报错的问题
- Fushsia:一次对操作系统的重构
- AI对话机器人实现原理
- 基于单片机USB接口的温度控制器
- 斐讯k2路由虚拟服务器,斐讯K2P不死uboot分享带dhcp server功能
- 斐讯K3官改,安装onmp教程,回馈社区。
- Java常量池原理以及垃圾回收
- Label free定量蛋白质组学
- 如何购买阿里云服务器呢?
- nginx+fastdfs 502异常解决
- 码云最火开源项目 TOP 50
- C++ 学习(基础语法篇)
- 7-6 程序员买西瓜 (5分)
- 【pygame学习+实战】第一篇:游戏最小系统
热门文章
- jQuery+toggle
- 支付时报错java.lang.RuntimeException: 【微信统一支付】发起支付, returnCode != SUCCESS, returnMsg = appid和mch_id不匹配
- VB版双语对照制作助手
- Spring Boot基础
- 【BZOJ1433】【codevs2347】假期的宿舍,最大流
- 【BZOJ28431180】极地旅行社,LCT练习
- 每日小记2017.3.7
- 【英语学习】【WOTD】commemorate 释义/词源/示例
- Spring IOC(控制反转)思想笔记
- java old区_一次Jvm old过高的排查过程实战记录