首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
首页 | JAVA | C# | VB | VB.NET | C/C++ | delphi | 工程管理 | 其他语言 | 论坛
各大城市软件开发培训、软件人才免费咨询热线:400-700-5807
 您现在的位置: 中国IT实验室 >> 桌面开发 >> VB >> 正文
基于HOOK和MMF的Win密码渗透技术
来源:ChinaItLab 作者:佚名 时间:2007-11-15



  运用内存映像文件解决进程间通信问题,并且创建一个互斥变量来解决线程的同步问题。所有这些封装在一个CIPC的类中。通过运用内存映像文件解决了不同编译器的兼容问题,因为使用的都是标准Win32 API。加上MMF支持进程间的数据共享,在未来的windows版本中微软不会改变MMF的定义及方法。并且互斥变量保持了线程访问的同步。以下给出CIPC的类定义。

class CIPC
{
 public:
  CIPC();
  virtual ~CIPC();
  bool CreateIPCMMF(void);//创建一个进程间通信的MMF
  bool OpenIPCMMF(void);//打开一个进程间通信的MMF
  void CloseIPCMMF(void);//关闭一个进程间通信的MMF
  bool IsOpen(void) const {return (m_hFileMap != NULL);}//判断MMF是否打开
  bool ReadIPCMMF(LPBYTE pBuf, DWORD &dwBufSize);//读MMF
  bool WriteIPCMMF(const LPBYTE pBuf, const DWORD dwBufSize);//写MMF
  bool Lock(void);//进入临界区,创建互斥信号量
  void Unlock(void);//退出临界区,撤消互斥信号量
 protected:
  HANDLE m_hFileMap;//MMF文件句柄
  HANDLE m_hMutex;//互斥变量句柄
};

  7、利用WM_COPYDATA消息来解决进程间的通信

  在解决进程间的通信问题方面,WM_COPYDATA消息是一个非常好的工具,可以节省程序员的许多时间。

  当内存映像文件被建立时,系统就发送消息来填充它。然后系统再转回到最初调用SendMessage的进程,从共享内存映像文件中将数据复制到所指定的缓冲区中,然后从SendMessage调用返回。

  对于系统已经知道的消息,发送消息时都可以按相应的方式来处理。如果要建立自己的(WM_USER+x)消息,并从一个进程向另一个进程的窗口发送,那又会怎么样?系统并不知道用户要用内存映像文件并在发送消息时改变指针。为此,微软建立了一个特殊的窗口消息, WM_COPYDATA以解决这个问题:

COPYDATASTRUCT cds;
SendMessage(hwndReceiver,WM_COPYDATA,(WPARAM)hwndSender,(LPARAM)&cds);
COPYDATASTRUCT是一个结构,定义在winuser.h文件中,形式如下面的样子:
Typedef struct tagCOPYDATASTRUCT{
 ULONG_PTR dwData;
 DWORD cbData;
 PVOID lpData;
}COPYDATASTRUCT;

  当一个进程要向另一个进程的窗口发送一些数据时,必须先初始化COPYDATASTRUCT结构。数据成员dwData是一个备用的数据项,可以存放任何值。例如,用户有可能向另外的进程发送不同类型或不同类别的数据。可以用这个数据来指出要发送数据的内容。cbData数据成员规定了向另外的进程发送的字节数,lpData数据成员指向要发送的第一个字节。lpData所指向的地址,当然在发送进程的地址空间中。

  当SendMessage看到要发送一个WM_COPYDATA消息时,它建立一个内存映像文件,大小是cbData字节,并从发送进程的地址空间中向这个内存映像文件中复制数据。然后再向目的窗口发送消息。在接收消息的窗口过程处理这个消息时,lParam参数指向已在接收进程地址空间的一个COPYDATASTRUCT结构。这个结构的lpData成员指向接收进程地址空间中的共享内存映像文件的视图。
8、关于WM_COPYDATA消息,应该注意三个重要问题

  1)只能发送这个消息,不能登记这个消息。不能登记一个WM_COPYDATA消息,因为在接收消息的窗口过程处理完消息之后,系统必须释放内存映像文件。如果登记这个消息,系统不知道这个消息何时被处理,所以也不能释放复制的内存块。

  2)系统从另外的进程的地址空间中复制数据要花费一些时间。所以不应该让发送程序中运行的其他线程修改这个内存块,直到SendMessage调用返回。

  3)利用WM_COPYDATA消息,可以实现1 6位和3 2位之间的通信。它也能实现3 2位与6 4位之间的通信。这是使新程序同旧程序交流的便捷方法。

  9、重要代码及注解

  9.1钩子函数void ExtractPassword(const HWND hWnd, const HWND hPwdSpyWnd),该函数是获取密码的主要函数

TCHAR szBuffer[256] = {_T('\0')};//分配一个缓冲区
SendMessage(hWnd,WM_GETTEXT,//向注入钩子进程发消息获得密码文本
sizeof(szBuffer)/sizeof(TCHAR), (LPARAM)szBuffer);//保存在缓冲区中
COPYDATASTRUCT cds = {0};//定义一个cds结构体
cds.dwData = (DWORD)hWnd;//dwData保存该进程句柄
cds.cbData = (lstrlen(szBuffer) + 1) * sizeof (TCHAR); //cbData保存数据长度
cds.lpData = szBuffer;//lpData指向缓冲首地址
SendMessage(hPwdSpyWnd,WM_COPYDATA,
 (WPARAM)hWnd, (LPARAM)&cds);//利用WM_COPY DATA消息给获取密码进程发送密码

  9.2钩子过程LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam),该过程主要完成从内存映像文件中读出保存的钩子句柄。

if(g_hHook == NULL)
{
 //从共享资源中读数据,最终获取钩子句柄
 DWORD dwData = 0, dwSize = sizeof (DWORD);
 g_obIPC.Lock();//g_obIPC为CIPC对象,进入线程的同步
 g_obIPC.OpenIPCMMF();//打开MMF文件
 g_obIPC.ReadIPCMMF((LPBYTE)&dwData, dwSize);//读数据给dwData
 g_obIPC.Unlock();//取消线程同步,退出临界区
 g_hHook = (HHOOK)dwData;//将读到的数据赋值给钩子句柄,本文的关键所在
}

if(nCode >= 0)//忽略小于0的值
{
 HWND hWnd = NULL; //密码控件所在的窗口句柄
 HWND hPwdSpyWnd = NULL;//获取密码进程的窗口句柄
 MSG *pMsg = (MSG*)lParam;
 if(pMsg->message == g_wmScanPassword)//是否我们登记的消息
 {
  hWnd = (HWND)pMsg->wParam;
  hPwdSpyWnd = (HWND)pMsg->lParam;
  ExtractPassword(hWnd, hPwdSpyWnd); //通过发送消息得到密码
 }
}

return CallNextHookEx(g_hHook, nCode, wParam, lParam);//返回下一钩子过程

  10、演示界面

  如图3所示:实例是MFC下基于对话框的工程。在window XP下,拖动图片控件放大镜来检索密码控件中的密码。下面的文本框显示一些相关的窗口信息以及密码文本。

  11、反密码渗透应对策略

上一页  [1] [2] [3] 下一页

【责编:Luzi】
中国IT教育热线咨询
相关文章
几种VC++数据库开发技术的相对比较
利用C#实现标注式消息提示窗口
用C#创建COM对象
Visual C#多线程参数传递浅析…
Visual C#多线程参数传递浅析…
Visual C++设计超强仿QQ自动伸缩窗口…
Java SE 6.0实现高质量桌面集成开发…
Visual Basic 9.0隐式类型的局部变量…
JMX+J2SE5.0实现Web应用的安全管理
多线程、Socket技术及委托技术的关系
推荐文章

 精彩友情推荐
·Asp源码 PHP源码
·CGI源码 JSP源码
·建站书籍教程
·服务器软件 .net源码
·建站工具软件
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
最新更新 推荐文章
·框架:J2EE WEB应用架构分析…03-13
·几种VC++数据库开发技术的相对比…03-13
·利用C#实现标注式消息提示窗口03-13
·用C#创建COM对象03-13
·Visual C#多线程参数传递浅析…03-13
·Visual C#多线程参数传递浅析…03-13
·基于HOOK和MMF的Win密码渗透技术11-15
·Visual C++设计超强仿QQ自动伸缩…11-15
·Java SE 6.0实现高质量桌面集成开…11-15
·史玉柱东山再起幕后高人11-15
·用C#创建COM对象09-06
·IT管理十大失误及其对策08-30
·VC中利用MFC设计绘图程序初步08-23
·JAVA中对象创建和初始化过程08-23
·C语言中的位域的使用08-09
·浅谈Java桌面应用程序开发08-09
·C#的前途如何?08-02
·几种VC++数据库开发技术的相对比较07-12
·用Visual C#实现网络封包监视…07-12
·VB.NET中的TextBox控件详解07-12
·VB.NET实现PC与掌上电脑PPC的双向通信07-05