给MSN Messager装个钩子

Oh小菲机

Oh小菲机

2016-02-19 18:34

今天给大家分享的是由图老师小编精心为您推荐的给MSN Messager装个钩子,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!
最近研究怎么样使用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/
展开更多 50%)
分享

猜你喜欢

给MSN Messager装个钩子

编程语言 网络编程
给MSN Messager装个钩子

VC实现的MSN Messager钩子程序

编程语言 网络编程
VC实现的MSN Messager钩子程序

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

[DIY]快给电脑装个虚拟HUB

电脑网络
[DIY]快给电脑装个虚拟HUB

如何给QQ和MSN聊天记录加密

电脑网络
如何给QQ和MSN聊天记录加密

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

利用钩子捕捉鼠标信息的一个问题

编程语言 网络编程
利用钩子捕捉鼠标信息的一个问题

钩子(HOOK)机制的使用

编程语言 网络编程
钩子(HOOK)机制的使用

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

网页技巧怎么编写CSS

网页技巧怎么编写CSS

如何在网页插入CSS

如何在网页插入CSS
下拉加载更多内容 ↓