C++:DLL注入(附带源码)
2026/5/8 17:54:51 网站建设 项目流程

项目背景详细介绍

在 Windows 平台的系统级开发、安全研究、调试工具、游戏引擎以及反作弊/反外挂领域中,DLL 注入(DLL Injection)是一个极其重要、同时也非常经典的技术。

所谓 DLL 注入,本质上是:

让目标进程在其自身地址空间中加载我们指定的 DLL

一旦 DLL 被成功加载,DLL 内的代码就会以目标进程的上下文运行,从而实现:

  • 进程行为监控

  • 函数 Hook / API Hook

  • 调试与分析

  • 插件式扩展

  • 自动化控制

  • 逆向工程与安全研究

在真实工程与研究中,DLL 注入常见于:

  • 调试器 / 监控工具

  • 游戏 MOD / 插件系统

  • 性能分析工具

  • 安全软件(EDR、沙箱)

  • 反外挂 / 反调试研究

当然,需要明确强调的是:

DLL 注入是一项“中立技术”,其用途取决于使用者的目的

本文内容仅用于教学、系统原理理解与合法研究用途,不涉及任何违法行为。

本项目将通过一个最经典、最稳定、最容易理解的 DLL 注入方式,系统讲解:

C++ 中如何使用 Windows API 完成一次完整的 DLL 注入

该示例非常适合作为 Windows 系统编程、安全研究、逆向工程课程的教学案例


项目需求详细介绍

本项目的需求目标如下:

1. 功能需求

  1. 使用 C++ 实现 DLL 注入器(Injector)

  2. 向指定进程注入指定 DLL

  3. 使用远程线程方式加载 DLL

  4. DLL 成功注入后执行初始化代码

  5. 输出关键执行步骤信息

2. 技术要求

  1. 基于 Windows API

  2. 使用经典CreateRemoteThread + LoadLibrary注入方式

  3. 支持 Unicode(宽字符)

  4. 代码清晰、流程规范

3. 教学与工程要求

  1. 完整展示 DLL 注入的标准流程

  2. 明确区分注入器 EXE被注入 DLL

  3. 注释详尽,适合逐步教学

  4. 可作为后续 Hook / 注入技术的基础


相关技术详细介绍

1. DLL 注入原理概述

DLL 注入的核心思想是:

  1. 在目标进程中分配内存

  2. 将 DLL 路径写入目标进程内存

  3. 在目标进程中创建线程

  4. 让该线程调用LoadLibrary

这样,目标进程就会像自己主动加载 DLL 一样加载我们的 DLL。


2. 远程线程注入(Remote Thread Injection)

这是最经典、最基础的 DLL 注入方式,核心 API 包括:

  • OpenProcess

  • VirtualAllocEx

  • WriteProcessMemory

  • GetProcAddress

  • CreateRemoteThread

几乎所有 DLL 注入方式,都是在此基础上的变种或升级


3. DLL 入口点(DllMain)

当 DLL 被加载或卸载时,Windows 会调用:

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved );

这是 DLL 执行代码的第一个入口


实现思路详细介绍

本项目整体实现流程如下:

  1. 编写被注入 DLL

    • DllMain中执行测试逻辑

  2. 编写注入器程序

    • 打开目标进程

    • 分配远程内存

    • 写入 DLL 路径

    • 获取LoadLibraryW地址

    • 创建远程线程

  3. 等待注入完成

    • 确认 DLL 成功加载

该流程是Windows 下 DLL 注入的标准模板


完整实现代码

/**************************************************** * File: InjectedDll.cpp (被注入的 DLL) ****************************************************/ #include <Windows.h> BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved) { if (reason == DLL_PROCESS_ATTACH) { // 避免 DLL 线程通知,减少开销 DisableThreadLibraryCalls(hInstance); // 测试行为:弹出消息框 MessageBoxW(nullptr, L"DLL 注入成功!", L"Injected DLL", MB_OK); } return TRUE; } /**************************************************** * File: Injector.cpp (DLL 注入器 EXE) ****************************************************/ #include <Windows.h> #include <iostream> int main() { DWORD processId = 0; std::wcout << L"请输入目标进程 PID: "; std::wcin >> processId; // DLL 的完整路径(必须是绝对路径) const wchar_t* dllPath = L"C:\\Test\\InjectedDll.dll"; size_t pathSize = (wcslen(dllPath) + 1) * sizeof(wchar_t); // 打开目标进程 HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, processId ); if (!hProcess) { std::cerr << "OpenProcess failed\n"; return 1; } // 在目标进程中分配内存 LPVOID remoteMem = VirtualAllocEx( hProcess, nullptr, pathSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE ); if (!remoteMem) { std::cerr << "VirtualAllocEx failed\n"; CloseHandle(hProcess); return 1; } // 写入 DLL 路径 WriteProcessMemory( hProcess, remoteMem, dllPath, pathSize, nullptr ); // 获取 LoadLibraryW 地址 LPVOID loadLibraryAddr = GetProcAddress( GetModuleHandleW(L"kernel32.dll"), "LoadLibraryW" ); // 创建远程线程 HANDLE hThread = CreateRemoteThread( hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)loadLibraryAddr, remoteMem, 0, nullptr ); if (!hThread) { std::cerr << "CreateRemoteThread failed\n"; VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE); CloseHandle(hProcess); return 1; } // 等待 DLL 加载完成 WaitForSingleObject(hThread, INFINITE); // 清理资源 VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE); CloseHandle(hThread); CloseHandle(hProcess); std::cout << "DLL 注入完成\n"; return 0; }

代码详细解读(仅解读方法作用)

DllMain

DLL 的入口函数,在 DLL 被加载到目标进程时执行初始化逻辑。

OpenProcess

获取目标进程句柄,为后续操作提供权限基础。

VirtualAllocEx

在目标进程的虚拟地址空间中分配内存。

WriteProcessMemory

向目标进程写入 DLL 路径字符串。

GetProcAddress

获取LoadLibraryW在本进程中的地址(系统模块地址一致)。

CreateRemoteThread

在目标进程中创建线程并执行LoadLibraryW

main(Injector)

完成 DLL 注入的完整流程控制。


项目详细总结

通过本项目,你可以系统掌握:

  • DLL 注入的本质原理

  • Windows 进程内存操作

  • 远程线程注入的标准实现

  • DLL 与 EXE 协同工作的方式

这是Windows 系统底层与安全方向的必学 C++ 项目


项目常见问题及解答

Q1:为什么必须使用绝对路径?
A:目标进程无法解析注入器的相对路径。

Q2:64 位和 32 位能互相注入吗?
A:不能,位数必须一致。

Q3:会被杀毒软件拦截吗?
A:有可能,这是安全软件重点监控行为。


扩展方向与性能优化

  1. 反射 DLL 注入(Reflective Injection)

  2. APC 注入 / 线程劫持

  3. 手动映射(Manual Map)

  4. API Hook(IAT / Inline Hook)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询