news 2026/4/23 17:51:36

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/4/23 14:43:53

C++:无锁链表(附带源码)

项目背景详细介绍在现代高并发系统中&#xff0c;锁&#xff08;mutex / spinlock&#xff09;并不是免费的。随着 CPU 核心数不断增加&#xff0c;传统“加锁保护共享数据”的方式&#xff0c;会逐渐暴露出一系列问题&#xff1a;线程频繁阻塞、唤醒&#xff0c;系统调用开销巨…

作者头像 李华
网站建设 2026/4/23 14:41:46

BooruDatasetTagManager:从图片标注小白到高手的进阶指南

BooruDatasetTagManager&#xff1a;从图片标注小白到高手的进阶指南 【免费下载链接】BooruDatasetTagManager 项目地址: https://gitcode.com/gh_mirrors/bo/BooruDatasetTagManager 还在为海量图片标注而头疼吗&#xff1f;传统手工标注不仅效率低下&#xff0c;还容…

作者头像 李华
网站建设 2026/4/23 15:54:18

2025零基础实战:三步搞定视频字幕智能提取

2025零基础实战&#xff1a;三步搞定视频字幕智能提取 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测、字幕内容提取。A GU…

作者头像 李华
网站建设 2026/4/23 14:48:13

从零实现基于电路仿真circuits网页版的稳压电源项目应用

用指尖搭建电源&#xff1a;在电路仿真网页版中从零实现一个稳压电源系统你有没有过这样的经历&#xff1f;想做个单片机小项目&#xff0c;却卡在“怎么给它稳定供电”这一步。买模块太贵&#xff0c;自己搭又怕烧板子——别急&#xff0c;今天我们不焊一根线、不插一块芯片&a…

作者头像 李华
网站建设 2026/4/23 15:44:18

StructBERT模型比较:选择最佳分类方案

StructBERT模型比较&#xff1a;选择最佳分类方案 1. 引言&#xff1a;AI 万能分类器的时代来临 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本分类是构建智能系统的核心能力之一。无论是客服工单自动归类、用户意图识别&#xff0c;还是舆情监控与新闻分类…

作者头像 李华
网站建设 2026/4/23 12:21:51

6个超实用内容解锁技巧:轻松实现付费墙绕过的方法详解

6个超实用内容解锁技巧&#xff1a;轻松实现付费墙绕过的方法详解 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 你是否曾经遇到这样的情况&#xff1a;一篇看似精彩的文章&#xff…

作者头像 李华