使用微软Detours库进行DLL注入

devtools/2024/9/22 19:49:29/

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

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

DetourCreateProcessWithDllA

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

函数原型
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 注入到该进程中。

#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的扩展版本,提供了更多的灵活性和控制。

函数原型
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,并通过自定义进程创建例程添加自定义逻辑。

#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 文件注入到目标进程中。

函数原型
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 文件。

#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;
}

http://www.ppmy.cn/devtools/99443.html

相关文章

《图解设计模式》笔记(四)分开考虑

九、Bridge模式&#xff1a;将类的功能层次结构与实现层次结构分离 类的两个层次结构和作用 类的功能层次结构&#xff1a;希望增加新功能时 父类有基本功能&#xff0c;在子类中增加新功能 Something父类 …├─SomethingGood子类 想要再增加新功能 Something父类 …├─So…

虚幻游戏开发| 编辑器内正常运行但打包出错

示例错误1 在编辑器里可以正常跳转关卡&#xff0c;但是在打包模式不能。 需要去projectsetting把需要跳转的关卡添加到maps list 编辑器内运行正常&#xff0c;但打包后出现报错或者不同的表现&#xff0c;其他原因汇总&#xff1a; 1. 资源加载问题 延迟加载&#xff1a;…

【FESCO福利专区-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

STM32常用C语言知识总结

目录 一、引言 二、C 语言基础 1.数据类型 2.变量与常量 3.控制结构 4.数组与指针 5.字符串 6. extern变量声明 7.内存管理 三、STM32 中的 C 语言特性 1.位操作 2.寄存器操作 一、引言 STM32 作为一款广泛应用的微控制器&#xff0c;其开发离不开 C 语言的支持。C …

MATLAB中matlab.lang.makeValidName用法

目录 语法 说明 示例 构造有效的 MATLAB 标识符 使用指定的替换样式构造有效的 MATLAB 标识符 使用指定的替换样式构造有效的 MATLAB 标识符 使用指定的前缀构造有效的 MATLAB 标识符 确定修改的字符向量 matlab.lang.makeValidName的功能是根据输入字符串构造有效的 M…

基于WonderJourney生成电影级连续的3D场景视频

在本文中,我将详细记录在Windows环境下配置和使用WonderJourney项目的完整流程,包括环境搭建、常见问题的解决方案以及如何修改源码以兼容Windows系统。WonderJourney项目能够生成高度逼真的村庄视频,并允许用户通过配置文件对视频生成过程进行精细化控制。 由于官方文档在…

如何用Python实现山东省旅游数据爬虫与K-means满意度分析

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

pyinstaller pyqt5 pytest打包后报错no module unittest.mock

pyinstaller pyqt5 pytest打包后报错no module unittest.mock 在.spec文件下加上unittest.mock 打包时写成 pyinstaller --onefile --hidden-importunittest.mock --add-data "src\tests;src\tests" src/main.py