Hook MessageBox 进阶 跨进程Hook

Hook技术:IAT Hook详细讨论修改IAT地址和恢复 IAT Hook是Ring3层常用的Hook之一,主要思路大家都知道,就是修改IAT中的函数地址。 阅读详情

转载注明出处

http://blog.youkuaiyun.com/xugangjava/article/details/14001685

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

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

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

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

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include "detours.h"
#include <stdlib.h>
#include <iostream>
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"<<endl;
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());
	g_pOldMessageBoxA=DetourFindFunction("User32.dll","MessageBoxA");
	g_pOldMessageBoxW=DetourFindFunction("User32.dll","MessageBoxW");
	DetourAttach(&g_pOldMessageBoxA,ZwNewMessageBoxA);
	DetourAttach(&g_pOldMessageBoxW,ZwNewMessageBoxW);
	LONG ret=DetourTransactionCommit();
	g_bHookInstalled=TRUE;
	return g_bHookInstalled;
}


BOOL APIENTRY DropHook()
{
	//如果已经卸载就return
	if(!g_bHookInstalled)return TRUE;
	//输出控制台
	cout<<"let't us drop hook of messagebox"<<endl;
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());
	DetourDetach(&g_pOldMessageBoxA, ZwNewMessageBoxA);
	DetourDetach(&g_pOldMessageBoxW, ZwNewMessageBoxW);
	LONG ret=DetourTransactionCommit();
	g_bHookInstalled=FALSE;
	return ret==NO_ERROR;
}

static HMODULE s_hDll;

//查找函数地址
HMODULE WINAPI ModuleFromAddress(PVOID pv)
{
	MEMORY_BASIC_INFORMATION mbi;
	if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
	{
		return (HMODULE)mbi.AllocationBase;
	}
	else
	{
		return NULL;
	}
}


static LRESULT CALLBACK MessageHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	wchar_t Dir[_MAX_DIR];
	wchar_t FullPath[MAX_PATH]; // [sp+200h] [bp-614h]@1
	wchar_t Ext[_MAX_EXT];
	wchar_t Filename[_MAX_FNAME];
	wchar_t Drive[_MAX_DRIVE];  
	GetModuleFileNameW(0, FullPath, MAX_PATH);
	_wsplitpath_s(FullPath, Drive, _MAX_DRIVE, Dir, _MAX_DIR, Filename, _MAX_FNAME, Ext, _MAX_EXT);
	//这里我只注入python进程  注入所有进程对系统影响很大 弄得我经常需要注销
	if(!_wcsicmp(Filename, L"python")){
		//安装钩子
		if(!g_bStopHook){  
			SetHook();
		}
		//卸载钩子
		else{
			DropHook();
		}
	}
	return CallNextHookEx(g_hMessageHook,nCode,wParam,lParam);
}

//导出函数 加载全局钩子
extern "C" __declspec(dllexport) BOOL SetGoableHook()
{
	g_bStopHook=FALSE;
	g_hMessageHook=SetWindowsHookEx(WH_GETMESSAGE,
		MessageHookProc,
		ModuleFromAddress(MessageHookProc),0);
	return TRUE;
}

//导出函数 卸载全局钩子
extern "C" __declspec(dllexport) BOOL DropGoableHook()
{
	g_bStopHook=TRUE;
	return TRUE;
}

HMODULE WINAPI Detoured()
{
	return s_hDll;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		s_hDll = hModule;
		DisableThreadLibraryCalls(hModule);
		break;
	case DLL_PROCESS_DETACH:
		UnhookWindowsHookEx(g_hMessageHook);
		break;
	}
	return TRUE;
}
好了我们下一步编写一个MFC程序来加载和卸载我们的钩子

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


按钮事件处理函数如下

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 

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

好的再次调用MessageBox


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

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

同理 卸载钩子


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

源码地址

http://download.youkuaiyun.com/detail/xugangjava/6488007


Windows下用Frida玩转API Hook:从修改MessageBox到主动调用(附完整代码) 本文详细介绍了在Windows平台下使用Frida进行API Hook的实战指南,从基础的MessageBox Hook到复杂的主动调用Windows API,提供了完整的代码示例和调试技巧。通过Frida这一强大的动态插桩工具,开发者可以轻松实现逆向工程、安全研究和自动化测试等任务。 阅读详情

相关推荐

C++实现API Hook拦截MessageBox窗口系统项目

MFC的消息机制是Windows事件驱动模型的抽象体现,通过消息队列、消息循环以及消息映射三大核心组件构建起整个框架的响应体系。理解这一机制是实现MFC消息拦截与处理的前提。消息过滤是指根据预设规则判断是否允许某条消息继续传递。可以通过在钩子回调或窗口过程中添加判断逻辑实现。// 自定义过滤规则// 屏蔽鼠标移动消息return 1;// 返回非零值表示已处理,消息不再传递过滤规则逻辑说明:若返回值为非零,则系统认为消息已被处理,不再传递给窗口过程。

weixin_42462474的博客 932

Java与外部进程交互从精通到陌生

1.什么是进程 现代操作系统运行一个程序的时候,会为其创建一个进程,例如启动一个IDEA,操作系统就还创建一个IDEA进程 2.如何与进程交互 Process 创建方式 1.使用Runtime Runtime runtime = Runtime.getRuntime(); try { Process exec = runtime.exec(cmdStr); } catch (IOException e) {

qq_40495860的博客 1万+

C#系统级Hook编程实战:键鼠与MessageBox拦截技术

通过本文的层层剖析,我们完成了从Hook基本概念到实战落地的完整旅程。你会发现,所谓的“高级技巧”,其实不过是对系统机制的理解 + 对细节的严谨把控。记住几个核心原则:- 回调要轻,转发要快;- 委托要留,句柄要关;- 封送要准,权限要想;- 拦截要慎,链不能断。掌握了这些,你就不再只是一个API使用者,而是真正意义上的系统级开发者。而这,正是通往更广阔技术天地的第一步 🚪✨。本文还有配套的精品资源,点击获取。

weixin_42604188的博客 560

【2021.01.15】INLINE HOOK

IAT HOOK的缺点 容易被检测。 只能HOOK IAT表中的函数。 例子 #include <Windows.h> #define PATCH_LENGTH 5 DWORD dwHookAddress = NULL; char szNewText[] = "Inline Hook"; void MessageBoxProc(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) { //该函数想怎么写怎么写 没有限制

oalken的博客 272

Hook自定义MessageBox

vs2015下编写的hook入门 指hook自己的msgbox

HOOKAPI(三)——HOOK所有程序的MessageBox

本实例要实现HOOKMessageBox,包括MessageBoxA和MessageBoxW,其实现细节与HOOKAPI(二)中介绍的基本类似,唯一不同的是,本实例要实现对所有程序的HOOKMessageBox,即无论系统中哪一个程序调用MessageBox都会被重定向到我们实现的新的API中。之前说过,在Windows中,每个进程都有自己的地址空间,进程不能调用别的进程中的函数。这里涉及到一个关键,如何让我们实现的新的API调用地址存在于所有进程的地址空间中呢?如果这无法实现的话,其他进程就无法调用到我们所实现的API。这里涉及到的关键就是,如何将我们的代码注入到别的进程中。这里有一个实现手

HOOK所有程序的MessageBox

这篇文章用到的HOOK代码,跟我的前一篇文章【HOOK API入门之Hook自己程序的MessageBoxW】差不多, 其地址是:http://blog.youkuaiyun.com/friendan/article/details/12222651 因为这次HOOK的是系统所有用到MessageBox的程序,所以我们必须把代码写在dll文件中, 这里我用的是MFC DLL -------------

friendan的专栏 1万+

从隐私保护到生命守护:CPD技术中的传感器选择与权衡

本文探讨了智能座舱中儿童存在检测(CPD)技术的传感器选择与隐私保护平衡策略。通过分析毫米波雷达、UWB等先进技术的性能与隐私风险,揭示了如何在确保儿童安全的同时保护用户隐私。文章还展望了CPD技术与座舱生态系统的未来融合趋势,为汽车安全领域提供了重要参考。

weixin_29159441的博客 301

Hook MessageBox 进阶 跨进程Hook

转载注明出处 http://blog.youkuaiyun.com/xugangjava/article/details/14001685 以前的文章(http://blog.youkuaiyun.com/xugangjava/article/details/7455851)中介绍了如何Hook 系统的MessageBox的函数不过只限于本进程, 本文主要介绍如何Hook其他进程的Messa

hewei0241的专栏 1127

蓝牙HCI Dongle实战:从芯片选型到协议栈集成的完整指南

本文详细介绍了蓝牙HCI Dongle的实战应用,从芯片选型到协议栈集成的完整指南。通过对比CSR8510、nRF52840等主流芯片的性能和价格,提供选型建议和避坑技巧。同时,深入解析Zephyr协议栈移植和常见问题排查,帮助开发者高效完成蓝牙项目开发。

weixin_30786657的博客 321

Arduino--土壤湿度传感器使用(电阻式)

最近买了一个土壤湿度检测传感器,实物图是这样的: 我买这个模块是想要得到土壤湿度的模拟量。但我买的时候忘了买左边的蓝色模块,我开始以为这个模块是有运放功能的,但实际它是一个电压比较器和一个分压电路。 其模块的接线如图: 该模块的四线是带模拟量输出的,三线的只输出一个到达阈值的标志量。该模块的原理图如下: 该模块的测试原理为:把土壤当成一个可变电阻,随着土壤含水量的增加,土壤电阻减小。而该传感器其实就是两个电极,用来接土壤这个可变电阻。一般湿度的土壤电阻大概在几百K左右,其串连的分压电阻应该在这个数量级。

weixin_41866783的博客 1万+

自定义MessageBox----HOOK

HOOK自己接触的其实非常少,所以也从来没敢谈论过什么,这个MessageBox还真的研究了好几个hour呢,挺怕被大牛们嘲笑的,今天我也不要脸了,说说我的一些看法,欢迎扔砖头,西红柿。 众所周知,一个标准的messagebox框通常不是自定义风格的,因为我们从来不能正常找到它的

yiruirui0507的专栏 6267

生存网络与mlr3proba

通过结合生存网络和mlr3proba,可以使用生存网络模型来预测个体在给定时间点发生事件的概率,并使用mlr3proba提供的工具进行模型的训练、评估和选择最佳模型。iii)基本的机器学习(ML)方法,如重新排序和调整。在本文中,我们将只讨论前五种,因为它们在文献中得到了更好的建立,并且它们具有相同的接口,这简化了调优,我们将在下面看到。我们不会为模型指定自定义架构,而是使用默认架构,如果你熟悉PyTorch,那么你可以选择创建自己的架构,如果你愿意的话,通过将其传递给模型中的custom_net参数。

weixin_46587777的博客 1363

HOOK API(二)—— HOOK自己程序的 MessageBox

0x00 前言 以下将给出一个简单的例子,作为HOOK API的入门。这里是HOOK 自己程序的MessageBox,即将自己程序对MessageBox API的调用重定向到自己实现的API中,在自己定义的API中实现内容的替换。 需要注意的是,本例子的HOOK仅仅对自己实现的MFC窗口程序,当开始HOOK 后,自己的程序调用MessageBox将被重定向,但其他程序滴啊用MessageBox时是正常的。 在Windows中,每个进程都有自己的进程控制块,有自己的安全运行空间,各函数在初始化时被加载到

翻肚鱼儿的博客 789

数据包络分析(超效率-SBM模型)附python代码

超效率-SBM模型超效率SBMpython代码(部分) 这段时间差不多忙完了,终于有时间可以来经营我的博客了。 上阵子挺多人私信我,原谅我记性不好,可能没有回复全。 这篇文章是超效率的扩展。 超效率SBM SBM本身就是非径向模型(non-radial model),想要了解径向超效率的请自行去前面翻阅。 上篇文章说到super-SBM的一个模型,公式为: 这个模型是分式模型,我们可以通过charnes cooper变换,将其转变成为: python代码(部分) 在编程过程中,本来我以为第一个模型是无

weixin_43217288的博客 3万+

保研考研机试攻略(满分篇):第二章——满分之路上(1)

保研考研机试攻略(满分篇):第二章——满分之路上(1)2.1计算机和基础+2.2进阶背包问题+2.3毛毛虫算法

qq_63349644的博客 1191

c# 更改弹窗MessageBox按钮文字

需要用到hook,具体hook类在附件里,此hook类也是网上扒来的,忘了地址了。。。。否则作为尊重应该贴上原文地址的。。。 原hook类写了有键鼠hook,MessageBox 是我后添加的,如果有其他hook也可以参照我的方式自己添加。 详解自定义hook:(以下都是hook类里有的,不需要再复制添加) 具体调用方式在末尾的第二个代码段内有,复制过去就可以用 首先定义一个事件,在写对应的钩子回调函数,在函数类触发事件即可,至于事件的具体执行什么动作则在外部定义hook时设置,和注册控件的事件一.

jwb7832007的博客 8017

HRNet训练自己的分类数据

1.搭建环境 为了防止和服务器上的环境冲突,这里利用conda搭建环境。 Install PyTorch=0.4.1 following theofficial instructions git clonehttps://github.com/HRNet/HRNet-Image-Classification Install dependencies: pip install -r requirements.txt ...

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 5847

hook messagebox

原文出处:http://www.cnblogs.com/fanling999/p/4593352.html程序源码:https://github.com/hfl15/windows_kernel_development/tree/master/demo_source_code/HookMessageBoxX0x00 前言以下将给出一个简单的例子,作为HOOK API的入门。这里是HOOK 自己程序...

泰瑞的博客 591

30、电力生产系统中的效率测量

本文探讨了如何使用数据包络分析(DEA)模型来评估电力生产系统的效率。文章详细介绍了电力生产系统的三个主要环节——发电、输电和配电,并通过多种DEA模型,如输入导向模型、输出导向模型以及基于松弛的SBM模型,展示了效率测量的方法和技术。同时,结合实际案例分析,说明了DEA模型在识别效率低下环节及提出改进建议方面的应用价值。

rgv2345678的博客 116

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HOOK -- IAT HOOK 本进程MessageBox

下面转自网上的,给读者共享,本来自己写点的,但是一直在讲课,没有时间,姑且先复制粘贴下) ========================================================================================     结合网上资料、使用IAT HOOK截获MessageBox函数、、、 步骤如下 1..写

liujiayu2的专栏 889

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LyScript 实现Hook改写MessageBox

LyScript 可实现自定义汇编指令的替换功能,用户可以自行编写一段汇编指令,将程序中特定的通用函数进行功能改写与转向操作,此功能原理是简单的Hook操作。接着我们就来实现功能改写,将弹窗中的消息替换成我们自己的版权信息,此处先给出代码。汇编写出的位置,此处是一个跳转,直接跳转到我们自己申请的内存空间内。当EIP走到此处后,跳转到我们自己构建的弹窗位置,此处的代码如下。处的指令将被替换,跳转到我们自己分配的内存中去。替换掉了,当运行弹窗后,就是执行我们自己的函数。是文本,这两处位置都被python中的。

微软技术分享 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# Hook技术实战:动态修改MessageBox按钮文字

在Windows桌面应用开发中,系统对话框是常见的用户交互组件,但其默认行为往往无法满足定制化需求。通过Windows API Hook技术,开发者可以在不重写原生组件的前提下,深入系统消息处理流程,实现对标准控件行为的动态拦截与修改。这一技术原理基于事件驱动的回调机制,允许在窗口创建、激活等关键生命周期节点注入自定义逻辑,具有极高的灵活性和系统兼容性。其技术价值在于以最小侵入性实现深度定制,平衡了开发效率与用户体验。在C#开发场景中,结合P/Invoke平台调用,可安全稳定地应用于**系统对话框定制**、

weixin_30325971的博客 293
上一篇: Activti 重复启动流程报错
下一篇: 基于.Net3.5 Nhibernate 整合 Extjs 框架设计
xugangjava
博客等级 码龄16年 83粉丝 72原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值