首页 本地进程DLL注入
文章
取消

本地进程DLL注入

0X00 前言

DLL注入,是向一个正在运行的进程注入代码的过程。我们注入的代码以DLL的形式存在。本文将DLL作为payload的用法,并演示如何在当前进程中加载恶意DLL文件。

0X01 DLL demo

这里笔者用一个简单的MessageBox 来作为演示demo

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
#include <stdio.h>
#include <windows.h>
#include "pch.h"

void MsgBox() {
    MessageBoxA(0,"ring0rl.github.io","blog",MB_OK);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: {
        MsgBox();
        break;
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

可以先运行看一下,可见可以成功弹窗

0x02 本地进程注入

在诸多Windows API 中我们可以使用 LoadLibrary 来加载DLL。这个函数使用磁盘上的 DLL 路径并将其加载到调用进程的地址空间中,在本文中,笔者采用的调用进程是当前进程。加载 DLL 将运行其入口点,从而运行MsgBox函数 ,使其运行我们的dll。

下面的代码将 DLL 的名称作为命令行参数,并使用LoadLibrary加载它 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <windows.h>

int main(int argc,char* argv[]) {
	if (argc < 2) {
		printf("[!] 请输入要注入的dll");
		return -1;
	}

	printf("[+] 正在注入 \"%s\" 当前进程的PID为%d \n",argv[1],GetCurrentProcessId());

	printf("[+] 正在加载dll...\n");

	if (LoadLibraryA(argv[1]) == NULL) {
		printf("[!] 注入失败 %d\n",GetLastError());
		return -1;
	}

	printf("[+] 注入成功!\n");

	return 0;
}

可见注入成功,成功弹窗

0x03 结果验证

要进一步验证我们的DLL是否已加载到进程中,我们可以验证当前进程的模块列表来检索我们的DLL。

0x04 小结

本文介绍了本地进程注入DLL的方法,并通过代码加以实现,有本地进程注入必然有远程进程注入,后续笔者将接着讨论远程进程注入DLL。

注:本文仅用于安全研究和学习之用

本文由作者按照 CC BY 4.0 进行授权