news 2026/6/10 20:18:42

C++:DLL注入(附带源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++:DLL注入(附带源码)

项目背景详细介绍

在 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)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 11:05:53

iOS系统定制新境界:无需越狱实现个性化iPhone的终极方案

iOS系统定制新境界&#xff1a;无需越狱实现个性化iPhone的终极方案 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite 为什么你的iPhone需要个性化定制&#xff1f; 你是否曾经感到困惑&#…

作者头像 李华
网站建设 2026/6/10 7:29:42

ResNet18性能优化:TensorRT加速指南

ResNet18性能优化&#xff1a;TensorRT加速指南 1. 背景与挑战&#xff1a;通用物体识别中的效率瓶颈 在当前AI应用广泛落地的背景下&#xff0c;通用物体识别已成为智能监控、内容审核、辅助驾驶等场景的核心能力。基于ImageNet预训练的ResNet-18模型因其结构简洁、精度适中…

作者头像 李华
网站建设 2026/6/10 14:54:45

纪念币预约神器:5分钟搞定全自动预约流程

纪念币预约神器&#xff1a;5分钟搞定全自动预约流程 【免费下载链接】auto_commemorative_coin_booking 项目地址: https://gitcode.com/gh_mirrors/au/auto_commemorative_coin_booking 还在为纪念币预约时手速不够快而烦恼吗&#xff1f;auto_commemorative_coin_bo…

作者头像 李华
网站建设 2026/6/10 12:41:11

E-Hentai漫画资源批量获取技术解决方案

E-Hentai漫画资源批量获取技术解决方案 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 面对海量漫画资源难以高效获取的困境&#xff0c;传统的手动保存方式已无法满足…

作者头像 李华
网站建设 2026/6/10 19:43:03

超详细版:Verilog实现一位全加器全流程解析

从零开始&#xff1a;用 Verilog 实现一位全加器的完整实践在数字电路的世界里&#xff0c;有些模块看似简单&#xff0c;却是整个系统大厦的地基。一位全加器&#xff08;Full Adder&#xff09;正是这样的存在——它只处理三个比特的加法&#xff0c;却支撑起了从计算器到CPU…

作者头像 李华
网站建设 2026/6/10 15:54:08

PCL2-CE社区版启动器:打造你的专属Minecraft游戏管家

PCL2-CE社区版启动器&#xff1a;打造你的专属Minecraft游戏管家 【免费下载链接】PCL2-CE PCL2 社区版&#xff0c;可体验上游暂未合并的功能 项目地址: https://gitcode.com/gh_mirrors/pc/PCL2-CE 还在为繁琐的Minecraft启动流程而烦恼吗&#xff1f;想要一款既稳定又…

作者头像 李华