首页 > 其他分享 >使用微软Detours库进行DLL注入

使用微软Detours库进行DLL注入

时间:2024-08-20 16:49:04浏览次数:12  
标签:NULL 微软 LPCSTR DLL Detours printf 进程 pi

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

标签:NULL,微软,LPCSTR,DLL,Detours,printf,进程,pi
From: https://www.cnblogs.com/LyShark/p/18369764

相关文章

  • python环境安装之后,cmd输入python回车会打开微软商店
    坑爹!python环境安装之后,cmd输入python回车会打开微软商店最近发现,安装python环境成功之后,可能会出现cmd输入python验证是否安装成功老会打开微软商店!解决,打开系统环境配置,找到刚安装python环境的时候加入的python安装路径你会发现这个windowsapp在python安装目录前面,把w......
  • 《百度网盘》闪退弹窗“找不到msvcr100.dll”该怎么解决?百度网盘提示缺少msvcr100.dll
    当系统提示缺少msvcr100.dll文件时,不用慌张。可以先尝试重新安装可能导致该问题的应用程序。若问题依旧,可从可靠的网站下载该文件,但要注意安全性和版本适配性,或者使用系统修复工具来解决这一困扰。本篇将为大家带来提示缺少msvcr100.dll文件修复方法的内容,感兴趣的小伙伴们一起......
  • 《鬼泣5》游戏崩溃提示“缺少d3dx9_43.dll”文件该怎么修复?鬼泣5游戏闪退弹窗“找不到
    在体验鬼泣5游戏的过程中,部分玩家会遭遇令人困扰的闪退情况,同时还会弹出“找不到d3dx9_43.dll”的提示。这一问题极大地影响了游戏体验,使玩家无法正常沉浸在游戏世界中,需要寻找有效的解决方法来应对。本篇将为大家带来提示“缺少d3dx9_43.dll”文件的修复方法的内容,感兴趣的小......
  • iertutil.dll:Internet Explorer的核心,找不到后的修复指南
    iertutil.dll是一个与InternetExplorer浏览器相关的动态链接库(DLL)文件。这个文件包含了InternetExplorer浏览器运行时所需的一些核心功能和资源,例如处理HTML和JavaScript代码、管理浏览器窗口等。iertutil.dll对于确保InternetExplorer浏览器在Windows操作系统中的正常运......
  • Visual Studio 2013 自定义动态库dll文件lib存放路径
    前言全局说明VisualStudio2013自定义lib存放路径一、说明环境:Windows7旗舰版VisualStudio2013二、设置说明在一个功能比较全的项目中,有可能会引入第三方库来完成某些功能,为了让目录结构、文件,清晰,会将引入的dll文件,放置到一个独立目录里。这样方便管理,也便......
  • IMJPCD.DLL文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个IMJPCD.DLL文件(挑选合适的版本文件)把它放......
  • IMEFILES.DLL文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个IMEFILES.DLL文件(挑选合适的版本文件)把它......
  • imecfmps.dll文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个imecfmps.dll文件(挑选合适的版本文件)把它......
  • IMELM.DLL文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个IMELM.DLL文件(挑选合适的版本文件)把它放入......
  • Windows11系统MtfDecoder.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个MtfDecoder.dll文件(挑选合适的版本文件)把......