技术研究-从零开始学习DLL劫持
DLL劫持
DLL简介
在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
DLL加载顺序
如果程序需要加载一个相对路径
的dll文件,它将从当前目录下尝试查找,如果找不到,则按照如下顺序寻找:
windows xp sp2之前
Windows查找DLL的目录以及对应的顺序:
进程对应的应用程序所在目录;
当前目录(Current Directory);
系统目录(通过 GetSystemDirectory 获取);
16位系统目录;
Windows目录(通过 GetWindowsDirectory 获取);
PATH环境变量中的各个目录;
windows xp sp2之后
Windows查找DLL的目录以及对应的顺序(SafeDllSearchMode 默认会被开启):
默认注册表为:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
,其键值为1
进程对应的应用程序所在目录(可理解为程序安装目录比如C:\ProgramFiles\uTorrent)
系统目录(即%windir%system32);
16位系统目录(即%windir%system);
Windows目录(即%windir%);
当前目录(运行的某个文件所在目录,比如C:\Documents and Settings\Administrator\Desktop\test);
PATH环境变量中的各个目录;
windows 7 以上版本
从Windows7 之后, 微软为了更进一步的防御系统的DLL被劫持,将一些容易被劫持的系统DLL写进了一个注册表项中,该项下的DLL文件就会被禁止从EXE自身所在的目录下调用,而只能从系统目录SYSTEM32目录下调用,其注册表位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
自动化挖掘
批量寻找劫持
https://github.com/wietze/windows-dll-hijacking
1 | python generate_pmc_files.py |
单个查找劫持
https://github.com/knight0x07/ImpulsiveDLLHijack
编译完成后,把Prerequisites文件夹里的内容拷贝至ImpulsiveDLLHijack项目里
1 | ImpulsiveDLLHijack.exe -path xxx.exe |
这里使用navicat
进行测试,可见运行的时候会加载C:\Users\dyy\AppData\Local\Programs\Python\Python38\Scripts\oci.dll
使用cs生成恶意dll,重命名为oci.dll
后放置到该目录下
手动挖掘
Process Monitor查找可用dll,设置如下图所示
配置完可以保存导出配置,下次直接导入使用
使用GoogleUpdate.exe
进行测试,运行程序filter加载所使用的dll文件
这里可以看出来,当 GoogleUpdate.exe
程序运行的时候,会调用当前目录下的 goopdate.dll
文件
编写一个基础的弹窗dll
1 | #include <Windows.h> |
弹计算器
1 | // dllmain.cpp : 定义 DLL 应用程序的入口点。 |
CS上线
cs生成c的payload
生成的payload
填入到下面相应的位置上
1 | // 头文件 |
运行navicat
程序就会上线
DLL转发劫持
有时候当我们替换dll后,虽然可以执行命令,但是会产生报错
这时候我们可以使用AheadLib
工具,使恶意的DLL将原有的函数转发到原DLL中并且释放恶意代码
打开工具导入dll文件,会生成相应的cpp文件
直接转发函数,我们只能控制DllMain即调用原DLL时触发的行为可控
即时调用函数,可以在处理加载DLL时,调用具体函数的时候行为可控,高度自定义触发点,也称用来hook某些函数,获取到参数值
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1kvjv5bw3cr7k