SendMessage()两程序通信与MFC手动添加用户需要的新消息及其反汇编注解
2011-03-14 16:15
671 查看
1、实现SendMsg程序将输入的数据发送给ReceiveMsg程序的过程。效果见图1,源代码见http://download.csdn.net/source/3091018。
图1 两个程序通信
发送方(SendMsg)主要使用::SendMessage()函数,使用该函数需要将接受函数的句柄,发送给接受程序的消息,以及发送内容的地址做为参数。关键代码如下
接收方(ReceiveMsg)判断获得WM_SETTEXT消息后做出处理即可。由于MFC没有内置添加WM_SETTEXT消息的wizard,需要自己手动添加该消息,还要注意消息响应函数的形参。在对话框程序xxx中添加消息的步骤如下:
(1)在xxxDlg.h中添加消息响应函数的声明 afx_msg void OnSetText(WPARAM wParam, LPARAM lParam);
(2)在xxxDlg.cpp的消息映射表中添加消息映射 ON_MESSAGE(WM_SETTEXT,OnSetText)
(3)在xxxDlg.cpp中实现消息响应函数OnSetText(WPARAM wParam, LPARAM lParam);
注意,WM_SETTEXT消息为系统消息,所以不需要定义。若要自己定义消息,需要#define一下,详见参考[1]
2、利用OD反汇编观察FindWindow()函数,SendMessage()函数和MessageBox()函数的实现过程,便于代码注入时使用
注意,调用函数时具体地址会不同,可以用IDA来查看,或直接写OD能识别的函数名(eg: MessageBoxA),可以先写一个小程序反汇编看看OD本身能识别的函数名是什么样的.......
参考
[1] http://blog.csdn.net/machaoboy/archive/2009/01/04/3706991.aspx
图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.csdn.net/machaoboy/archive/2009/01/04/3706991.aspx
相关文章推荐
- VS2010 MFC添加新的菜单项及其消息响应
- 在MFC程序中添加消息函数
- 在MFC中手动添加消息处理函数PreTranslateMessage
- MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息
- 在MFC中添加用户自定义消息
- MFC单文档程序添加消息映射和消息响应函数的问题
- 在MFC中手动添加消息处理函数PreTranslateMessage
- MFC在VS2008中如何手动添加消息映射
- 在MFC中添加用户自定义消息
- 【转】MFC 如何添加自定义消息及其响应函数
- MFC中添加用户自定义消息
- mfc通过消息传递参数进行程序间通信
- 在MFC中添加用户自定义消息
- MFC中添加用户自定义消息
- MFC中手动添加消息映射
- vs2008自动添加消息和MFC对话框程序不显示主画面
- MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息
- MFC在VS2008中如何手动添加消息映射
- 在MFC中添加用户自定义消息
- MFC程序嵌入子进程界面的通信方法及消息同步