劫持与反劫持

核心提示「来源: |web安全工具库 ID:websec-tools」DLL劫持原理学习0x01 什么是DLL?百科:DLL文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它

"来源:| |web安全工具库id: websec-tools "

DLL劫持原理学习

0x01什么是DLL?

百科全书:

DLL是动态链接库文件,也叫“应用扩展”,是软件文件的一种。在Windows中,很多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放在系统中。当我们执行一个程序时,会调用相应的DLL文件。一个应用程序可以使用多个DLL文件,并且一个DLL文件也可以由不同的应用程序使用。这种DLL文件称为共享DLL文件。

简而言之:

DLL是一个包含代码和数据的库,可以被多个程序同时使用。例如,在Windows操作系统中,Comdlg32 DLL执行与对话框相关的常见功能。因此,每个程序都可以使用这个DLL中包含的函数来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。

0x02程序运行时DLL的加载顺序

Windows查找XP SP2之前的DLL目录以及对应的顺序:进程对应的应用程序所在的目录;当前目录;系统目录;16位系统目录;Windows目录;PATH环境变量中的每个目录;栗子:对于文件系统,比如doc文档打开会由应用office打开,office运行时会加载系统的一个dll文件。如果我们将系统的dll文件替换成恶意的dll,我们会把DLL和doc文档放在一起,运行的时候会在当前目录下找到DLL,这样就会优先于系统目录下的DLL执行。

在Windows xp sp2之后,Windows会查找DLL目录和相应的顺序:

默认的注册表是HKEY _本地_机器系统当前控制集控制会话管理器 safedllsearchmode,它的键值是1。

对应于进程的应用程序的目录;系统目录;16位系统目录;Windows目录;当前目录;PATH环境变量中的每个目录;Windows7或以上系统没有SafeDllSearchMode而是采用KnownDLLs,所以该项下的所有DLL文件将被禁止从EXE本身所在的目录调用,只能从系统目录即SYSTEM32目录调用。其注册位置:

机器 HKEY _本地_机器系统当前控制集控制会话管理器 knowndlls

最后,Windows2003以上和win7以上的操作系统通过“DLL路径搜索目录序列”和“KnownDLLs注册表项”的机制来确定应用程序要调用的DLL的路径。之后,应用程序将DLL加载到自己的内存空中,并执行相应的函数。

对应于进程的应用程序的目录;系统目录;16位系统目录;Windows目录;当前目录;PATH环境变量中的每个目录;0x03写入DLL

Vs2019-动态链接库项目

每个dll都有一个dllmian.cpp源文件,默认如下:

// dllmain.cpp:定义DLL应用程序的入口点。# include " PCH . h " bool API entry dllmain { switch//根据调用原因选择不同的加载方式{case DLL_PROCESS_ATTACH: // DLL由程序加载case DLL_THREAD_ATTACH: // DLL由线程加载case DLL_THREAD_DETACH: // DLL由线程卸载case DLL_PROCESS_DETACH: //DLL由程序中断卸载;}返回TRUE}

头文件:framework.h

# pragma once # define Win32 _ lean _ and _ mean//从Windows头文件中排除很少使用的内容// Windows头文件#include

pch.h

// pch.h:这是预编译头文件。//下面列出的文件只编译一次,这提高了未来版本的性能。//这也会影响IntelliSense性能,包括代码完成和许多代码浏览功能。//但是,如果在两次构建之间更新了这里列出的任何文件,所有这些文件都将被重新编译。//不要在这里添加需要频繁更新的文件,这样会使性能优势失效。# ifndepfpch _ h # define PCH _ h//在此添加要预编译的头文件# include " framework . h " # endif//PCH _ h

举个栗子:

介绍windows.h,用messagebox函数做一个演示:

dllmain.cpp

# include " PCH . h " # include " windows . h " int add { return;} void message { MessageBox}

框架. h

# pragma once # define Win32 _ lean _ and _ mean//从Windows头文件中排除很少使用的内容// Windows头文件#include //这种声明方式在C语言中是强制修饰的,C的默认约定是__cdecl。//这样编译的DLL中有两个导出函数:add,message。没有任何修饰。extern " C " _ _ declspec int addextern "C" __declspec void消息;

生成->生成解决方案并获取dll。

0x04调用DLL

调用python DLL

导入ctypesdll = ctypes。CDLLa=dll.funca

++加载时的动态链接

#include "iostream"using namespace std;#pragma commentextern "C" __declspec int add;extern "C" __declspec void message;int main { cout

 
友情链接
鄂ICP备19019357号-22