您现在的位置是:主页 > news > 厦门海沧网站建设/深圳seo优化服务

厦门海沧网站建设/深圳seo优化服务

admin2025/6/30 5:38:55news

简介厦门海沧网站建设,深圳seo优化服务,做网站的背景照,永年网站建设导读: 新一篇: 我是怎么了 木马是如何获取别人密码的呢?方法有很多,比如欺骗法(伪造一个假的界面,来骗取对方的密码),监听对方的键盘鼠标操作,或者直接侵入到系统文件夹中&#xff0…

厦门海沧网站建设,深圳seo优化服务,做网站的背景照,永年网站建设导读: 新一篇: 我是怎么了 木马是如何获取别人密码的呢?方法有很多,比如欺骗法(伪造一个假的界面,来骗取对方的密码),监听对方的键盘鼠标操作,或者直接侵入到系统文件夹中&#xff0…
导读:
  新一篇: 我是怎么了
  木马是如何获取别人密码的呢?方法有很多,比如欺骗法(伪造一个假的界面,来骗取对方的密码),监听对方的键盘鼠标操作,或者直接侵入到系统文件夹中,找到保存密码的文件,等等。这里,我着重研究的是关于键盘和鼠标监听的技术。
  首先,我们必须了解windows的消息处理机制。在windows系统下,对于某一窗口,用户或者系统对它的操作都是一个消息,这些消息会放入到一个FIFO的队列中,该窗口会依次从队列中取出消息,从而做出相应的反应。当然,也有一些类型的消息是例外的,它们可以优先被取出。
  那么,很自然的,要想截获键盘和鼠标的信息,也就是要截获相应的消息,并在将该消息传递给窗口前先做出处理,然后再传递给相应窗口或者停止传递。windows下有一个称为钩子(hook)的东西,它可以捕获windows的消息,下面,我们来看一下钩子到底该如何使用。
  一、钩子的安装。
  使用API函数SetWidowsHookEx()可以创建一个自定义的钩子。其具体参数如下:
  
  
  HHOOK SetWindowsHookEx(
  
  
  int idHook, // 钩子的类型,即它处理的消息类型
  
  HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数为0
  
  
  // 或是一个由别的进程创建的线程的标识,
  
  
  // lpfn必须指向DLL中的钩子子程。
  
  
  // 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
  
  
  // 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
  
  HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的DLL。
  
  
  // 如果dwThreadId 标识当前进程创建的一个线程,
  
  
  // 而且子程代码位于当前进程,hMod必须为NULL。
  
  
  // 可以很简单的设定其为本应用程序的实例句柄。
  
  DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
  
  
  // 如果为0,钩子子程与所有的线程关联,即为全局钩子。
  
  );
  
  
  
  
  
  其中,由于我们需要监视的是键盘和鼠标,所以,idHook可以设为WM_KEYBOARD或WM_MOUSE,钩子子程的函数形式为
  LRESULT CALLBACK HookProc
  (
  int nCode,
  WPARAM wParam,
  LPARAM lParam
  );
  其中,HookProc是应用程序定义的名字。nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。
  另外,别忘了我们的目的,我们要监视的可不是仅仅是自己进程的操作,因此,dwThreadId需要设为0。而且,这个钩子需要放入动态链接库,才能达到监视的作用。
  二、资源的共享
  仅仅放入动态链接库是没用的,我们要让这个钩子为多有的进程所共享,这样才能够监视鼠键的一举一动。所以,我们可以这么做:
  #pragma data_seg("SharedData")
  HHOOK hHook=NULL;
  #pragma data_seg()
  另外,在导出dll的*.def中加入
  SETCTIONS
  SharedData READ WRITE SHARED
  注意第二行中的SharedData前不要有空格;或者可以在cpp文件中加入
  #pragma comment(linker,"/section:.SharedDataName,rws")
  两种方法的效果是一样的。
  三、钩子的卸载
  经过以上的准备,鼠键的操作可以说是全在自己的掌控之中了,那么,只差最后一步,当我监视完后,如何将钩子卸载了,以免影响系统速度。这个就相对很简单了,只需使用如下的函数即可
  UnHookWindowsHookEx
  (
  HHOOK hhk;//需要卸载的钩子
  );
  (以上参考了MSDN的HOOK专题文章)
  最后,附上一段对鼠标操作进行监控的dll段代码,参考了玉海园的《Win32全局钩子在VC5中的实现》
  
  
  
  
  #pragma data_seg("ShareDataName")
  
  HWND glhPrevTarWnd=NULL;
  
  
  HWND glhDisplayWnd=NULL;
  
  
  HHOOK glhHook=NULL;
  
  
  HINSTANCE glhInstance=NULL;
  
  #pragma data_seg()
  
  
  
  LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam);
  
  
  
  static AFX_EXTENSION_MODULE mouseHook2DLL = ...{ NULL, NULL }
  
  
  
  extern "C" int APIENTRY
  
  
  DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  
  
  
  ...{
  
  
  // 如果使用 lpReserved,请将此移除
  
  UNREFERENCED_PARAMETER(lpReserved);
  
  
  
  
  if (dwReason == DLL_PROCESS_ATTACH)
  
  
  
  
  ...{
  
  
  TRACE0("mouseHook2.DLL 正在初始化! ");
  
  
  //MessageBox(NULL,"mouseHook2.DLL 正在初始化! ",NULL,MB_OK);
  
  
  // 扩展 DLL 一次性初始化
  
  if (!AfxInitExtensionModule(mouseHook2DLL, hInstance))
  
  
  return 0
  
  
  
  // 将此 DLL 插入到资源链中
  
  
  // 注意: 如果此扩展 DLL 由
  
  
  // MFC 规则 DLL(如 ActiveX 控件)隐式链接到
  
  
  // 而不是由 MFC 应用程序链接到,则需要
  
  
  // 将此行从 DllMain 中移除并将其放置在一个
  
  
  // 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
  
  
  // 规则 DLL 然后应显式
  
  
  // 调用该函数以初始化此扩展 DLL。否则,
  
  
  // CDynLinkLibrary 对象不会附加到
  
  
  // 规则 DLL 的资源链,并将导致严重的
  
  
  // 问题。
  
  
  
  new CDynLinkLibrary(mouseHook2DLL);
  
  
  //
  
  glhInstance = hInstance;
  
  
  
  
  }
  
  else if (dwReason == DLL_PROCESS_DETACH)
  
  
  
  
  ...{
  
  
  TRACE0("mouseHook2.DLL 正在终止! ");
  
  
  //MessageBox(NULL,"mouseHook2.DLL 正在终止! ",NULL,MB_OK);
  
  
  // 在调用析构函数之前终止该库
  
  AfxTermExtensionModule(mouseHook2DLL);
  
  
  }
  
  return 1 // 确定
  
  }
  
  
  
  Cmousehook2::Cmousehook2()
  
  //类构造函数
  
  
  
  ...{
  
  
  }
  
  Cmousehook2::~Cmousehook2()
  
  //类析构函数
  
  
  
  ...{
  
  
  stophook();
  
  
  }
  
  BOOL Cmousehook2::starthook(HWND hWnd)
  
  //安装钩子并设定接收显示窗口句柄
  
  
  
  ...{
  
  
  
  
  
  BOOL bResult=FALSE;
  
  
  glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
  
  if(glhHook!=NULL)
  
  
  
  ...{
  
  
  //MessageBox(NULL,"mouseHook2.DLL! ",NULL,MB_OK);
  
  bResult=TRUE;
  
  
  }
  
  //创建钩子不成功
  
  else
  
  
  
  ...{
  
  
  CHAR szBuf[80];
  
  
  DWORD dw = GetLastError();
  
  
  
  
  
  sprintf(szBuf, "failed: GetLastError returned %u ", dw);
  
  
  
  
  
  MessageBox(NULL, szBuf, "Error", MB_OK);
  
  
  }
  
  glhDisplayWnd=hWnd;
  
  //设置显示目标窗口标题编辑框的句柄
  
  return bResult;
  
  
  }
  
  
  
  BOOL Cmousehook2::stophook()
  
  //卸载钩子
  
  
  
  ...{
  
  
  BOOL bResult=FALSE;
  
  
  if(glhHook)
  
  
  
  
  ...{
  
  
  bResult=UnhookWindowsHookEx(glhHook);
  
  
  if(bResult)
  
  
  
  
  ...{
  
  
  glhPrevTarWnd=NULL;
  
  
  glhDisplayWnd=NULL;//清变量
  
  glhHook=NULL;
  
  
  }
  
  }
  
  return bResult;
  
  
  }
  
  
  
  LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
  
  
  
  ...{
  
  
  //MessageBox(NULL,"haha",NULL,MB_OK);
  
  LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;
  
  
  if (nCode>=0)
  
  
  
  
  ...{
  
  
  HWND glhTargetWnd=pMouseHook->hwnd;
  
  
  //取目标窗口句柄
  
  HWND ParentWnd=glhTargetWnd;
  
  
  while (ParentWnd !=NULL)
  
  
  
  
  ...{
  
  
  glhTargetWnd=ParentWnd;
  
  
  ParentWnd=GetParent(glhTargetWnd);
  
  
  //取应用程序主窗口句柄
  
  }
  
  if(glhTargetWnd!=glhPrevTarWnd)
  
  
  
  
  ...{
  
  
  char szCaption[100];
  
  
  GetWindowText(glhTargetWnd,szCaption,100);
  
  
  // MessageBox(NULL,szCaption,NULL,MB_OK);
  
  
  //取目标窗口标题
  
  if(IsWindow(glhDisplayWnd))
  
  
  SendMessage(glhDisplayWnd,WM_SETTEXT,0,
  
  
  (LPARAM)(LPCTSTR)szCaption);
  
  
  //::UpdateWindow(glhDisplayWnd);
  
  glhPrevTarWnd=glhTargetWnd;
  
  
  //保存目标窗口
  
  }
  
  }
  
  return CallNextHookEx(glhHook,nCode,wparam,lparam);
  
  
  //继续传递消xi
  
  }

本文转自
http://blog.csdn.net/jerrycircle/archive/2006/11/07/1372070.aspx