SendMessage()两程序通信与MFC手动添加用户需要的新消息及其反汇编注解

本文详细介绍了如何使用 SendMessage 函数在两个 Windows 程序间发送数据,并通过反汇编观察了 FindWindow、SendMessage 和 MessageBox 函数的实现过程,有助于理解 Windows 消息处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、实现SendMsg程序将输入的数据发送给ReceiveMsg程序的过程。效果见图1,源代码见http://download.youkuaiyun.com/source/3091018

图1 两个程序通信

发送方(SendMsg)主要使用::SendMessage()函数,使用该函数需要将接受函数的句柄,发送给接受程序的消息,以及发送内容的地址做为参数。关键代码如下

HWND hfwnd = ::FindWindow(NULL, "ReceiveMsg");//获取接收程序的句柄 UpdateData(TRUE); ::SendMessage(hfwnd, WM_SETTEXT, NULL, (LPARAM)m_data.GetBuffer(0));

接收方(ReceiveMsg)判断获得WM_SETTEXT消息后做出处理即可。由于MFC没有内置添加WM_SETTEXT消息的wizard,需要自己手动添加该消息,还要注意消息响应函数的形参。在对话框程序xxx中添加消息的步骤如下:

(1)在xxxDlg.h中添加消息响应函数的声明 afx_msg void OnSetText(WPARAM wParam, LPARAM lParam);

//{{AFX_MSG(CReceiveMsgDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); //............ afx_msg void OnSetText(WPARAM wParam, LPARAM lParam); //}}AFX_MSG DECLARE_MESSAGE_MAP()

(2)在xxxDlg.cpp的消息映射表中添加消息映射 ON_MESSAGE(WM_SETTEXT,OnSetText)

BEGIN_MESSAGE_MAP(CReceiveMsgDlg, CDialog) //{{AFX_MSG_MAP(CReceiveMsgDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_WM_TIMER() ON_MESSAGE(WM_SETTEXT,OnSetText) //}}AFX_MSG_MAP END_MESSAGE_MAP()

(3)在xxxDlg.cpp中实现消息响应函数OnSetText(WPARAM wParam, LPARAM lParam);

void xxxDlg::OnSetText(WPARAM wParam, LPARAM lParam) {//lparam为程序发送数据的起始地址 CString str; str.Format(_T("%s"), lParam);//将数据转换成字符串,便于显示 m_strData = str; UpdateData(FALSE); }

注意,WM_SETTEXT消息为系统消息,所以不需要定义。若要自己定义消息,需要#define一下,详见参考[1]

2、利用OD反汇编观察FindWindow()函数,SendMessage()函数和MessageBox()函数的实现过程,便于代码注入时使用

FindWindow: PUSH EAX;保存对话框标题名的字符串地址 PUSH 0 CALL dowrd ptr [4021E0];调用FindWindow函数,不同程序中地址不同 SendMessage: PUSH EAX;发送数据所在地址 PUSH 0 PUSH 0C;发送WM_SETTEXT消息 PUSH EDI;hwmd CALL dowrd ptr [4021EC];调用SendMessage函数,不同程序中地址不同 AfxMessageBox: PUSH 0 ;消息框风格MB_OK|MB_ICONXCLAMAION|MB_APPLMODAL PUSH EAX;消息框title字符串地址 PUSH EBX;消息框中显示字符串的地址 CALL dowrd ptr [4021EC];调用AfxMessageBox函数,不同程序中地址不同

注意,调用函数时具体地址会不同,可以用IDA来查看,或直接写OD能识别的函数名(eg: MessageBoxA),可以先写一个小程序反汇编看看OD本身能识别的函数名是什么样的.......

参考

[1] http://blog.youkuaiyun.com/machaoboy/archive/2009/01/04/3706991.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值