0x01 前言

说起DLL劫持技术,相信大家都不会陌生,因为这种技术的应用比较广泛,比如木马后门的启动、破解程序的内存补丁、外挂插件的注入以及加密狗的模拟等。之所以DLL劫持技术深受黑客们的喜爱,主要是因为该技术可以有效的躲过大部分杀软,并且实现起来技术难度不大。DLL劫持技术也不是什么新技术,记得在《Windows核心编程》中也有提及相关技术。可是对我们广大初学者来说,DLL劫持技术就显得很神秘了,本系列教程将向大家详细讲解什么是DLL劫持、DLL劫持的形成原因及原理、最后还会以实例向大家讲解如何通过编程实现DLL劫持。
首先我们要了解Windows为什么可以DLL劫持呢?主要是因为Windows的资源共享机制。为了尽可能多得安排资源共享,微软建议多个应用程序共享的任何模块应该放在Windows的系统目录中,如kernel32.dll,这样能够方便找到。但是随着时间的推移,安装程序会用旧文件或者未向后兼容的新文件来替换系统目录下的文件,这样会使一些其他的应用程序无法正确执行,因此,微软改变了策略,建议应用程序将所有文件放到自己的目录中去,而不要去碰系统目录下的任何东西。
为了提供这样的功能,在Window2000开始,微软加了一个特性,强制操作系统的加载程序首先从应用程序目录中加载模块,只有当加载程序无法在应用程序目录中找到文件,才搜索其他目录。利用系统的这个特性,就可以使应用程序强制加载我们指定的DLL做一些特殊的工作。
举个例子来说吧,Windows的系统目录下有一个名为LPK.DLL的系统文件,程序运行时会在c:\Windows\system32文件夹下找到这个DLL文件并加载它。
我们也可以在cmd中使用tasklist /m |more查看运行的程序调用的dll文件

0x02 什么是dll劫持

根据前面说的Windows资源共享机制,操作系统加载程序首先从应用程序目录中加载模块。这一特性在注册表中也有体现:HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,如果为1,搜索的顺序为:应用程序所在目录->系统目录(用GetSystemDirectory获取)->16位系统目录->Windows目录(用GetWindowsDirectory获取)->运行程序的当前目录->PATH环境变量,如果为0,搜索顺序为:应用程序所在目录->运行程序的当前目录->系统目录(用GetSystemDirectory获取)->16位系统目录->Windows目录(用GetWindowsDirectory获取)->PATH环境变量。WindowsServer 2003默认值为1,WindowsXP/2000默认值为0或者没有这个键值。
但是不管是哪种情况,第一个搜索的肯定是应用程序的所在目录,这样就有机会让应用程序去加载我们的DLL。如果这个DLL和系统目录下的某个DLL同名,导出表也相同,功能就是加载系统目录下的那个DLL,并且将导出表转发到那个真实的DLL。这时DLL劫持就发生了。可以看出,构造一个符合上面要求的DLL,再将其放在可执行文件的目录即可轻松实现DLL劫持了。
回到顶部(go to top)

0x03 dll劫持破坏360复现

实验环境:windows7
360版本:360安全卫士11
首先生成一个dll


msfvenom -p windows/exec CMD="calc.exe" -f dll > lbw.dll


这里生成的恶意dll会调用cmd执行calc.exe(计算器),当然执行的程序也可以是木马程序。
我们使用Procmon来观察360缺少的dll(Procmon是微软出品用于监视Windows系统里程序的运行情况,监视内容包括该程序对注册表的读写对文件的读写网络的连接进程和线程的调用情况,procmon是一款超强的系统监视软件。)

Procmon配置规则如下


添加以上规则,注意规则的类型。
运行360,可以看到调用的dll以及dll具体路径

可以看到调用了系统的dll

修改msf生成的dll名为api-ms-win-core-synch-l1-2-0,扔进C:\Windows\system32文件夹里

结果:

重新执行360