DLL劫持备忘录
来源:互联网 发布:电信4g网络 编辑:程序博客网 时间:2024/04/29 23:42
DLL劫持备忘录
Windows DLL劫持的几个知识点
## 0x01 DLL劫持原理 ##
1、每个DLL都有一个入口函数(DLLMain),系统在特定环境下会调用DLLMain。在下面的事件发生时就会调用dll的入口函数:
1. 进程装载DLL。 2. 进程卸载DLL。 3. DLL在被装载之后创建了新线程。 4. DLL在被装载之后一个线程被终止了。
2、个DLL文件中都包含有一个导出函数表也叫输出表(存在于PE的.edata节中)
3、LoadLibray
调用LoadLibrary函数时,系统会依次从下面几个位置去查找所需要调用的DLL文件。
5. 程序所在目录。 6. 加载 DLL 时所在的当前目录。 7. 系统目录即 SYSTEM32 目录。 8. 16位系统目录即 SYSTEM 目录。 9. Windows目录。 10. PATH环境变量中列出的目录
微软为了防止DLL劫持漏洞的产生,在XP SP2之后,添加了一个SafeDllSearchMode的注册表属性。注册表路径如下:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\SafeDllSearchMode
当SafeDllSearchMode的值设置为1,即安全DLL搜索模式开启时,查找DLL的目录顺序如下:
11. 程序所在目录 12. 系统目录即 SYSTEM32 目录。 13. 16位系统目录即 SYSTEM 目录。 14. Windows目录。 15. 加载 DLL 时所在的当前目录。 16. PATH环境变量中列出的目录。
XP系统之后发布的Windows,默认情况下未开启安全DLL搜索模式。
4、只能从System32下调用的DLL
微软为了更进一步地防御系统DLL被劫持,将一些容易被劫持的系统DLL写入进了一个注册表中,凡是此项下的DLL文件就会被禁止从EXE自身所在目录下调用,而只能从系统目录System32目录下调用。注册表路径如下:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
5、Windows操作系统通过“DLL路径搜索目录顺序”和“KnownDLLs注册表项”的机制来确定应用程序所要调用的DLL的路径,之后,应用程序就将DLL载入了自己的内存空间,执行相应的函数功能。
6、微软又莫名其妙的允许用户在上述注册表路径中添加“ExcludeFromKnownDlls”注册表项,排除一些被“KnownDLLs注册表项”机制保护的DLL。也就是说,只要在“ExcludeFromKnownDlls”注册表项中添加你想劫持的DLL名称就可以对该DLL进行劫持,不过修改之后需要重新启动电脑才能生效。
7、劫持思路
在上述描述加载DLL的整个过程中,DLL劫持漏洞就是在系统进行安装“DLL路径搜索目录顺序”搜索DLL的时候发生的。无论安全DLL搜索模式是否开启,系统总是首先会从程序所在目录加载DLL,如果没有找到就按照上面的顺序依次进行搜索。那么,利用这个特性,攻击者就可以伪造一个相同名称,相同导出函数表的一个“假”DLL,并将每个导出函数转向到“真”DLL。将这个“假”DLL放到程序的目录下,当程序调用DLL中的函数时就会首先加载“假”DLL,在“假”DLL中攻击者已经加入了恶意代码,这时这些恶意代码就会被执行,之后,“假”DLL再将DLL调用流程转向“真”DLL,以免影响程序的正常执行。
0x02 如何编写一个劫持DLL
编写一个用于劫持指定DLL的DLL文件,需要两个步骤:
1. 查看被劫持的DLL的导出函数表。 2. 编程实现劫持DLL向原DLL的导出函数的转发,并加入你的“恶意代码”。
0x03 劫持windows的DLL
要分析一个应用程序是否存在劫持系统DLL的漏洞,需要这么几个步骤:
1. 启动应用程序 2. 使用Process Explorer等类似软件查看该应用程序启动后加载的动态链接库。 3. 从该应用程序已经加载的DLL列表中,查找在上述“KnownDLLs注册表项”中不存在的DLL。 4. 编写第三步中获取到的DLL的劫持DLL。 5. 将编写好的劫持DLL放到该应用程序目录下,重新启动该应用程序,检测是否劫持成功。
0×04 DLL劫持漏洞的防御
对于DLL劫持漏洞产生的原因,并不能单一的归咎于微软,只能说这是微软的一个“设计缺陷”,要从根本上防御DLL劫持漏洞,除了微软提供的“安全DLL搜索模式”和“KnownDLLs注册表项”机制保护DLL外,开发人员必须要做更多来保护应用程序自身。开发过程中,调用LoadLibrary,LoadLibraryEx等会进行模块加载操作的函数时,使用模块的物理路径作为参数。在程序调用DLL时使用“白名单”+ “签名”进行DLL的验证。或者在开发应用程序时,在代码开头调用SetDllDirectory函数,把当前目录从DLL的搜索顺序列表中删除,不过这个API只能在打了KB2533623补丁的Windows7,2008上使用。-_-!
不过即使使用了这些防御措施,DLL劫持漏洞依旧可能会存在,更何况目前很多厂商对于DLL劫持漏洞都是持“忽略”的态度。
[参考链接]
老树开新花:DLL劫持漏洞新玩法 - Freebuf
- DLL劫持备忘录
- dll劫持
- DLL劫持技术
- 如何防止DLL劫持
- DLL劫持防御策略
- DLL劫持防御策略
- dll劫持技术
- DLL劫持技术
- DLL补丁劫持制作
- DLL劫持漏洞原理
- [DLL劫持] 1 DLL劫持之DLL基础(1)
- [DLL劫持] 2 DLL劫持之DLL基础(2)
- [DLL劫持] 3 DLL劫持之实践 例子
- DLL注入 之线程劫持
- DLL劫持的发展历程
- DLL劫持漏洞技术原理
- Hex workshop DLL劫持洞洞
- WIN7下DLL劫持,注入
- 关于机器学习的领悟与反思(张志华北大数学系教授)
- 数值的正则
- 关于STM32定时器中TI1FP1 与TI1FP2及相关话题
- State Estimation for Robotics_2.1.2_Bayes' Rule and Inference
- 史上最浅显易懂的Git教程!
- DLL劫持备忘录
- 纯PHP实现定时器任务(Timer)
- //2.使用宏将一个数二进制中的奇数位和偶数为进行交换。 #include<stdio.h> #include<stdlib.h> #define EXH(x) \ ((x & 0x5555555
- redis 参数优化
- 内部类
- Spring Security 权限控制
- 蓝桥-区间内K大数
- Redis作为消息队列服务场景应用案例分析
- 微信小程序自定义轮播图swiper dots默认样式