基于HOOK和MMF的Windows密码渗透技术

随着计算机与网络的普及,信息安全越来越成为人们所普遍关心的大事。密码的渗透与反渗透在此领域表现的愈演愈烈。本文深入分析了各个版本Windows密码的特点,尤其是针对windws2K/XP安全性提高的情况下,提出了获取windows密码的关键技术及方法。并进一步分析了windows钩子(Hook)和内存映像文件(MMF)的技术细节。在基于MMF的核心类CIPC中为钩子句柄在内存中的共享提供了方法,并且解决了线程间的同步问题。然后深入讨论了WM_COPYDATA消息的特点。接着分析了实例程序重要代码及注解并演示了结果。最终给出一些反密码渗透的应对策略。

1、引言

  上世纪90年纪使用过windows3.x的人可能很少有人了解这类操作系统
存在着密码保护的漏洞,如果选择密码控件中的“****”文本然后复制到剪贴板上,那么看到的将不是“****”而是密码的原始文本。微软发现了
windows3.x这个问题并在新的版本window95中修改了这个漏洞。但是windows95存在着新的安全漏洞,可以设计出间谍程序从当前运行
的程序中得到密码控件中的密码,这些间谍程序并非是如同softice一样的破解程序。然而,微软在window2000中又修补了这个问题,如何通过
MMF与HOOK技术获取任何版本windows 密码控件的内容,这正是本文讨论的重点问题。

  图1 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)是一种特殊的消息处理机制,钩子可以监视系统或进程中的各种事件消息,截获发往目标窗
口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘鼠标的输入,屏幕取词,日志监视等等。钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。如图2是一全局钩子示意图。

  在实例程序中运用WH_GETMESSAGE钩子,这个钩子监视投递到消息队列中的Windows消息。

  
  图2 全局钩子的原理图

  3、Windows钩子在此处的应用

  安装钩子的函数为SetWindowsHookEx,利用这个函数可以为整个系统或为某一特定进程安装钩子,不同的钩子监视特定钩子事件的发生,当某一事件触发后,与之对应的代码就会被系统调用。

  运用windows钩子的一个难点是如何妥善保存钩子的句柄。在设置钩子前需要解决两件事:

  1) 一个包括了钩子函数的动态链接库;

  2) 要注入钩子的进程ID。

 
 现在假设进程A为进程B注入了一个钩子。钩子注入后,钩子的句柄返回给了进程A并且动态链接库映射到了进程B的地址空间。当进程B中触发了一个钩子事
件,钩子代码被进程B调用(需要特别指出的是,钩子代码被一个远程进程所调用,被调用的钩子代码中如果调用GetCurrentProcessId这个函
数,得到的是被注入了钩子进程的进程ID,而不是注入进程)。在钩子代码中通过发消息获取密码真实文本,在钩子代码结束前需调用
CallNextHookEx函数,如果这个函数调用失败,安装的其它钩子将得不到消息。现在出现的问题是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、内存映像文件(MMF)

 
 在WIN32中,通过使用映像文件在进程间实现共享文件或内存共享,如果利用相同的映像名字或文件句柄,则不同的进程可以通过一个指针来读写同一个文件
或者同一内存数据块,并把他们当成该进程内存空间的一部分。内存映像文件可以映射一个文件、一个文件中的指定区域或者指定的内存块,其中的数据就可以用内
存读取指令来直接访问,而不用频繁的使用操作文件的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 &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、反密码渗透应对策略

  通过以上介绍的原理、方法及实现我们了解了如何得到Windows
列密码的方法,一个逻辑的问题是如何防止别人利用这样的间谍程序复制我们的密码?例如我们上网时如果被这样的钩子程序入侵,怎么才能保护密码的安全。首选
的解决方法是欺骗间谍程序,在用户程序中不要显示真实的密码,最好是在密码控件中显示一条虚假的密码。这样如果有人用以上的程序来获取密码,那他得到的是
虚假的密码而不是真实密码。

  当然还有其它的应对策略,一种可行的方法是拦截WM_GETTEXT。但用虚假密码还有其它的好处,通过
利用虚假密码代替真密码,那么看到的密码控件上***长度就不能判断密码到底有多长。如果一个程序在其密码控件中显示了“***”的文本,我们立即知道密
码只有三个字符的长度,密码的安全性大大降低。但如果通过一些加密算法将密码控件的显示变为一长串的“*”,这种方法常见于微软的密码保护策略。那么密码
攻击者将无从下手。

  
  图3 实例演示

  12、小结

 
 本文以评论windows系列的密码特点为起点,主要针对2k/XP下的密码渗透进行了分析。通过在进程内注入windows钩子以及利用内存映像文件
安全传递钩子句柄等技术,找出一条获取2K/XP中密码的途径。但不可否认这都是建立在利用windows安全漏洞的基础之上的。为了弥补这些安全漏洞,
本文在最后也提出一些设想供读者参考。当然只是在技术上解决一些问题是不够的,关键还是人的因素,加强保密观念对于密码的保护起到了至关重要的作用。

基于HOOK和MMF的Windows密码渗透技术

时间: 2024-10-03 09:35:53

基于HOOK和MMF的Windows密码渗透技术的相关文章

ali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码

Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码 文/玄魂 目录 Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码.......................................................................................................................

我是如何破解你的WINDOWS密码的 ?(1)

我是如何破解你的WINDOWS密码的 ?(1)   密码可以看作我们主要,甚至某些情况下唯一可用于防范入侵的防线.就算入侵者无法在物理上接触到计算机,对于对外的Web应用,他们依然可以通过远程桌面协议或身份验证功能访问到服务器上的服务. 本文的主要是为了告诉您Windows创建和存储密码哈希(Hash)的方式,以及这些哈希的破解方式.在介绍了如何破解Windows密码后,我还将介绍一些技巧,帮助您防范此类攻击. 介绍 密码可以看作我们主要,甚至某些情况下唯一可用于防范入侵的防线.就算入侵者无法在

Windows Workflow Foundation技术介绍(基于.NET Framework 4.5)

Windows Workflow Foundation技术介绍(基于.NET Framework 4.5) 转自:http://www.cpiso.cn/jsyj/ghxx/2014/5/15/459.shtml Microsoft Windows Workflow Foundation (WF) 是一个可扩展框架,用于在 Windows 平台上开发工作流解决方案.Windows Workflow Foundation 同时提供了 API 和一些工具,用于开发和执行基于工作流的应用程序.Wind

基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletp

基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(2)-汉字文档手写轨迹输入多语言识别 大家先看看流程与效果,然后我来讲解代码, 1.VS2010帅气的启动画面 2.VS2010的工程画面 3.程序最终生成画面 4.程序启动画面 5 程序运行画面 6.程序枚举所有的语言识别手写识别器 7 英文识别范例 8.韩文识别范例 9.中文识别范例 10.线条式文档 11.格子式样文档 12.书写向导模式 13.tablet pc

《Web渗透技术及实战案例解析》pdf

下载地址:网盘下载 内容简介 编辑 本书从Web渗透的专业角度,结合网络安全中的实际案例,图文并茂地再现Web渗透的精彩过程.本书共分7章,由浅入深地介绍和分析了目前网络流行的Web渗透攻击方法和手段,并结合作者多年的网络安全实践经验给出了相对应的安全防范措施,对一些经典案例还给出了经验总结和技巧,通过阅读本书可以快速掌握目前Web渗透的主流技术.本书最大的特色就是实用和实战性强,思维灵活.内容主要包括Web渗透必备技术.Google黑客技术.文件上传渗透技术.SQL注入.高级渗透技术.0day

安天实战课题研究2017年第二期内网渗透技术题目

安天实战课题研究2017年第二期内网渗透技术题目拟研究以下题目:1.使用NTScan扫描内网Windows口令(已经完成)2.使用Hscan进行内网口令扫描 (已经完成)3.扫描Mysql口令 (已经完成)4.扫描MSSQL口令 (已经完成)5.使用SQLTools查看SQL Server数据库及提权 (已经完成)6.内网信息收集工具7.内网信息自动收集脚本8.内网密码获取工具9.服务器明文密码及hash获取10.Windows及Linux密码哈希破解11.远程终端使用攻略 (已经完成)12.记

Windows Server 2016技术预览

Windows Server 2016是微软将于2016年9月份发布的最新服务器操作系统.目前微软官方发布了许多Windows Server 2016新的功能和特性,下面我们来简单看下: 主要内容 预览版界面 系统需求及安装 服务器管理变化 新特性及变化 预览版界面 服务器界面,沉浸而不渲染 登录界面,色调变得活泼起来,用户图像由原先Windows2012的方块变成圆形 继续 进入系统,乍一看,以为是WIN10呢,注意右下角 如此做法,似乎在传递win10的最佳服务器系统就是他了 开始菜单,Al

Windows消息拦截技术的应用

Windows消息拦截技术的应用 民航合肥空管中心 周毅 一.前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动.换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理.处理完此次消息后又回到等待状态.从上面对Windows程式运行机制的分析不难发现,消息在用户与程式之间进行交流时起了一种中间“语言”的作用.在程式中接收和处理消息的主角是窗口,它通过消息泵接收消息,再通过一个窗口过程对消息进行相应的处理. 消息拦截的实现是在窗口过程处理消息之前拦截到消息

实验三 密码破解技术

学   号  201421430025   中国人民公安大学 Chinese people' public security university 网络对抗技术 实验报告   实验三 密码破解技术     学生姓名 刘家亨heng 年级 2014级 区队 三区队 指导教师 高见     信息技术与网络安全学院 2016年11月7日   实验任务总纲 2016-2017 学年 第 一 学期     一.实验目的 1.加深并消化本课程授课内容,复习所学过的互联网搜索技巧.方法和技术: 2.了解并熟悉