DLL劫持原理

系统有一套标准的搜索DLL路径的规则,这套规则又分为两种搜索模式,安全搜索模式,非安全搜索模式。

默认情况下启用安全DLL搜索模式。要禁用此功能,需创建HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode注册表值并将其设置为0。

 

如果启用了SafeDllSearchMode,则搜索顺序如下:

1.应用程序所在的目录。使用GetModuleFileName获取exe所在的目录

2.系统目录即SYSTEM32目录。使用GetSystemDirectory函数获取此目录的路径。

3.16位系统目录即SYSTEM的目录。

4.Windows目录。使用GetWindowsDirectory函数获取此目录的路径。

5.加载DLL时所在的当前目录。使用GetCurrentDirectory获取此目录的路径

6.PATH环境变量中列出的目录。

 

如果禁用了SafeDllSearchMode,则搜索顺序如下:

  1. 应用程序所在的目录
  2. 加载DLL时所在的当前目录。
  3. 系统目录即SYSTEM32目录
  4. 16位系统目录即SYSTEM的目录。
  5. Windows目录。
  6. PATH环境变量中列出的目录。

 

如果一个程序所需的DLL在本机的Known DLLs列表中存在,系统将直接使用这个已知的DLL而不会去搜索DLL。

计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs。

Windows操作系统通过“DLL路径搜索目录顺序”和“KnownDLLs注册表项”的机制来确定应用程序所要调用的DLL的路径,之后,应用程序就将DLL载入了自己的内存空间,执行相应的函数功能。

不过,微软又莫名其妙的允许用户在上述注册表路径中添加“ExcludeFromKnownDlls”注册表项,排除一些被“KnownDLLs注册表项”机制保护的DLL。也就是说,只要在“ExcludeFromKnownDlls”注册表项中添加你想劫持的DLL名称就可以对该DLL进行劫持,不过修改之后需要重新启动电脑才能生效。

在上述描述加载DLL的整个过程中,DLL劫持漏洞就是在系统进行安装“DLL路径搜索目录顺序”搜索DLL的时候发生的。无论安全DLL搜索模式是否开启,系统总是首先会从程序所在目录加载DLL,如果没有找到就按照上面的顺序依次进行搜索。那么,利用这个特性,攻击者就可以伪造一个相同名称,相同导出函数表的一个“假”DLL,并将每个导出函数转向到“真”DLL。将这个“假”DLL放到程序的目录下,当程序调用DLL中的函数时就会首先加载“假”DLL,在“假”DLL中攻击者已经加入了恶意代码,这时这些恶意代码就会被执行,之后,“假”DLL再将DLL调用流程转向“真”DLL,以免影响程序的正常执行。

 

 

如何编写一个劫持的DLL?

编写一个用于劫持指定DLL的DLL文件,需要两个步骤:

1.查看被劫持的DLL的导出函数表。

2.编程实现劫持DLL向原DLL的导出函数的转发,并加入你的恶意代码

 

提供一个version.dll劫持的源码

链接: https://pan.baidu.com/s/1NdBAYcfzBmuTOo_xFuPrQQ 提取码: dxms

 

最后发两个相关的链接:

一款通用的DLL劫持

https://github.com/anhkgg/SuperDllHijack

一个批量验证DLL劫持的工具

https://bbs.pediy.com/thread-255384.htm

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
易语言是一种简单易学的编程语言,可以用来编写Windows下的应用程序。在编写dll劫持补丁时,可以使用易语言来实现。 首先,dll劫持是指通过修改被劫持的进程加载的dll路径或名称,使其加载恶意的dll文件。编写dll劫持补丁实际上是为了修复这个漏洞,使被劫持的进程加载正确的dll文件。 在易语言中,可以使用WinAPI函数来完成这个任务。首先,需要用到的函数有以下几个:LoadLibrary函数,用于加载dll文件;GetModuleFileName函数,用于获取正在运行的进程模块的文件名;GetWindowsDirectory函数,用于获取Windows目录;GetProcAddress函数,用于获取函数地址;SetWindowText函数,用于设置窗口文本。 具体的步骤如下: 1. 使用GetModuleFileName函数获取当前运行的进程的文件名; 2. 使用GetWindowsDirectory函数获取Windows目录; 3. 使用SetWindowText函数设置窗口文本,提示正在修复dll劫持; 4. 使用LoadLibrary函数加载正确的dll文件; 5. 使用GetProcAddress函数获取正确的函数地址; 6. 修改被劫持的函数指针为正确的地址; 7. 修复完成后,使用SetWindowText函数恢复窗口文本。 以上就是使用易语言编写dll劫持补丁的基本思路和步骤。需要注意的是,这只是一种简单的办法,不能解决所有的dll劫持问题,对于复杂的劫持行为可能需要使用其他更底层的编程语言和技术进行修复。同时,在使用这种修复方法时,也要遵循法律法规,确保程序的合法性和正当性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值