Hook MessageBox 进阶 跨进程Hook

转载注明出处

http://blog.csdn.net/xugangjava/article/details/14001685

以前的文章(http://blog.csdn.net/xugangjava/article/details/7455851)中介绍了如何Hook 系统的MessageBox的函数不过只限于本进程,

本文主要介绍如何Hook其他进程的MessageBox函数。

这里我用SetWindowsHookEx 来实现,SetWindowsHookEx最后一个参数设置为0 ,表示拦截所有进程的相关消息。在回调函数中安装Hook就可以达到目的。

对原有代码稍作修改dllmain.cpp修改如下

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include "detours.h"
#include 
#include 
using namespace std;


PVOID g_pOldMessageBoxW=NULL;
PVOID g_pOldMessageBoxA=NULL;

typedef int (WINAPI *PfuncMessageBoxA)(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
typedef int (WINAPI *PfuncMessageBoxW)( HWND hWnd, LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);

int WINAPI ZwNewMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
{
	return ((PfuncMessageBoxA)g_pOldMessageBoxA)(hWnd, "Hook This!","My hook",uType);
}
int WINAPI ZwNewMessageBoxW(HWND hWnd, LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)
{
	return ((PfuncMessageBoxW)g_pOldMessageBoxW)(hWnd,L"Hook This!",L"My hook",uType);
}

//共享代码段
#pragma data_seg("SHARED") 
HHOOK g_hMessageHook=NULL;
BOOL g_bStopHook=FALSE;
BOOL g_bHookInstalled=FALSE;
#pragma data_seg()         
#pragma comment(linker, "/section:SHARED,RWS")


BOOL APIENTRY SetHook()
{
	//如果已经安装就return
	if(g_bHookInstalled)return TRUE;
	//输出到控制台
	cout<<"let't us install hook of messagebox"<
好了我们下一步编写一个MFC程序来加载和卸载我们的钩子

在对话框上面添加两个按钮

Hook MessageBox 进阶 跨进程Hook_第1张图片

按钮事件处理函数如下

typedef BOOL  (WINAPIV	*SetGoableHook)();
typedef VOID  (WINAPIV	*DropGoableHook)();


void CTestHookDlg::OnBnClickedSethook()
{
	HINSTANCE hDLL=::LoadLibrary(L"Hook.dll");
	SetGoableHook func=(SetGoableHook)GetProcAddress(hDLL,"SetGoableHook");
	func();
}

void CTestHookDlg::OnBnClickedDropHook()
{
	HINSTANCE hDLL=::LoadLibrary(L"Hook.dll");
	DropGoableHook func=(DropGoableHook)GetProcAddress(hDLL,"DropGoableHook");
	func();
}

Ok 了 下面我们来测试我们的钩子,依然使用python命令行来进行演示

1.进入python交互界面后,点击SetDoableHook按钮,然后敲入如下命令,弹出MessageBox点确定这个进程就触发了WH_GETMESSAGE 

进入我们的回调函数,我们的钩子已经加载成功了。

Hook MessageBox 进阶 跨进程Hook_第2张图片

好的再次调用MessageBox

Hook MessageBox 进阶 跨进程Hook_第3张图片

发现python 进程的MessageBox已经被我们替换掉了,因为这个是命令行程序,第一次调用弹出只是为了该进程进入我们的WH_GETMESSAGE 回调MessageHookProc。

对不同类型进程Hook的时候可以使用不同的参数 WH_CALLWNDPROCRET,WH_KEYBOARD_LL,WH_MOUSE_LL来进行Hook。

同理 卸载钩子

Hook MessageBox 进阶 跨进程Hook_第4张图片

有不对的地方欢迎大家指正。

源码地址

http://download.csdn.net/detail/xugangjava/6488007


你可能感兴趣的:(C++)