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。