




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 / 10基于 HOOK 技术和 MMF 的 Windows 密码渗透技术研究摘 要 随着计算机与网络的普及,信息安全越来越成为人们所普遍关心的大事。密码的渗透与反渗透在此领域表现的愈演愈烈。深入分析了各个版本 windows 密码的特点,尤其是针对 windws2K/XP 安全性提高的情况下,提出了获取 windows 密码的关键技术及方法。并进一步分析了windows 钩子和内存映像文件的技术细节。在基于 MMF 的核心类 CIPC 中为钩子句柄在内存中的共享提供了方法,并且解决了线程间的同步问题。然后深入讨论了 WM_COPYDATA消息的特点。接着分析了实例程序重要代码及注解并演示了结果。最终给出一些反密码渗透的应对策略。 关键词 内存映像文件;windows 钩子;进程间通信;多线程 1 引言 上世纪 90 年纪使用过的人可能很少有人了解这类操作系统中存在着密码保护的漏洞,如果选择密码控件中的“*”文本然后复制到剪贴板上,那么看到的将不是“*”而是密码的原始文本。微软发现了这个问题并在新的版本 window95 中修改了这个漏洞。但是 windows95 存在着新的安全漏洞,可以设计出间谍程序从当前运行的程序中得到密码控件中的密码,这些间谍程序并非是如同softice 一样的破解程序。然而,微软在 window2000 中又2 / 10修补了这个问题,如何通过 MMF 与 HOOK 技术获取任何版本windows 密码控件的内容,这正是讨论的重点问题。图Windows 2K/XP 密码校验 获取 Windows 密码技术主要是利用了 windows 的安全漏洞。在 windows NT/95/98/ME 等操作系统下,如果在间谍程序中发送 WM_GETTEXT 消息到密码控件,返回的文本将不再是“*”而是实际的文本内容,而在 windows2K/XP 系统中微软加了安全控制,如果发送WM_GETTEXT 到密码控件,系统将校验请求的进程判断该进程是否有许可权,如图 1 所示:如果请求进程与密码控件所在进程是同一进程,那么 WM_GETTEXT 消息将仍旧返回密码的真实文本。如果两个进程不一样,就返回一个ERROR_ACCESS_DENIED 的错误。所以获取 windows2K/XP 密码的关键技术在于:从密码控件所在的进程中获取WM_GETTEXT 消息,而不是在渗透进程中得到。而这种在其它进程中运行用户代码的技术完全可以利用 windows 钩子(hook)技术来实现。首先我们需要了解一下什么是钩子。2 Windows 钩子 Windows 系统是建立在事件驱动的机制上的,即整个系统都是通过消息的传递来实现的。钩子(hook)是一种特殊的消息处理机制,钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标3 / 10的输入,屏幕取词,日志监视等等。钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。如图 2 是一全局钩子示意图。 在实例程序中运用WH_GETMESSAGE 钩子,这个钩子监视投递到消息队列中的Windows 消息。图 2全局钩子的原理图 3 Windows 钩子在此处的应用 安装钩子的函数为 SetWindowsHookEx,利用这个函数可以为整个系统或为某一特定进程安装钩子,不同的钩子监视特定钩子事件的发生,当某一事件触发后,与之对应的代码就会被系统调用。运用 windows 钩子的一个难点是如何妥善保存钩子的句柄。在设置钩子前需要解决两件事: 1) 一个包括了钩子函数的动态链接库; 2) 要注入钩子的进程ID。 现在假设进程 A 为进程 B 注入了一个钩子。钩子注入后,钩子的句柄返回给了进程 A 并且动态链接库映射到了进程 B 的地址空间。当进程 B 中触发了一个钩子事件,钩子代码被进程 B 调用(需要特别指出的是,钩子代码被一个远程进程所调用,被调用的钩子代码中如果调用GetCurrentProcessId 这个函数,得到的是被注入了钩子进程的进程 ID,而不是注入进程)。在钩子代码中通过发消息获取密码真实文本,在钩子代码结束前需调用4 / 10CallNextHookEx 函数,如果这个函数调用失败,安装的其它钩子将得不到消息。现在出现的问题是 CallNextHookEx需要一个钩子的句柄,但那个所需的句柄已返回给了进程A 而钩子程序目前运行在进程 B 的代码段内。这样就需要用到进程间通信 IPC(Inter Process Communication)来传递钩子句柄。 4 进程间通信的一般方法 解决以上问题的一般方法是在动态链接库中创建一个“共享”部分,写入如下代码: #pragma data_seg(“Shared”) HHOOK g_hHook = NULL; #pragma data_seg() #pragma comment(linker, “/section:Shared,rws”) 简单地说这几行代码创建了一个共享的变量,如果 5 个进程载入这个动态链接库,5 个进程都有访问的权限。但这个方法有一些问题:一是一些编译器可能并不支持这种方法。二是如果未来的 windows版本发生了改变,这种方法就行不通。三是这个方法没有规定线程同步,如果有多线程访问这个变量,线程同步是非常重要的,没有线程间的同步可能会触发诸如冲突等一些问题。解决这个问题的方法是利用内存映像文件(MMF)。5 内存映像文件 在 WIN32 中,通过使用映像文件在进程间实现共享文件或内存共享,如果利用相同的映像名字或文件句柄,则不同的进程可以通过一个指针来读写同一个文件或者同一内存数据块,并把他们当成该进程内存空间的5 / 10一部分。内存映像文件可以映射一个文件、一个文件中的指定区域或者指定的内存块,其中的数据就可以用内存读取指令来直接访问,而不用频繁的使用操作文件的 I/O 系统函数,从而提高文件的存取速度和效率。 映像文件的另一个重要作用就是用来支持永久命名的共享内存。要在两个应用程序之间共享内存,可以在一个应用程序中创建一个文件并映射,然后另外一个程序通过打开和映射此文件,并把它当作自己进程的内存来使用。6 建立基于 MMF 的类CIPC 运用内存映像文件解决进程间通信问题,并且创建一个互斥变量来解决线程的同步问题。所有这些封装在一个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 /读 MMF bool WriteIPCMMF(const LPBYTE pBuf, const DWORD 6 / 10dwBufSize);/写 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) COPYDATASTRUCT 是一个结构,定义在文件中,形式如下面的样子: Typedef struct tagCOPYDATASTRUCT ULONG_PTR dwData;DWORD cbData; PVOID lpData; COPYDATASTRUCT; 当一个进程要向另一个进程的窗口发送一些数据时,必须先7 / 10初始化 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 8 / 102 位与 6 4 位之间的通信。这是使新程序同旧程序交流的便捷方法。9 重要代码及注解钩子函数 void ExtractPassword(const HWND hWnd, const HWND hPwdSpyWnd),该函数是获取密码的主要函数 TCHAR szBuffer256 = _T(0);/分配一个缓冲区 SendMessage(hWnd,WM_GETTEXT,/向注入钩子进程发消息获得密码文本 sizeof(szBuffer)/sizeof(TCHAR), (LPARAM)szBuffer);/保存在缓冲区中 COPYDATASTRUCT cds = 0;/定义一个 cds 结构体 = (DWORD)hWnd;/dwData 保存该进程句柄 = (lstrlen(szBuffer) + 1) * sizeof (TCHAR); /cbData 保存数据长度 = szBuffer;/lpData 指向缓冲首地址 SendMessage(hPwdSpyWnd,WM_COPYDATA, (WPARAM)hWnd, (LPARAM)/利用 WM_COPY DATA 消息给获取密码进程发送密码 钩子过程 LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam),该过程主要完成从内存映像文件中读出保存的钩子句柄。 if(g_hHook = NULL) /从共享资源中读数据,最终获取钩子句柄 DWORD dwData = 0, dwSize = sizeof (DWORD); g_();/g_obIPC为 CIPC 对象,进入线程的同步 g_();/打开 MMF 文件 g_(LPBYTE)9 / 10/取消线程同步,退出临界区 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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025房地产代理销售协议书:生态住宅区代理服务
- 2025标准小型厂房租赁合同及配套设施租赁及维护服务范本
- 2025版砂厂环保设备安装与运行承包服务协议
- 河北省崇礼县2025年上半年公开招聘城市协管员试题含答案分析
- 2025第十一章:国际物流货物保险合同-全面风险控制
- 2025版全新幼儿园场地租赁及幼儿家长活动服务协议
- 2025版光伏发电项目前期物业管理服务合同范本
- 2025版科技研发中心前期物业服务合同范本
- 2025电子商务电子合同法律效力认定与执行合同
- 2025年度会议中心租赁服务合同书
- 高等数学期末试卷及答案
- 从0开始跨境电商-第三章-阿里巴巴国际站入门-OK
- 新能源电站远程监控系统建设方案
- 《紫藤萝瀑布》《丁香结》《好一朵木槿花》
- 2023柔性棚洞防护结构技术规程
- 河流地貌的发育 - 侵蚀地貌
- 离网光伏发电系统详解
- 英语初高中衔接音标
- 广告文案写作(第二版)全套教学课件
- 《国家电网公司电力安全工作规程(配电部分)》
- 金融学黄达ppt课件9.金融市场
评论
0/150
提交评论