给MSN Messager装个钩子

2016-02-19 18:34 2 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的给MSN Messager装个钩子,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

最近研究怎么样使用HOOK拦截其他应用程序的消息,于是就动手写了一个钩子程序来挂到最常用的通讯及时通讯工具MSN,虽然没有什么实际意义,但作为学习研究却能够帮助我们理解利用HOOK是怎么样将自己编写的DLL注入已经存在的程序空间中的。 !-- frame contents -- !-- /frame contents -- 我们需要做的是通过我们自己编写的应用程序去拦截别人写好的应用程序消息,实际上这是在两个进程之间进行的,难度就在这里,假如是同一个进程什么都好办,只要将系统响应WINDOWS消息的处理函数修改为我们自己编写的函数就可以,但现在不能这么做,因为两个进程有各自的进程地址空间,理论上你没有办法直接去访问别的进程的地址空间,那么怎么办来?办法还是很多的,这里仅仅介绍通过HOOK来达到目的。 需要拦截别的应用程序的消息,需要利用将自己编写的DLL注入到别人的DLL地址空间中才可以达到拦截别人消息的目的。只有将我们的DLL插入到别的应用程序的地址空间中才能够对别的应用程序进行操作,HOOK帮助我们完成了这些工作,我们只需要使用HOOK来拦截指定的消息,并提供必要的处理函数就行了。我们这里介绍拦截在MSN聊天对话框上的鼠标消息,对应的HOOK类型是WH_MOUSE。 首先我们要建立一个用来HOOK的DLL。这个DLL的建立和普通的DLL建立没有什么具体的区别,不过我们这里提供的方法有写不同。这里使用隐式导入DLL的方法。代码如下: 头文件 #pragma once
  #ifndef MSNHOOK_API
  #define MSNHOOK_API __declspec(dllimport)
  #endif MSNHOOK_API BOOL WINAPI SetMsnHook(DWord dwThreadId);//安装MSN钩子函数
  MSNHOOK_API void WINAPI GetText(int &x,int &y,char ** ptext);//安装MSN钩子函数
  MSNHOOK_API HWND WINAPI GetMyHwnd();//安装MSN钩子函数
================================================== DLL 的CPP文件 #include "stdafx.h"
  #include "MSNHook.h"
  #include // 下面几句的含义是告诉编译器将各变量放入它自己的数据共享节中 #pragma data_seg("Shared")
  HHOOK g_hhook = NULL;
  DWORD g_dwThreadIdMsn = 0;
  POINT MouseLoc={0,0};
  char text[256]={0};
  HWND g_Hwnd = NULL;
  #pragma data_seg() //告诉编译器设置共享节的访问方式为:读,写,共享 #pragma comment(linker,"/section:Shared,rws") HINSTANCE g_hinstDll = NULL; BOOL 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 nCode,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_MOUSE,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 temp[20];
  sprintf(temp,"%d",nCode);
  OutputDebugString("temp");
  if (nCode==HC_ACTION)
  {
  MOUSEHOOKSTRUCT *l=(MOUSEHOOKSTRUCT *)lParam;
  MouseLoc=l->pt; //送鼠标位置 //char text[256] = "";
  HWND hWnd = WindowFromPoint(l->pt);
  if(hWnd)
  {
  //GetWindowText(hWnd,text,256);
  SendMessage(hWnd,WM_GETTEXT,256,(LPARAM)(LPCTSTR)text);
  // strcpy(text,"123455555");
  SendMessage(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 &x,int &y,char ** ptext)
  {
  x = MouseLoc.x;
  y = MouseLoc.y;
  *ptext = text;
  } HWND WINAPI GetMyHwnd()
  {
  return g_Hwnd;
  }

  上面是处理钩子的DLL代码,下面我们要让这个DLL起作用还需要一个启动部分,通过这个启动部分我们才能让我们的钩子函数真正的注入到系统其他函数中。我们这里使用个对话框的程序,程序非常简单:一个按钮用来启动钩子,一个用来停止,一个TIMER用来刷新显示,还有一个EDITBOX用来接受信息。 程序如下: //包含DLL函数导出的头文件
  #include "MSNHook.h" //隐式导入 #pragma comment(lib,"MSNHook.lib") //声明导入函数 __declspec(dllimport) BOOL WINAPI SetMsnHook(DWORD dwThreadId);
  __declspec(dllimport) void WINAPI GetText(int &x,int &y,char ** ptext);
  __declspec(dllimport) HWND WINAPI GetMyHwnd();//安装MSN钩子函数
  void CTestMSNHookDlg::OnBnClickedOk()
  { //通过SPY++可以看到MSN聊天对话框窗口类是IMWindowClass,通过这个得到该窗口句柄
  CWnd *pMsnWin = FindWindow(TEXT("IMWindowClass"),NULL);
  if(pMsnWin == NULL) return ; //通过窗口句柄得到对应的线程的ID
  SetMsnHook(GetWindowThreadProcessId(pMsnWin->GetSafeHwnd(),NULL));
  MSG msg;
  GetMessage(&msg,NULL,0,0);
  SetTimer(101,100,NULL); } void CTestMSNHookDlg::OnTimer(UINT_PTR nIDEvent)
  { //刷新消息
  char * pText = NULL;
  int x = 0,y = 0;
  GetText(x,y,&pText);
  if(x ==0 && y ==0) return ;
  m_Edit.Format("%d:%d:%s",x,y,pText);
  //m_Edit = pText;
  UpdateData(FALSE);
   HWND hWnd = GetMyHwnd();
  CWnd * pWnd = CWnd::FromHandle(hWnd);
  pWnd->GetWindowText(m_Edit);
  CDialog::OnTimer(nIDEvent);
  } void CTestMSNHookDlg::OnBnClickedButton1()
  { //关闭
  KillTimer(101);
  SetMsnHook(0);
  OnCancel();
  }

  好了,基本上就这些了。这里有个问题,我本想得到MSN用户聊天时输入的聊天信息,这里通过WM_GETTEXT消息的不到,假如有知道的朋友告诉一声。 作者Blog: http://blog.csdn.net/windcsn/

来源:https://www.tulaoshi.com/n/20160219/1618180.html

延伸阅读
标签: 电脑入门
很多朋友都在使用MSN Messenger跟朋友联系,不过MSN Messenger跟QQ比,一个最大的弱点就在于它不能查找添加在线好友,而只有知道朋友的邮件地址才能添加其为好友。其实通过MSN Messenger一样可以认识许多陌生人,只不过这个功能比较隐蔽而已。 第一步:登录MSN Messenger后,选择联系人→搜索联系人→高级搜索菜单,这里我们可以看...
开学必装5个应用 许多童鞋都表示暑假好漫长,每天好无聊,上网-吃饭-睡觉-吃饭-上网,如此循环往复(毕业两年的小编很是羡慕)表担心,你们无聊的暑假即将结束,美好的学校生活即将展开–尤其是即将步入大学的孩纸们。 在开学之前,介绍5款可以让你的大学生活更加丰富多彩的应用,用一句话概括就是:发发邮件,搞搞基!咳咳,一起来看一...
标签: Web开发
  纯js编写  跨框架  无图片  支持调速度  任意位置弹出  需要ie5.5以上 
标签: 电脑入门
先大致的给大家讲解一下主要操作有哪些:下载MSN软件→安装→注册MSN账号→登陆MSN→添加群账号→打开群聊天窗口。关于设置个人信息的一些设置,其实关于MSN聊天软件和QQ使用差不多,大家如果熟练的掌握了QQ的一些操作,相信对于使用MSN也是很快就能熟悉的。 首先,在网上搜索下载最新版的MSN软件,这就不需要图老师小编...
 作者:Victor Chen 来自:C++ 爱好者 http://www.cppfans.com -------------------------------------------------------------------------------- 程序介绍: 利用这个程序: 1.可以监视在你的电脑运行的程序, 把在你的电脑运行过的程序的时间和名字记录下来; 2.可以阻止你规定的禁用程序的执...

经验教程

267

收藏

74
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部