1、DLL劫持漏洞原理
在Windows系统中,为了节省内存和实现代码重用,微软在Windows操作系统中实现了一种共享函数库的方式。这就是DLL(Dynamic Link Library),即动态链接库,这种库包含了可由多个程序同时使用的代码和数据。
每个DLL都有一个入口函数(DLLMain),系统在特定环境下会调用DLLMain。在下面的事件发生时就会调用dll的入口函数:
1.进程装载DLL。
2.进程卸载DLL。
3.DLL在被装载之后创建了新线程。
4.DLL在被装载之后一个线程被终止了。
windows xp sp2之后
微软为了防止DLL劫持漏洞的产生,在XP SP2之后,添加了一个SafeDllSearchMode的注册表属性。注册表路径如下:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\SafeDllSearchMode
当SafeDllSearchMode的值设置为1,即安全DLL搜索模式开启时,查找DLL的目录顺序如下:
1.程序所在目录
2.系统目录即 SYSTEM32 目录。
3.16位系统目录即 SYSTEM 目录。
4.Windows目录。
5.加载 DLL 时所在的当前目录。
6.PATH环境变量中列出的目录。
windows 7 以上版本
系统没有了SafeDllSearchMode 而采用KnownDLLs,那么凡是此项下的DLL文件就会被禁止从exe自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用,其注册表位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
2、下面我们结合AheadLib工具进行DLL劫持
这是劫持前的运行样子:
运行AheadLib.exe,生成.cpp文件,复制下其中的代码,在VC环境中创建DLL项目,将代码粘贴上去,加入一段我们自己的代码:
1 | MessageBox(NULL,"劫持成功!!!",TEXT("DLL Path"),MB_ICONSTOP); |
将原MsgDll.dll文件改名为a.dll,编译,生成的.dll文件改名为MsgDll.dll,将MsgDll.dll文件放入到notepad.exe文件目录下,点击运行,可以看到劫持成功。