当前位置: 首页 > news >正文

使用微软Detours库进行DLL注入

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【JAVA】阿里巴巴 EasyExcel:高效的Excel处理解决方案
  • 【java】RuoYi-Vue前后端分离版本-登陆请求流程解析
  • OpenAI推出GPT-4o微调功能
  • Nuitka 打包 exe 软件步骤
  • JSON, YAML, XML, CSV交互可视化
  • 设计模式六大原则(一)--单一职责原则
  • 一站式NVR模组解决方案:基于海思 3520D芯片的完整源码与系统集成
  • 基于Python的机器学习系列(7):多元逻辑回归
  • GT IP中的Sequence Max Skew
  • Git入门 -- 分支
  • 基于人工智能、三维视觉、混合现实等技术的智慧能源开源了
  • 使用SSMS连接和查询 SQL Server 实例
  • 基于深度学习的环境感知系统
  • 设计模式-结构型模式(第五章)
  • 【C++】01背包问题暴力,记忆,动态规划解法
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Asm.js的简单介绍
  • gcc介绍及安装
  • Java Agent 学习笔记
  • JAVA 学习IO流
  • JWT究竟是什么呢?
  • ng6--错误信息小结(持续更新)
  • Protobuf3语言指南
  • React Transition Group -- Transition 组件
  • React16时代,该用什么姿势写 React ?
  • SpringCloud集成分布式事务LCN (一)
  • webpack4 一点通
  • windows下mongoDB的环境配置
  • 包装类对象
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 开发基于以太坊智能合约的DApp
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 少走弯路,给Java 1~5 年程序员的建议
  • 跳前端坑前,先看看这个!!
  • 源码安装memcached和php memcache扩展
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 怎么将电脑中的声音录制成WAV格式
  • 《天龙八部3D》Unity技术方案揭秘
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $.ajax()
  • (Charles)如何抓取手机http的报文
  • (Java数据结构)ArrayList
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (四)汇编语言——简单程序
  • (五)c52学习之旅-静态数码管
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原创) cocos2dx使用Curl连接网络(客户端)