找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5406

积分

1

好友

738

主题
发表于 昨天 21:32 | 查看: 5| 回复: 0

DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”。在程序运行中,可能会需要一些相对独立的动态链接库,而这些预先放置在系统中的动态链接库文件。当我们执行某一个程序时,相应的DLL文件就会被调用。DLL 是一个包含可由多个程序同时使用的代码和数据的库,一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。

DLL劫持指的是,恶意程序通过劫持或者替换正常的动态链接库,欺骗正常程序加载精心准备的恶意动态链接库。DLL劫持的产生大多与动态链接库加载顺序有关,不同的系统查找DLL的目录以及对应的顺序略有差异,大概可以分为Windows XP SP2之前、在Windows XP SP2之后这两种情况。

在Windows XP SP2之前,Windows查找DLL的目录以及对应的顺序如下:

  • 进程对应的应用程序所在目录。
  • 当前目录(Current Directory)。
  • 系统目录(通过 GetSystemDirectory 获取)。
  • 16位系统目录。
  • Windows目录(通过 GetWindowsDirectory 获取)。
  • PATH环境变量中的各个目录。

在Windows XP SP2之后到Windows 7,引入了一个名为SafeDllSearchMode的安全机制,SafeDllSearchMode默认为开启状态,此时Windows查找DLL的目录以及对应的顺序如下。

  • 进程对应的应用程序所在目录。
  • 当前目录(Current Directory)。
  • 系统目录(通过 GetSystemDirectory 获取)。
  • 16位系统目录。
  • Windows目录(通过 GetWindowsDirectory 获取)。
  • PATH环境变量中的各个目录。

在Windows 7之后,在原来SafeDllSearchMode的规则下,额外引入了KnownDLLs概念,以缓解DLL劫持问题。KnownDLLs 是一个注册表项,位于 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs,此项下的所有匹配到的DLL文件就会被禁止从程序自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用。

编写测试DLL

测试DLL劫持漏洞需要编写一个用于测试的DLL程序,为了保证一定的通用性,该程序使用DllMain作为触发点,程序代码如下。

#include "pch.h"
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
switch (ul_reason_for_call)
{
       case DLL_PROCESS_ATTACH:
       MessageBoxA(0,"Process attach",0,0);
       break;
       case DLL_PROCESS_DETACH:
       MessageBoxA(0,"Process detach",0,0);
       break;
       case DLL_THREAD_ATTACH:
       MessageBoxA(0,"Thread attach",0,0);
       break;
       case DLL_THREAD_DETACH:
       MessageBoxA(0,"Thread detach",0,0);
       break;
}
return TRUE;
}

将以上代码编译为DLL,当程序存在DLL劫持漏洞,调用DllMain会弹出对应的消息框。

可以编写一个Demo程序,使用Windows api LoadLibraryA函数来加载这个DLL,程序代码如下:

#include <windows.h>
#include <stdio.h>
int main()
{
    HMODULE hModule = LoadLibraryA("payload.dll");
    FreeLibrary(hModule);
    return 0;
}

此时,运行该程序将使用LoadLibraryA函数加载测试DLL,弹出MessageBox对话框,如图所示。

命令行中执行测试程序并弹出错误对话框

手动挖掘DLL劫持漏洞

Putty.exe是知名的ssh连接客户端,本次使用Putty的0.62版本,演示如何挖掘一个可利用的DLL劫持漏洞,并使用上节编写的测试payload来触发MessageBox对话框。

首先启动Process Monitor,根据实际情况添加过滤条件,如图所示,过滤条件为进程名为Putty.exe的条目以及结果为NAME NOT FOUND的条目。

Process Monitor过滤进程名为putty.exe的条件

Process Monitor过滤结果为NAME NOT FOUND的条件

随后启动Putty.exe,捕获到以下条目。如图所示,可以看到Putty.exe尝试加载了UIAutomationCore.dll,但状态为NAME NOT FOUND,且该DLL名不在KnownDLLs列表中。

Process Monitor捕获的putty.exe加载DLL失败的日志列表

将编写的测试DLL放到Putty.exe同级目录,并重命名为UIAutomationCore.dll,点击putty.exe启动程序,如图所示,此时弹出了MessageBox对话框,证明成功挖掘出一个putty的DLL劫持漏洞。

PuTTY配置界面与触发的Process attach错误对话框

通过本次实验,介绍了如何手工挖掘一个入口点为DllMain的DLL劫持漏洞。实际上,除DllMain以外,DLL还有着很多其他的入口函数,通过更加深入的渗透测试与逆向分析,可以找到更多的DLL劫持漏洞。

使用DLLHSC自动挖掘DLL劫持漏洞

DLLHSC是一个C/C++编写的开源项目,下载地址为 https://github.com/ctxis/DLLHSC,主要用于DLL劫持漏洞的自动化挖掘。

使用如下命令,将启动程序并打印它所加载的非KnownDLLs列表,而且不是WinSxS依赖的DLL文件名,如图所示。

DLLHSC.exe -e putty.exe -lm

DLLHSC工具列出putty.exe加载的非KnownDLLs模块

使用如下命令,将加载可行性文件,并且Hook LoadLibrary和LoadLibraryEx函数,打印运行时加载的DLL文件名,如图所示。

DLLHSC.exe -e putty.exe -rt

DLLHSC工具Hook并打印putty.exe运行时加载的模块

自动化工具可以显著提高挖掘效率,但其原理仍基于对Windows DLL加载机制的理解。结合手工分析与工具辅助,是进行逆向工程与安全研究的有效途径。




上一篇:Claude Code Routines详解:定时、API与GitHub事件触发的云端自动化开发
下一篇:深度剖析Windows UAC绕过技术:原理、实例与防御
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-19 01:21 , Processed in 0.785773 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表