一、背景介绍
在 Windows 平台下,DLL(Dynamic Link Library)注入是一项非常经典且重要的技术。它的本质是:
让目标进程在不知情或未主动加载的情况下,加载并执行我们指定的 DLL
DLL 注入在多个领域都有实际应用:
1. 常见应用场景
(1)调试与开发辅助
- 给第三方程序注入日志模块
- Hook API 以观察行为
- 插桩统计函数调用情况
Windows 平台下 C++ 实现 DLL 注入的技术教程。利用 OpenProcess、VirtualAllocEx、WriteProcessMemory 和 CreateRemoteThread 等 Windows API,将指定 DLL 路径写入目标进程内存并执行 LoadLibraryW 完成加载。内容包含原理分析、API 流程、完整代码实现及常见问题解答,适用于逆向工程与安全研究学习。
在 Windows 平台下,DLL(Dynamic Link Library)注入是一项非常经典且重要的技术。它的本质是:
让目标进程在不知情或未主动加载的情况下,加载并执行我们指定的 DLL
DLL 注入在多个领域都有实际应用:
DLL 注入几乎是 Windows 进程模型的'必修课',它涉及:
不理解 DLL 注入,就无法真正理解 Windows 用户态程序是如何协作的。
本项目将从以下四个层面,完整实现并讲透一个标准 DLL 注入器:
实现一个 基于 LoadLibrary 的经典 DLL 注入器,要求:
每个进程都有独立的虚拟地址空间:
当进程调用:
LoadLibrary("xxx.dll");
Windows 会:
DllMain(DLL_PROCESS_ATTACH)DLL 注入的关键点:让目标进程执行 LoadLibrary
Windows 提供了一个极其关键的 API:
CreateRemoteThread
它允许:
这正是 DLL 注入的'突破口'。
为了把 DLL 路径传给目标进程,需要:
| API | 作用 |
|---|---|
| OpenProcess | 获取目标进程句柄 |
| VirtualAllocEx | 在目标进程中分配内存 |
| WriteProcessMemory | 向目标进程写数据 |
| VirtualFreeEx | 释放远程内存 |
DLL 注入 ≠ 魔法,本质是 API 组合
流程如下:
我们不直接'拷贝 DLL',而是:
让目标进程自己加载 DLL
这是最稳定、最兼容、最经典的注入方式。
优点:
缺点:
逻辑分为四个模块:
DllMain/************************************************************
* 文件:InjectDll.cpp
* 描述:基于 LoadLibrary 的 DLL 注入器
************************************************************/
#include <windows.h>
#include <iostream>
#include <string>
/**
* @brief 向指定进程注入 DLL
*
* @param pid 目标进程 ID
* @param dllPath DLL 的完整路径
* @return true 注入成功
* @return false 注入失败
*/
bool InjectDll(DWORD pid, const std::wstring& dllPath) {
// 1. 打开目标进程
HANDLE hProcess = OpenProcess(
PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION |
PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,
FALSE, pid
);
if (!hProcess) {
std::wcerr << L"OpenProcess failed!" << std::endl;
return false;
}
// 2. 在目标进程中申请内存,用于存放 DLL 路径
size_t size = (dllPath.length() + 1) * sizeof(wchar_t);
LPVOID remoteMemory = VirtualAllocEx(
hProcess, nullptr, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE
);
if (!remoteMemory) {
CloseHandle(hProcess);
return false;
}
// 3. 将 DLL 路径写入目标进程
BOOL writeResult = WriteProcessMemory(
hProcess, remoteMemory, dllPath.c_str(), size, nullptr
);
if (!writeResult) {
VirtualFreeEx(hProcess, remoteMemory, 0, MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
// 4. 获取 LoadLibraryW 的地址
HMODULE hKernel32 = GetModuleHandleW(L"kernel32.dll");
FARPROC loadLibraryAddr = GetProcAddress(hKernel32, "LoadLibraryW");
if (!loadLibraryAddr) {
VirtualFreeEx(hProcess, remoteMemory, 0, MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
// 5. 在目标进程中创建远程线程
HANDLE hThread = CreateRemoteThread(
hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)loadLibraryAddr, remoteMemory, 0, nullptr
);
if (!hThread) {
VirtualFreeEx(hProcess, remoteMemory, 0, MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
// 6. 等待远程线程执行完成
WaitForSingleObject(hThread, INFINITE);
// 7. 清理资源
CloseHandle(hThread);
VirtualFreeEx(hProcess, remoteMemory, 0, MEM_RELEASE);
CloseHandle(hProcess);
return true;
}
/************************************************************
* 文件:main.cpp
* 描述:注入器入口
************************************************************/
int main() {
DWORD pid;
std::wcout << L"请输入目标进程 PID:";
std::wcin >> pid;
std::wstring dllPath = L"C:\\Test\\Inject.dll";
if (InjectDll(pid, dllPath)) {
std::wcout << L"注入成功!" << std::endl;
} else {
std::wcout << L"注入失败!" << std::endl;
}
return 0;
}
/************************************************************
* 文件:InjectDll.dll(示例)
************************************************************/
#include <windows.h>
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) {
if (fdwReason == DLL_PROCESS_ATTACH) {
MessageBoxW(nullptr, L"DLL 注入成功!", L"Inject", MB_OK);
}
return TRUE;
}
作用:
作用:
作用:
作用:
作用:
本项目完整展示了:
这是:
✅ 逆向工程必学 ✅ Windows API 深入理解 ✅ Hook / 注入 / 安全研究基础
答:
答:
答:
可以,例如:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online