Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用微软Detours库进行DLL注入

使用微软Detours库进行DLL注入

原创
作者头像
王瑞MVP
发布于 2024-08-20 08:53:29
发布于 2024-08-20 08:53:29
22700
代码可运行
举报
运行总次数:0
代码可运行

Detours 是微软开发的一个强大的 Windows API 钩子库,用于监视和拦截函数调用。它广泛应用于微软产品团队和众多独立软件开发中,旨在无需修改原始代码的情况下实现函数拦截和修改。本篇文章旨在帮助开发者更好地理解和应用Detours库进行DLL注入操作,从而实现对目标进程的高效控制和管理。无论您是刚接触Detours的新手,还是希望深入了解其高级功能的老手,这篇文章都将提供有价值的参考。

通常情况下Detours库只会用于函数挂钩,但实际上Detours库不仅可以拦截函数,还提供了对动态链接库的注入功能。本章将详细讲解每个注入函数的使用方法、参数和实际应用。

DetourCreateProcessWithDllA

该函数用于创建一个新进程并在创建时注入一个DLL动态链接库文件。其重要参数仅有两个,参数1用于指定被注入程序路径,参数11用于指定DLL文件路径。

函数原型
代码语言:c
代码运行次数:0
运行
AI代码解释
复制
BOOL DetourCreateProcessWithDllA(
    LPCSTR lpApplicationName,       // 被注入程序路径
    LPSTR lpCommandLine,            // 命令行参数
    LPSECURITY_ATTRIBUTES lpProcessAttributes,  // 进程安全属性
    LPSECURITY_ATTRIBUTES lpThreadAttributes,   // 线程安全属性
    BOOL bInheritHandles,           // 是否继承句柄
    DWORD dwCreationFlags,          // 创建标志
    LPVOID lpEnvironment,           // 环境变量
    LPCSTR lpCurrentDirectory,      // 当前目录
    LPSTARTUPINFOA lpStartupInfo,   // 启动信息
    LPPROCESS_INFORMATION lpProcessInformation, // 进程信息
    LPCSTR lpDllName,               // DLL 文件路径
    PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA // 自定义进程创建例程
);
使用示例

以下代码示例展示了如何使用 DetourCreateProcessWithDllA 函数,在启动 Win32Project.exe 进程时将 hook.dll 注入到该进程中。

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <windows.h>
#include <iostream>
#include "detours.h"

#pragma comment(lib, "detours.lib")

int main(int argc, char *argv[])
{
    STARTUPINFOA si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    const char* exePath = "D://Win32Project.exe";
    const char* dllPath = "D://hook.dll";

    if (DetourCreateProcessWithDllA(
        exePath,
        NULL,
        NULL,
        NULL,
        TRUE,
        CREATE_DEFAULT_ERROR_MODE,
        NULL,
        NULL,
        &si,
        &pi,
        dllPath,
        NULL
    )) {
        printf("dwProcessId = %d \n", pi.dwProcessId);
        printf("dwThreadId = %d \n", pi.dwThreadId);
        printf("hProcess = %d \n", pi.hProcess);
        printf("hThread = %d \n", pi.hThread);

        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    } else {
        printf("DLL 注入失败,错误码: %d\n", GetLastError());
    }

    system("pause");
    return 0;
}

DetourCreateProcessWithDllExA

DetourCreateProcessWithDllExA是DetourCreateProcessWithDllA的扩展版本,提供了更多的灵活性和控制。

函数原型
代码语言:c
代码运行次数:0
运行
AI代码解释
复制
BOOL DetourCreateProcessWithDllExA(
    LPCSTR lpApplicationName,       // 被注入程序路径
    LPSTR lpCommandLine,            // 命令行参数
    LPSECURITY_ATTRIBUTES lpProcessAttributes,  // 进程安全属性
    LPSECURITY_ATTRIBUTES lpThreadAttributes,   // 线程安全属性
    BOOL bInheritHandles,           // 是否继承句柄
    DWORD dwCreationFlags,          // 创建标志
    LPVOID lpEnvironment,           // 环境变量
    LPCSTR lpCurrentDirectory,      // 当前目录
    LPSTARTUPINFOA lpStartupInfo,   // 启动信息
    LPPROCESS_INFORMATION lpProcessInformation, // 进程信息
    LPCSTR lpDllName,               // DLL 文件路径
    PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA, // 自定义进程创建例程
    PVOID pContext                  // 自定义上下文
);
使用示例

以下代码示例展示了如何使用 DetourCreateProcessWithDllExA 函数,在启动 Win32Project.exe 进程时注入 hook.dll,并通过自定义进程创建例程添加自定义逻辑。

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <windows.h>
#include <iostream>
#include "detours.h"

#pragma comment(lib, "detours.lib")

// 自定义的进程创建例程
BOOL WINAPI MyCreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine,
	LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes,
	BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment,
	LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
{
	// 自定义逻辑
	printf("自定义进程创建例程被调用\n");

	// 调用原函数
	return CreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes,
		bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
}

int main(int argc, char *argv[])
{
	STARTUPINFOA si = { sizeof(si) };
	PROCESS_INFORMATION pi;
	const char* exePath = "D://Win32Project.exe";
	const char* dllPath = "D://hook.dll";

	if (DetourCreateProcessWithDllExA(
		exePath,
		NULL,
		NULL,
		NULL,
		TRUE,
		CREATE_DEFAULT_ERROR_MODE,
		NULL,
		NULL,
		&si,
		&pi,
		dllPath,
		MyCreateProcessA
		))
	{
		printf("dwProcessId = %d \n", pi.dwProcessId);
		printf("dwThreadId = %d \n", pi.dwThreadId);
		printf("hProcess = %d \n", pi.hProcess);
		printf("hThread = %d \n", pi.hThread);

		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
	}
	else {
		printf("DLL 注入失败,错误码: %d\n", GetLastError());
	}

	system("pause");
	return 0;
}

DetourCreateProcessWithDllsA

DetourCreateProcessWithDllsA函数与DetourCreateProcessWithDllA和DetourCreateProcessWithDllExA的使用方法类似,但它允许在进程创建时将多个 DLL 文件注入到目标进程中。

函数原型
代码语言:c
代码运行次数:0
运行
AI代码解释
复制
BOOL DetourCreateProcessWithDllsA(
    LPCSTR lpApplicationName,       // 被注入程序路径
    LPSTR lpCommandLine,            // 命令行参数
    LPSECURITY_ATTRIBUTES lpProcessAttributes,  // 进程安全属性
    LPSECURITY_ATTRIBUTES lpThreadAttributes,   // 线程安全属性
    BOOL bInheritHandles,           // 是否继承句柄
    DWORD dwCreationFlags,          // 创建标志
    LPVOID lpEnvironment,           // 环境变量
    LPCSTR lpCurrentDirectory,      // 当前目录
    LPSTARTUPINFOA lpStartupInfo,   // 启动信息
    LPPROCESS_INFORMATION lpProcessInformation, // 进程信息
    DWORD nDlls,                    // DLL 的数量
    LPCSTR *rlpDlls,                // DLL 文件路径数组
    PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA // 自定义进程创建例程
);
使用示例

以下代码示例展示了如何使用 DetourCreateProcessWithDllsA 函数,在启动 Win32Project.exe 进程时注入多个 DLL 文件。

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <windows.h>
#include <iostream>
#include "detours.h"

#pragma comment(lib, "detours.lib")

int main(int argc, char *argv[])
{
    STARTUPINFOA si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    const char* exePath = "D://Win32Project.exe";

    const char* dlls[] = {
        "D://hook1.dll",
        "D://hook2.dll"
    };

    DWORD nDlls = sizeof(dlls) / sizeof(dlls[0]);

    // 开始注入
    if (DetourCreateProcessWithDllsA(
        exePath,
        NULL,
        NULL,
        NULL,
        TRUE,
        CREATE_DEFAULT_ERROR_MODE,
        NULL,
        NULL,
        &si,
        &pi,
        nDlls,
        dlls,
        NULL
    )) {
        printf("dwProcessId = %d \n", pi.dwProcessId);
        printf("dwThreadId = %d \n", pi.dwThreadId);
        printf("hProcess = %d \n", pi.hProcess);
        printf("hThread = %d \n", pi.hThread);

        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    } else {
        printf("DLL 注入失败,错误码: %d\n", GetLastError());
    }

    system("pause");
    return 0;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
7.2 通过API创建新进程
创建新的进程是Windows程序开发的重要部分,它可以用于实现许多功能,例如进程间通信、并行处理等。其中,常用的三种创建进程的方式分别是WinExec()、ShellExecute()和CreateProcessA(),这三种创建进程的方式各有特点。如果需要创建简单进程或从其他程序启动新进程,可以使用WinExec()或ShellExecute()函数。如果需要对新进程进行更精细的配置,例如控制进程参数、指定安全级别、传递特定的命令和参数等,可以使用CreateProcessA()函数。
王瑞MVP
2023/09/22
2410
技术讨论 | Windows 10进程镂空技术(木马免杀)
在Win10 x64环境下替换正常的进程,是一个比较高超的技术。使用该技术,可以内存执行病毒、木马。在文件层面实现免杀。可以把一个木马使用DES加密,放在资源里。执行时,从资源里释放出来,在内存里进行DES解密,注入到一个系统的进程中。
FB客服
2018/07/30
2K0
技术讨论 | Windows 10进程镂空技术(木马免杀)
C/C++ MinHook 库的使用技巧
在上面的各种Hook挂钩方式中,我们都是在手写封装代码,但这样的方式并不高效,真正的生产环境中我们必须使用现成的Hook库,常用的Hook库有免费开源的MinHook和商业的Detours Hook,这里我们就选择介绍MinHook这个迷你函数库,该Hook库是完全开源免费的,使用起来也非常的简单.
王瑞MVP
2022/12/28
9930
6.3 应用动态内存补丁
动态内存补丁可以理解为在程序运行时动态地修改程序的内存,在某些时候某些应用程序会带壳运行,而此类程序的机器码只有在内存中被展开时才可以被修改,而想要修改此类应用程序动态补丁将是一个不错的选择,动态补丁的原理是通过CreateProcess函数传递CREATE_SUSPENDED将程序运行起来并暂停,此时程序会在内存中被解码,当程序被解码后我们则可以通过内存读写实现对特定区域的动态补丁。
王瑞MVP
2023/09/21
2620
6.3 应用动态内存补丁
4.5 MinHook 挂钩技术
MinHook是一个轻量级的Hooking库,可以在运行时劫持函数调用。它支持钩子API函数和普通函数,并且可以运行在32位和64位Windows操作系统上。其特点包括易于使用、高性能和低内存占用。MinHook使用纯汇编语言实现,在安装和卸载钩子时只需要短暂地锁定目标线程,因此对目标线程的影响非常小。
王瑞MVP
2023/09/18
5520
4.5 MinHook 挂钩技术
Windows内核之进程基本含义以及进程的创建「建议收藏」
1.2 还有一个是地址空间,它包括全部可运行模块或DL L 模块的代码和数据。它还包括动态内存分配的空间。
全栈程序员站长
2022/07/10
7190
Windows内核之进程基本含义以及进程的创建「建议收藏」
win32之进程概念
  学习WindowsAPI. 之前.我们必须理解什么是进程. 在windows环境下.进程就是一个运行起来的exe程序
IBinary
2018/09/28
8220
win32之进程概念
C/C++ Inline Hook 钩子编写技巧
Hook 技术通常被称为钩子技术,Hook技术是Windows系统用于替代中断机制的具体实现,钩子的含义就是在程序还没有调用系统函数之前,钩子捕获调用消息并获得控制权,在执行系统调用之前执行自身程序,简单来说就是函数劫持,本笔记将具体介绍应用层Hook的实现机制。
王瑞MVP
2022/12/28
2.7K0
C/C++ Inline Hook 钩子编写技巧
钓鱼文档碎碎念(一)
本文将简单介绍使用宏代码进行钓鱼的方法,并使其可以回连到CobaltStrike. CobaltStrike.自带有宏钓鱼功能。可以使用如下步骤进行创建:
鸿鹄实验室
2021/03/31
8790
钓鱼文档碎碎念(一)
WinExec, ShellExecute,CreateProcess 区别
本文转载自WinExec, ShellExecute,CreateProcess 区别 其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
ccf19881030
2020/05/29
1.3K0
Windows 编程(多进程)
进程从来不执行任何东西,它只是纯种的容器,若要使进行完成某项操作,它必 须拥有一个在它的环境中运行的纯种,此线程负责执行包含在进程的地址空 间的中的代码.也就是,真正完成代码执行的是线程,而进程只是纯种的容器, 或者说是线程的执行环境.
全栈程序员站长
2022/07/13
1.1K0
红队免杀必会:R3下常用HOOK技术
最近看了《加密与解密》,跟着大佬们的思路学习了Hook相关知识,如理解有误请不吝赐教,以免误导他人
Gamma实验室
2021/12/31
2.3K0
红队免杀必会:R3下常用HOOK技术
API钩取
继续学习《逆向工程核心原理》,本篇笔记是第四部分:API钩取,主要介绍了调试钩取、DLL注入实现IAT钩取、API代码修改钩取和全局API钩取等内容
红客突击队
2022/09/29
8990
API钩取
从Win服务启动UI程序
从windows服务启动一个带UI程序的界面,这个需求在xp中是很随意的,从Vista开始似乎没有那么随意了,因为Vista中加入了Session的概念,那么什么是Session,我想这篇文章介绍的应该比我权威的多。Session隔离介绍
用户1175783
2019/09/18
1.1K0
反调试——9——调试器原理
无论是通过打开进程还是附加进程来实现调试,都只是开始调用的方式不一样,在调试器和操作系统之间的交互方式都是相同的。
冬夜先生
2021/10/20
9580
【操作系统】Windows进程间的通信
进程通常上被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动,一个程序可以对应多个进程。
半生瓜的blog
2023/05/13
9490
【操作系统】Windows进程间的通信
实战 | 进程启动技术的思路和研究
通过常用的api来创建进程是常规启动进程的方式,最常用的几个api有WinExec、ShellExecute、CreateProcess,我们一个一个来看一下
HACK学习
2021/11/12
1.2K0
WinExec, ShellExecute, CreateProcess
在vc++ 程序中运行另一个程序的方法有三个: WinExec(),ShellExcute()和CreateProcess()
全栈程序员站长
2022/09/18
1.5K0
CreatePipe、CreateProcess函数
管 道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另 一进程就可以从管道的另一端将其读取出来。匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。
全栈程序员站长
2022/09/17
1.4K0
17.1 隐藏执行CMD命令
本章内容涉及使用Socket API和CMD命令行工具实现本地CMD命令执行、无管道正向CMD和无管道反向CMD三种功能。执行本地CMD实现使用CreateProcess函数创建一个新的CMD进程,并将标准输入、输出和错误输出重定向到当前进程的标准输入、输出和错误输出。无管道正向CMD和无管道反向CMD使用WSASocket函数创建TCP套接字,并将CMD进程的标准输入、输出和错误输出重定向到套接字的句柄上,通过网络连接实现远程命令执行功能。
王瑞MVP
2023/10/22
4600
17.1 隐藏执行CMD命令
相关推荐
7.2 通过API创建新进程
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验