C/C++实现DLL注入(入门),完整过程

C/C++:项目中的dll的构建和dll的导入函数并执行(VS2015) 当前内容主要为记录在VS2015中编写dll和在项目中导入dll并执行函数的操作(从hotspot中发现dll可以通过LoadLibrary加载并执行)加载和执行dl 阅读详情
AI摘要

这篇教程介绍了C/C++中如何实现DLL注入的入门步骤,包括创建DLL项目、使用Detours库、编写DLL代码、创建靶子程序以及编写DLL注入程序。教程详细解释了Detours的功能,并提供了详细的代码示例,帮助初学者理解DLL注入的核心思路和步骤。

什么是DLL注入

所谓DLL注入,就是将一个DLL(动态链接库)放入要被注入的进程的内存空间里,让它成为进程的一部分。

关于本教程

本教程是一个入门教程,实践的内容是用DLL注入一个自己写的简单的WinForms窗体程序,在DLL中使用了Detours库,用于修改被注入程序窗口提示函数的内存地址。
本教程使用的IDE为Visual Studio

关于Detours:

Detours是一个由微软开发的可以用于捕获系统API、拦截函数的函数库

需要创建的项目:

  1. 一个DLL项目
  2. 一个用于注入DLL的(中转)程序
  3. 一个用于被注入的靶子程序

开始!GET STARTED

第一步:创建一个DLL项目

在VS中创建一个DLL项目,新建源文件myhook.cpp

第二步:下载并准备好Detours

下载地址: https://github.com/microsoft/detours
解压后,打开x86/x64(根据自己的CPU选择) Native Tools Command Prompt
在这里插入图片描述
cd到当前目录后,输入nmake:
在这里插入图片描述
附完成后效果图:
在这里插入图片描述
目录结构如下:
在这里插入图片描述
将include目录下的detours.h与lib.X64目录下的detours.lib复制到项目根目录
右键项目,选择添加-现有项,选中以上两个文件。
在这里插入图片描述

第三步:写DLL代码

在myhook.cpp中写入如下代码:

#include "pch.h"
#include "detours.h"

// 该变量用于引用MessageBox函数
static int (WINAPI* RealMessageBox)(HWND, LPCTSTR, LPCTSTR, UINT) = MessageBox;

// 该函数是要替换的假MessageBox函数
static int WINAPI MyMessageBox(HWND, LPCTSTR, LPCTSTR, UINT) {
	return RealMessageBox(NULL, L"My Hook successfully cracked!", L"Hey", MB_OK);
}

void StartHook() {
	DetourRestoreAfterWith();
	// 开始Detour事务
	DetourTransactionBegin();
	// 更新线程信息(执行事务的线程)
	DetourUpdateThread(GetCurrentThread());
	// 将拦截的函数附加到原函数的地址上
	DetourAttach((PVOID*)&RealMessageBox, MyMessageBox);
	// 提交事务
	DetourTransactionCommit();
}

(提示C++新手:WINAPI是宏)
再打开dllmain.cpp,编辑代码如下(新增处已表明注释):

#include "pch.h"
#include "framework.h"

VOID __declspec(dllexport) exportFunction() { // 添加导出函数(内容随便写)
    OutputDebugString(L"导出函数执行!");
}

extern void StartHook(); // 添加myhook.cpp中的函数的声明

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: 
        StartHook(); // 添加启动钩子
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

完工,Ctrl+B生成。

第四步:创建用于被注入的(靶子)程序 [快速完成]

这里我们创建了一个简单的WinForms(C#)项目
在这里插入图片描述
双击打开Form1.cs设计,拖入一个按钮控件(如果找不到工具箱,请在上方选择视图-工具箱):
在这里插入图片描述
双击按钮,进入button1_Click()函数,写入:

private void button1_Click(object sender, EventArgs e)
{
	MessageBox.Show("正常的窗口文字");
}

效果:
在这里插入图片描述
好了,上方选择Release,Ctrl+B,环节完毕。

第五步:开始写DLL注入程序(中转站)[远程线程注入]

创建一个普通的C++控制台项目
先上代码:

#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{
    HANDLE ProcessHandle;
    HANDLE ThreadHandle;
    LPVOID MemoryPointer;
    wchar_t dllPath[] = L"D:\\hzyfiles\\C-workspace(VS)\\DLL注入-完整过程\\Dll1\\x64\\Release\\Dll1.dll"; // 这里写自己的路径
    DWORD pid;

    cout << "输入程序PID:";
    cin >> pid;

    cout << "正在打开进程...";
    ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, false, pid); // 打开进程
    if (!ProcessHandle) {
        cout << "失败!" << endl;
        return 1;
    }
    cout << "成功!" << endl;

    cout << "正在开辟虚拟内存...";
    MemoryPointer = VirtualAllocEx(ProcessHandle, NULL, sizeof(dllPath), MEM_COMMIT, PAGE_READWRITE);
    if (!MemoryPointer) {
        cout << "失败!" << endl;
        return 1;
    }
    cout << "成功!" << endl;

    cout << "正在写入内存...";
    if (!WriteProcessMemory(ProcessHandle, MemoryPointer, (LPVOID)dllPath, sizeof(dllPath), NULL)) {
        cout << "失败!" << endl;
        return 1;
    }
    cout << "成功!" << endl;

    PTHREAD_START_ROUTINE LoadLibraryFunctionPointer = (PTHREAD_START_ROUTINE)GetProcAddress(
        GetModuleHandle(L"Kernel32"),
        "LoadLibraryW"
    );

    if (!LoadLibraryFunctionPointer) {
        cout << "Kernel32-LoadLibraryW函数未找到!" << endl;
        return 1;
    }

    cout << "正在创建远程线程...";
    ThreadHandle = CreateRemoteThread(ProcessHandle, NULL, 0, LoadLibraryFunctionPointer, MemoryPointer, 0, NULL);
    if (!ThreadHandle) {
        cout << "失败!" << endl;
        return 1;
    }
    cout << "成功!" << endl;
    CloseHandle(ProcessHandle);
    CloseHandle(ThreadHandle);

    return 0;
}
如果你是新手,我们可以一起分析一下这段代码的核心思路:

在靶子程序中执行LoadLibraryW函数,来达到将自己的DLL注入到靶子程序的效果。

核心步骤如下:
  1. 打开进程,获得进程句柄(OpenProcess)
  2. 在进程的虚拟内存中开辟一块空间(大小即为我们DLL路径所需要的内存空间)(目的:让靶子程序能够识别这块内存,从而将其带入为LoadLibraryW的参数)(VirtualAllocEx)
  3. 将DLL的路径写入这块内存(WriteProcessMemory)
  4. 远程在靶子进程内创建一个线程,在线程内执行LoadLibrary函数(CreateRemoteThread)

打开WinForms程序,记录其PID
附:CMD中的PID获取命令:tasklist | findstr [程序名],记录第二列的数字即可

程序执行后,我们再点击按钮,可以看到:
在这里插入图片描述
NICE

总结(仅重点)

  1. Detours库可以执行修改函数地址的操作
  2. DLL注入(远程线程注入)的核心只有四步,见上一节

如文章有不足之处,请大佬指点,3Q

C++ 动态链接库DLL创建及使用 完成以上步骤后,可将Dll项目中的 xxx.dll文件生成到应用程序中,可调用xxx.dll、xxx.lib和头文件。① 生成lib和dll文件到本项目目录中(生成到——> \x64\Debug 中)点击右侧项目,右键——添加 ——新建项目(ctrl+shift+a)② 重新生成,出现生成成功字样,生成到本项目的Debug中。,如果不在一个解决方案的文件夹中,请确定指定文件夹。填入项目名称,勾选:将解决方案和项目放在同一目录中。(不修改,默认保存到解决方案目录中)右键解决方案——添加——新建项目。 阅读详情

相关推荐

C语言游戏外挂:C++简单 DLL 注入超级玛丽!

通过C语言编写一个DLL文件和一个EXE文件,其中DLL包含作弊功能,运行EXE后将DLL注入游戏,使得游戏仅靠自身进程便可以实现作弊功能。 下面是小编整理好的一套C/C++资料,加小编C/C++编程学习群:825414254,获取系统性学习C/C++的学习资料 对象分析 要用的API函数简单介绍 编写测试效果 总体评价 对象分析 注:本次游戏对象为Super Mario XP 没有更新所以...

3317

【网络杂烩 ---> 网络安全】DLL 注入 --- c/c++ 代码实现(超 · 详细)

DLL 注入(英语:DLL injection)是一种涉及计算机信息安全的特殊编程技术。它可以强行使一个 进程加载某个 动态链接库以在其私有地址空间内运行指定 代码(往往是恶意代码)。DLL 注入的常见手段是用外部 DLL 库覆盖一个程序原先的 DLL 库,目的是实现该程序的作者未预期的结果。比如,注入的代码可以 挂钩(Hook)系统消息或系统调用,以达到读取密码框的内容等危险目的,而一般编程手段无法达成这些目的。

扑腾的江鱼复习仓库 5754

C# HOOK / DLL Inject(注入)

满屏幕都是“你好,你已被注入”是不是感到很好玩呢? HOOK注入不是一个新技术 但是呢 有时候你还真 需要求助它 虽然我一般注入不使用HOOK方式但它却是最简便的一个方式 下面我就来介绍一下代码吧 首先我们使用一个可以编写标准Win32 DLL的语言(C++/E/Delphi)等。 下面为C++的一个示例代码:        这里只是娱乐的说说它还没有真正的注入 但是你可以在这里编写自

8569

C++实现DLL注入的完整过程

1 简介 网上确实有关于DLL注入的过程,但是很多写的都不全,或者内容有点老旧。 DLL文件注入的原理是:接管被注入应用的控制权,并在应用程序运行的内存中开辟一条线程运行DLL文件中的入口函数的代码。 项目需求:向一个.txt文件注入dll,然后会自动弹出一个窗口 工具:VS2019 2 DLL动态链接库的编写 在VS2019中新建项目-选择【动态链接库(DLL)】 不要勾选:【将解决方案和项目放在同一目录中】 创建完项目后,会有四个文件 framework.h pch. h dllmain.

qq_43851684的博客 1万+

C++ 实现DLL注入技巧

在使用DLL注入技术时,我们需要编写一个注入程序,将目标进程中的DLL文件注入到指定的内存地址中,从而使得目标进程可以调用这个DLL文件中定义的函数。获取目标进程的句柄之后,我们需要在目标进程的地址空间中分配一段内存空间,用来存放我们将要注入的DLL文件。获取了LoadLibraryA函数的地址之后,我们就可以将目标进程中的一个线程创建为一个远程线程,并让这个远程线程调用LoadLibraryA函数,从而将我们注入的DLL文件载入到目标进程中。在上述代码中,dwSize是我们将要注入的DLL文件的大小。

DarcyCode的博客 641

C/C++劫持技术(函数劫持、dll注入、动态库注入、HOOK)

(1) 定义一个函数指针指向目标函数,这里目标函数是system例如:detour在realse模式生效(因为VS在Debug模式下已经把程序中的函数劫持了)//定义一个函数指针指向目标函数(2) 定义与目标函数原型相同的函数替代目标函数//3.定义新的函数替代目标函数,需要与目标函数的原型相同int result = MessageBoxA(0,"是否允许该程序调用system命令","提示",1);{//调用旧的函数}else{

墨痕诉清风的博客 3390

【C++】DLL文件加载的两种方式

关于C++加载DLL文件的方式

weixin_44984705的博客 3963

【智慧城市】GIS数据获取-获取道路/水路数据

【GIS数据获取】获取道路/水路数据

qq_16599281的博客 4749

[DLL 注入] C/C++ 修改EIP实现DLL注入

背景 挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器码和数据拷贝到里面去,然后修改目标进程EIP使其强行跳转到我们拷贝进去的相关机器码位置,执行相关,然后跳转回来。下面的例子是实现DLL注入,但是和平时说的远程代码注入在注入的逻辑上不同,但是同时都是用到了一个重要的结论就是:很多系统dll的导出函数地址在不同进程中,是一样的. 注意两个问题 1.call 如果直接是个地址的话要这么计算     call RVA - call指令的下一条地址 RVA - (nowaddres

LYSM 1156

Vue3+Element Plus:构建现代化后台管理系统的核心布局实践

本文详细介绍了使用Vue3和Element Plus构建现代化后台管理系统的核心布局实践。从开发环境搭建到核心布局设计,再到动态菜单与路由集成,提供了完整的解决方案和优化技巧。特别适合需要快速开发高效、响应式后台系统的开发者,通过实战案例展示了如何提升开发效率和系统性能。

weixin_28309723的博客 458

C++游戏开发入门:从环境配置到第一个完整项目

C++ 作为游戏开发领域的关键语言,其学习路径常因语法枯燥而令初学者却步。以项目驱动的方式学编程,能帮助学习者将变量、循环、函数、指针等基础概念融入实际游戏逻辑中,获得即时反馈与完整项目经验。掌握合适的开发环境是高效实践的前提,例如在 Windows 下使用 VS Code 搭配 MinGW-w64 编译器,配合调试器与构建脚本,即可搭建轻量可扩展的 C++ 游戏开发工作流。此类课程通常面向无基础人群,从控制台小游戏逐步过渡到带游戏循环的完整作品,过程中还需关注性能观察、素材授权与版本管理。无论你是刚接触编

weixin_30621959的博客 541

C/C++ DLL反射式注入内存手动映射

首先计算得到基地址的偏移量,也就是实际的 DLL 加载地址减去 DLL 的推荐加载地址(保存在 NT可选头的 ImageBase 中,实际 DLL 加载地址是我们调用 VirtualAlloc()的返回值。首先使用 _ReturnAddress() 获取当前函数的返回地址,因为调用这个函数是在 ReflectiveLoader 的内部,因此从这个地址向上遍历,找 0x4d ,0x5a 就可以定位到 DLL 的 PE 文件头所在的虚拟地址 (o゚v゚)ノ。将 DLL 的 PE文件头和各个节复制到对应的位置。

微软技术分享 9801

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图:Discuz X3.5的系统信息,上传许可为1024MB(1GB)论坛为局域网论坛,仅供内部同事交流使用!使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图:选择上传附件(提示可以最大上传100M) 下图:模拟上传84M的文件(

骚团长的博客 1828

C/C++ 实现DLL注入原理详解 含完整代码

本文介绍了Windows平台下使用LoadLibraryW和CreateRemoteThread实现DLL注入的原理与方法。通过CreateRemoteThread在目标进程创建线程,调用LoadLibraryW函数加载指定DLL,关键步骤包括:在目标进程分配内存写入DLL路径、获取LoadLibraryW地址、创建远程线程执行注入。文中提供了完整的注入器代码示例和测试DLL实现,成功注入后DLL会弹出消息框。该方法需要管理员权限,使用时需正确设置目标进程ID和DLL路径。

u011550456的博客 630

别再写前端了!用Gradio 3.x + HuggingFace Spaces,5分钟把你的Python算法变成网页应用

本文介绍如何利用Gradio 3.x和HuggingFace Spaces快速将Python算法转化为网页应用,无需前端开发经验。通过5行代码和简单的Git命令,即可实现专业级Web界面部署,大幅提升算法展示效率。特别适合算法工程师和数据科学家快速分享模型成果。

weixin_33443333的博客 332

AFSim2.9.0学习笔记 —— 2、AFSim的Wizard软件概述(ArkSIM集成开发环境 (IDE))

AFSim2.9.0学习笔记 —— 2、AFSim的Wizard软件详述(ArkSIM集成开发环境 (IDE))

918

C/C++ 实现远程线程DLL注入

远程线程注入是最常用的一种注入技术,该技术利用的核心API是 `CreateRemoteThread()` 这个API可以运行远程线程,其次通过创建的线程调用 `LoadLibraryA()` 这个函数动态载入指定的DLL即可实现运行DLL,消息钩子注入原理是利用Windows系统中`SetWindowsHookEx()`这个API函数,它可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个特性,我们可以将DLL注入到指定进程中,

微软技术分享 1万+

优快云独家首发!万字长文,YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程!小白也能看懂!掌握了这个就掌握了魔改YOLO的核心!

🍀🍀🍀YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程,全网最强,学不会算我输!!!

Coding... 1万+

c++实现DLL注入的几种方式

经过几天的折腾,找到了几个dll注入的方法,但是不意外的是,都暂时没法注入到LOL中,毕竟有进程保护在那,OpenProcess这一步就直接被拒绝了,提升Debug权限也没用,下面记录一些代码,希望能够得到大牛指导,一个人学习有点蒙。目前实测了CreateRemoteThread,QueueUserApc,和ReflectInject三种注入方式,具体可以参考https://zhuanlan.zh

qq_33544988的博客 1万+

Error response from daemon: Get “https://index.docker.io/v1/search?q=nginx&n=25“:

在使用docker seach 命令搜索镜像的时候遇到这个错误,docker pull是可以正常下载镜像的,关于这个问题,本文提供解决方案,完全可行。

猿小白的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C/C++ 实现常用的线程注入

各种API远程线程注入的方法,分别是 远程线程注入,普通消息钩子注入,全局消息钩子注入,APC应用层异步注入,ZwCreateThreadEx强力注入,纯汇编实现的线程注入等。

微软技术分享 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C/C++ 手工实现IAT导入表注入劫持

DLL注入有多种方式,今天介绍的这一种注入方式是通过修改导入表,增加一项导入DLL以及导入函数,我们知道当程序在被运行起来之前,其导入表中的导入DLL与导入函数会被递归读取加载到目标空间中,我们向导入表增加导入函数同样可以实现动态加载,本次实验用到的工具依然是上次编写的PE结构解析器。

微软技术分享 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C/C++ 远程DLL线程注入

DLL远程线程注入是一种技术,常用于在一个进程的地址空间中加载并执行动态链接库(DLL)。这种注入方式通常涉及到两个进程:目标进程和注入进程。

微软技术分享 8480

14种DLL注入技术

本文只是介绍各个注入的核心思想,详细的可以参照文末链接里的源码,一看就明白。本文只是介绍各个注入的核心思想,详细的可以参照文末链接里的源码,一看就明白。本文只是介绍各个注入的核心思想,详细的可以参照文末链接里的源码,一看就明白。 第一种 CreateRemoteThread远程线程调用 DLL注入是指向某一个特定的进程空间强制插入一个特定的DLL文件映像,值得注意的是这种插入是强制性的插...

liuhaidon1992的博客 5674

C/C++ 修改EIP实现DLL注入

挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器码和数据拷贝到里面去,然后修改目标进程EIP使其强行跳转到我们拷贝进去的相关机器码位置,执行相关,然后跳转回来。下面的例子是实现DLL注入,但是和平时说的远程代码注入在注入的逻辑上不同,但是同时都是用到了一个重要的结论就是:很多系统dll的导出函数地址在不同进程中,是一样的.

微软技术分享 1万+
上一篇: Java多线程 - thread.interrupt()并不能强制停止线程
Final Dev
博客等级 码龄6年 7粉丝 7原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值