VC实现的MSN Messager钩子程序CC++

上传人:洪易 文档编号:39983584 上传时间:2018-05-21 格式:DOC 页数:6 大小:27KB
返回 下载 相关 举报
VC实现的MSN Messager钩子程序CC++_第1页
第1页 / 共6页
VC实现的MSN Messager钩子程序CC++_第2页
第2页 / 共6页
VC实现的MSN Messager钩子程序CC++_第3页
第3页 / 共6页
VC实现的MSN Messager钩子程序CC++_第4页
第4页 / 共6页
VC实现的MSN Messager钩子程序CC++_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《VC实现的MSN Messager钩子程序CC++》由会员分享,可在线阅读,更多相关《VC实现的MSN Messager钩子程序CC++(6页珍藏版)》请在金锄头文库上搜索。

1、最近研究怎么样使用 HOOK 拦截其他应用程序的消息,于是就动手写了一个钩子程序来挂到最常用的通讯及时通讯工具 MSN,虽然没有什么实际意义,但作为学习研究却能够帮助我们理解利用 HOOK 是怎么样将自己编写的 DLL 注入已经存在的程序空间中的。 我们需要做的是通过我们自己编写的应用程序去拦截别人写好的应用程序消息,实际上这是在两个进程之间进行的,难度就在这里,如果是同一个进程什么都好办,只要将系统响应 WINDOWS 消息的处理函数修改为我们自己编写的函数就可以,但现在不能这么做,因为两个进程有各自的进程地址空间,理论上你没有办法直接去访问别的进程的地址空间,那么怎么办来?办法还是很多的,

2、这里仅仅介绍通过 HOOK 来达到目的。需要拦截别的应用程序的消息,需要利用将自己编写的 DLL 注入到别人的 DLL 地址空间中才可以达到拦截别人消息的目的。只有将我们的 DLL 插入到别的应用程序的地址空间中才能够对别的应用程序进行操作,HOOK 帮助我们完成了这些工作,我们只需要使用 HOOK来拦截指定的消息,并提供必要的处理函数就行了。我们这里介绍拦截在 MSN 聊天对话框上的鼠标消息,对应的 HOOK 类型是 WH_MOUSE。首先我们要建立一个用来 HOOK 的 DLL。这个 DLL 的建立和普通的 DLL 建立没有什么具体的区别,不过我们这里提供的方法有写不同。这里使用隐式导入

3、DLL 的方法。代码如下:头文件头文件#pragma once#ifndef MSNHOOK_API#define MSNHOOK_API _declspec(dllimport)#endifMSNHOOK_API BOOL WINAPI SetMsnHook(DWORD dwThreadId);/安装 MSN 钩子函数MSNHOOK_API void WINAPI GetText(int /安装 MSN 钩子函数MSNHOOK_API HWND WINAPI GetMyHwnd();/安装 MSN 钩子函数DLLDLL 的的 CPPCPP 文件文件#include “stdafx.h“#in

4、clude “MSNHook.h“#include / 下面几句的含义是告诉编译器将各变量放入它自己的数据共享节中#pragma data_seg(“Shared“)HHOOK g_hhook = NULL;DWORD g_dwThreadIdMsn = 0;POINT MouseLoc=0,0;char text256=0;HWND g_Hwnd = NULL;#pragma data_seg()/告诉编译器设置共享节的访问方式为:读,写,共享#pragma comment(linker,“/section:Shared,rws“)HINSTANCE g_hinstDll = NULL;BO

5、OL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) switch (ul_reason_for_call) case DLL_PROCESS_ATTACH: g_hinstDll = (HINSTANCE)hModule; break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; return TRUE; LRESULT WINAPI GetMsgProc(int n

6、Code,WPARAM wParam, LPARAM lParam);BOOL WINAPI SetMsnHook(DWORD dwThreadId) OutputDebugString(“SetMsnHook“); BOOL fOK = FALSE; if(dwThreadId != 0) OutputDebugString(“SetMsnHook dwThreadId != 0“); g_dwThreadIdMsn = GetCurrentThreadId();/安装 WM_MOUSE 钩子和处理函数 GetMsgProc g_hhook = SetWindowsHookEx(WH_MOU

7、SE,GetMsgProc,g_hinstDll,dwThreadId); fOK = (g_hhook != NULL); if(fOK) fOK = PostThreadMessage(dwThreadId,WM_NULL,0,0); else fOK = UnhookWindowsHookEx(g_hhook); g_hhook = NULL; return(fOK); LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam, LPARAM lParam) char temp20; sprintf(temp,“%d“,nCode); Outpu

8、tDebugString(“temp“); if (nCode=HC_ACTION) MOUSEHOOKSTRUCT *l=(MOUSEHOOKSTRUCT *)lParam; MouseLoc=l-pt; /送鼠标位置/char text256 = “; HWND hWnd = WindowFromPoint(l-pt); if(hWnd) /GetWindowText(hWnd,text,256); SendMessage(hWnd,WM_GETTEXT,256,(LPARAM)(LPCTSTR)text); / strcpy(text,“123455555“); SendMessage(

9、hWnd,WM_SETTEXT,256,(LPARAM)(LPCTSTR)text); g_Hwnd = hWnd; /SendMessage(WindowFromPoint(l-pt),WM_GETTEXT,256,(LPARAM)(LPCTSTR)psw); return(CallNextHookEx(g_hhook,nCode,wParam,lParam); void WINAPI GetText(int y = MouseLoc.y;*ptext = text;HWND WINAPI GetMyHwnd()return g_Hwnd;上面是处理钩子的 DLL 代码,下面我们要让这个 D

10、LL 起作用还需要一个启动部分,通过这个启动部分我们才能让我们的钩子函数真正的注入到系统其他函数中。我们这里使用个对话框的程序,程序非常简单:一个按钮用来启动钩子,一个用来停止,一个 TIMER 用来刷新显示,还有一个 EDITBOX 用来接受信息。程序如下:/包含 DLL 函数导出的头文件#include “MSNHook.h“/隐式导入#pragma comment(lib,“MSNHook.lib“) /声明导入函数_declspec(dllimport) BOOL WINAPI SetMsnHook(DWORD dwThreadId);_declspec(dllimport) void

11、 WINAPI GetText(int _declspec(dllimport) HWND WINAPI GetMyHwnd();/安装 MSN 钩子函数void CTestMSNHookDlg:OnBnClickedOk()/通过 SPY+可以看到 MSN 聊天对话框窗口类是 IMWindowClass,通过这个得到该窗口句柄CWnd *pMsnWin = FindWindow(TEXT(“IMWindowClass“),NULL);if(pMsnWin = NULL) return ;/通过窗口句柄得到对应的线程的 IDSetMsnHook(GetWindowThreadProcessId

12、(pMsnWin-GetSafeHwnd(),NULL);MSG msg;GetMessage(SetTimer(101,100,NULL);void CTestMSNHookDlg:OnTimer(UINT_PTR nIDEvent)/刷新消息char * pText = NULL;int x = 0,y = 0;GetText(x,y,if(x =0 m_Edit.Format(“%d:%d:%s“,x,y,pText);/m_Edit = pText;UpdateData(FALSE);HWND hWnd = GetMyHwnd();CWnd * pWnd = CWnd:FromHand

13、le(hWnd);pWnd-GetWindowText(m_Edit);CDialog:OnTimer(nIDEvent);void CTestMSNHookDlg:OnBnClickedButton1()/关闭KillTimer(101);SetMsnHook(0); OnCancel();好了,基本上就这些了。这里有个问题,我本想得到 MSN 用户聊天时输入的聊天信息,这里通过 WM_GETTEXT 消息的不到,如果有知道的朋友告诉一声。 char szText256; WPARAM wParam = sizeof(szText); LPARAM lParam = (LPARAM)szText; memset (szText, 0, sizeof(szText); SendMessage(hRich, WM_GETTEXT, wParam, lParam); AfxMessageBox (szText);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号