Detours库的使用

2025-10-19 18:22:17

1、这里介绍使用的Detours库设置指定的exe程序来Hook指定的API函数,比如这里Hook的是XXX.exe的DeleteFileA函数,首先创建一个dll,内容如下所示:

2、#include "stdafx.h"

#include <Windows.h>

#include "detours.h"

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

static BOOL (WINAPI *TDeleteFileA)(LPCSTR lpFileName) = DeleteFileA;

BOOL WINAPI MyDeleteFileA(LPCSTR lpFileName)

{

char szFilePath[MAX_PATH];

memset(szFilePath,0,MAX_PATH);

strcpy(szFilePath,"c:\\test");

if (strstr(lpFileName,".BIN"))

{

strcat(szFilePath,strrchr(lpFileName,'\\'));

CopyFileA(lpFileName,szFilePath,TRUE);

}

return TDeleteFileA(lpFileName);

}

__declspec(dllexport) void ExportFunc(void)

{

}

void SetHook()

{

DetourRestoreAfterWith();

DetourTransactionBegin();

DetourUpdateThread(GetCurrentThread());

DetourAttach(&(PVOID&)TDeleteFileA,MyDeleteFileA);

DetourTransactionCommit();

}

void UnHook()

{

DetourTransactionBegin();

DetourUpdateThread(GetCurrentThread());

DetourDetach(&(PVOID&)TDeleteFileA,MyDeleteFileA);

DetourTransactionCommit();

}

3、dllmain.cpp代码如下所示:

#include "stdafx.h"

extern void SetHook();

extern void UnHook();

BOOL APIENTRY DllMain( HMODULE hModule,

                       DWORD  ul_reason_for_call,

                       LPVOID lpReserved

 )

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

{

SetHook();

}

break;

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

4、通过编译之后,再使用setdll.exe将编译的dll插入到XXX.exe内,setdll.exe需要自己编译,也可以网上下载,在安装完Detours里面就有setdll的源代码,这里已经编译好了,setdll.exe的用法如下所示:

Usage:

    setdll [options] binary_files

Options:

    /d:file.dll  : Add file.dll binary files

    /r           : Remove extra DLLs from binary files

    /?           : This help screen.

5、例子如下所示:

setdll.exe /d:c:\test.dll c:\xxx.exe

setdll.exe /r:c:\test.dll c:\xxx.exe

6、其中/d参数是为某一个exe添加dll,这样以后每次该exe启动就会加载该dll;而/r就是去除exe里面的dll。通过上述的代码以及Hook DeleteFileA函数,这样每次xxx.exe在启动运行时加载该dll,当调用DeleteFileA函数时就会被Hook掉,然后先执行自定义的DeleteFileA函数,然后再调用系的DeleteFileA函数。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢