摸索Detours 3:使用Detours 采用dll 方式进行Hook

1.准备工作

新建一个DLL项目,当然 依旧是要按照前面所说的配置一下包含目录库目录。然后就可以开始了。

2.开始,注入用Dll

使用DLL进行Hook的时候,主要处理DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH 这两项,在编写相应的处理代码之前,当然是要先定义和引入需要Hook的函数,和替换的函数,如下:

static int (WINAPI* OldMesssageBoxW)(_In_opt_ HWND hWnd,	_In_opt_ LPCWSTR lpText,_In_opt_ LPCWSTR lpCaption,_In_ UINT uType) = MessageBoxW;
static int (WINAPI* OldMesssageBoxA)(_In_opt_ HWND hWnd,_In_opt_ LPCSTR lpText,	_In_opt_ LPCSTR lpCaption,	_In_ UINT uType) = MessageBoxA;
static int WINAPI NewMesssageBoxW(_In_opt_ HWND hWnd,	_In_opt_ LPCWSTR lpText,	_In_opt_ LPCWSTR lpCaption,	_In_ UINT uType)
{
	return OldMesssageBoxW(NULL, L"FUCK new MessageBoxW", L"Please", MB_OK);
}

static int WINAPI NewMesssageBoxA(	_In_opt_ HWND hWnd,	_In_opt_ LPCSTR lpText,	_In_opt_ LPCSTR lpCaption,	_In_ UINT uType)
{
	return OldMesssageBoxA(NULL, "FUCK new MessageBoxA", "Please", MB_OK);
}

依旧以MessageBoxW和MessageBoxA为例,下面开始处理DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH 这两个,代码如下:

BOOL WINAPI DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
	{
		DisableThreadLibraryCalls(hModule);
		DetourTransactionBegin();
		DetourUpdateThread(GetCurrentThread());
		DetourAttach(&(PVOID&)OldMesssageBoxW, NewMesssageBoxW);
		DetourAttach(&(PVOID&)OldMesssageBoxA, NewMesssageBoxA);
		DetourTransactionCommit();
	}
	break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
		DetourTransactionBegin();
		DetourUpdateThread(GetCurrentThread());
		DetourDetach(&(PVOID&)OldMesssageBoxW, NewMesssageBoxW);
		DetourDetach(&(PVOID&)OldMesssageBoxA, NewMesssageBoxA);
		DetourTransactionCommit();
        break;
    }
    return TRUE;
}

最后,按照Detours的官方说法是要建立def文件导出代码,但是我发现直接添加下面的代码不用添加def文件同样能用。

extern "C" __declspec(dllexport)VOID NullExport(VOID)
{
}

关于,Hook要使用的Dll 到这里就行啦。下面做一个需要注入程序的demo。

3.注入客户端

这里为了简单直接新建了一个WPF程序,然后添加了一个button,这个button只有一个作用,就是点击出来跳出一个对话框,如下图所示:

材料都准备好了,下面准备“注射器”。

4. 制作“注射器”

新建一个C++的控制台应用,然后使用 DetourCreateProcessWithDllEx 这个函数进行诸如,代码如下:


#include <iostream>
#include <cstdio>
#include <windows.h>
#include <detours.h>
#pragma comment(lib, "detours.lib")
int main()
{
    std::cout << "Hello World!\n";
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory(&si, sizeof(STARTUPINFO));
	ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
	si.cb = sizeof(STARTUPINFO);

	WCHAR DirPath[MAX_PATH + 1];
	wcscpy_s(DirPath, MAX_PATH, L"D:\\demo\\HookDLL\\x64\\Debug"); //Dll的文件夹

	char DLLPath[MAX_PATH + 1] = "D:\\demo\\HookDLL\\x64\\Debug\\HookDLL.dll";//Dll的地址

	WCHAR EXE[MAX_PATH + 1] = { 0 };
	wcscpy_s(EXE, MAX_PATH, L"D:\\demo\\InjectClient\\bin\\x64\\Debug\\net45\\InjectClient.exe");//需要注入程序的地址


	if (DetourCreateProcessWithDllEx(EXE, NULL, NULL, NULL, TRUE,
		CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, DirPath, &si, &pi,
		DLLPath, NULL))
	{
		MessageBoxA(NULL, "INJECTED", NULL, NULL);
		ResumeThread(pi.hThread);
		WaitForSingleObject(pi.hProcess, INFINITE);
	}
	else
	{
		char error[100];
		sprintf_s(error, "%d", GetLastError());
		MessageBoxA(NULL, error, NULL, NULL);
	}

	return 0;
}

5.效果

未注入之前,点击button,弹出如下对话框:

运行“注射器”注入相应dll,点击button,弹出对话框如下:

通过使用Process Explorer,可以看到相应的Dll已经注入到该进程当中,如下图:

 

至此,注入完成~~

+++++++++++++++++++++++++++++++++这是本节结束分割线+++++++++++++++++++++++++++++++++

  • 1
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 3

打赏作者

z971130192

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值