VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 400|回复: 1

VC++高级班之窗口篇-[7]打造自己的星号密码查看器

[复制链接]
01_avatar_middle
online_admins admin 发表于 2018-2-26 00:17:23 | 显示全部楼层 |阅读模式
------------------------------------------ Begin ----------------------------------------
①、星号密码查看器介绍:
星号密码的杀手,能够很方便显示星号密码框的密码,有助于找回已经遗忘的密码!
===================================================
②、获取星号密码的原理:
上世纪90年代使用过 Windows3.x 的人可能很少有人了解这类操作系统中存在着密码保护的漏洞,如果选择密码控件中的“****”文本然后复制到剪贴板上,
那么看到的将不是“****”而是密码的原始文本。微软发现了Windows3.x 这个问题并在新的版本Windows95 中修改了这个漏洞。

但是 Windows95 存在着新的安全漏洞,可以设计出间谍程序从当前运行的程序中得到密码控件中的密码(方法见下文)。然而,微软在 Window2000 中又修补了这个问题,
是判断消息发送的来源进程是否与当前密码控件属于同一进程,如果不是则返回 ERROR_ACCESS_DENIED 错误!但是也是有方法的,那就是利用 DLL 进程注入,
向密码控件发送 WM_GETTEXT、EM_GETLINE 消息来进行密码的获取!

编辑框 Edit 控件 是Windows的一个标准控件,当把其 Password 属性设为 True 时,就会将输入的内容屏蔽并变为星号(*),从而达到保护的目的。
但是 Edit 框中的内容可通过编程的方式发送 WM_GETTEXT、EM_GETLINE 消息来进行获取。
黑客程序就是利用 Edit 控件的这个特性,通过 SendMessage 向此窗口发送 WM_GETTEXT 或 EM_GETLINE 消息,这样Edit框中的内容就一目了然了!  
下面就给大家演示下这个技术,不过这里面只做技术讨论,希望大家不要用于非法用途!天若有情天亦老,人间正道是沧桑!
===================================================
③、对话框样式的修改及控件的添加、图标资源的添加;
===================================================
④、添加置顶选项功能,见上节;
===================================================
⑤、CStatic 派生类的添加:CDragStatic 以及控件类型变量的绑定;
===================================================
⑥、CDragStatic::OnLButtonDown 事件的添加:
  1. void CDragStatic::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3.         SetCapture(); //设定鼠标消息的发送窗口为当前窗口
  4.         HCURSOR hc = LoadCursor(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDC_CURSOR1));
  5.         ::SetCursor(hc);
  6.         HICON hIcon = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON2));
  7.         this->SetIcon(hIcon);
  8.         SetTimer(1, 400, NULL);

  9.         CStatic::OnLButtonDown(nFlags, point);
  10. }
复制代码

===================================================
⑦、CDragStatic::OnLButtonUp 事件的添加:
  1. void CDragStatic::OnLButtonUp(UINT nFlags, CPoint point)
  2. {
  3.         ReleaseCapture();
  4.         HICON hIcon=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON1));
  5.         this->SetIcon(hIcon);
  6.         KillTimer(1);

  7.         CStatic::OnLButtonUp(nFlags, point);
  8. }
复制代码

===================================================
⑧、添加 CDragStatic::OnTimer 定时器响应:
  1. void CDragStatic::OnTimer(UINT_PTR nIDEvent)
  2. {
  3.         HWND deskWnd = ::GetDesktopWindow();
  4.         HDC deskDC = ::GetWindowDC(deskWnd);
  5.         int oldRop2 = SetROP2(deskDC, R2_NOTXORPEN);

  6.         CPoint pt;
  7.         GetCursorPos(&pt);

  8.         HWND parentWnd = ::WindowFromPoint(pt);
  9.         HWND hTargetWnd = ::GetWindow(parentWnd, GW_CHILD);

  10.         CRect tempRc;
  11.         while (hTargetWnd){
  12.                 ::GetWindowRect(hTargetWnd, &tempRc);
  13.                 if(::PtInRect(&tempRc, pt)){
  14.                         break;
  15.                 }else{
  16.                         hTargetWnd = ::GetWindow(hTargetWnd, GW_HWNDNEXT);
  17.                 }
  18.         }

  19.         if ( !hTargetWnd ) hTargetWnd = parentWnd;

  20.         //窗口标题、编辑框文本的获取
  21.        
  22.         CRect mRect;
  23.         ::GetWindowRect(hTargetWnd, &mRect);

  24.         if( mRect.left < 0 ) mRect.left = 0;
  25.         if (mRect.top < 0 ) mRect.top = 0;

  26.         HPEN newPen = ::CreatePen(0, 3, RGB(125, 0, 125));
  27.         HGDIOBJ oldPen = ::SelectObject(deskDC, newPen);

  28.         ::Rectangle(deskDC, mRect.left, mRect.top, mRect.right, mRect.bottom);
  29.         Sleep(200);
  30.         ::Rectangle(deskDC, mRect.left, mRect.top, mRect.right, mRect.bottom);

  31.         ::SetROP2(deskDC, oldRop2);
  32.         ::SelectObject( deskDC, oldPen);

  33.         ::DeleteObject(newPen);
  34.         ::ReleaseDC(deskWnd, deskDC);
  35.         deskDC = NULL;

  36.         CStatic::OnTimer(nIDEvent);
  37. }
复制代码

===================================================
⑨、窗口标题、编辑框文本的获取:
  1. LRESULT nLen = ::SendMessage(hTargetWnd, WM_GETTEXTLENGTH, 0, 0);
  2. if (nLen > 0){
  3.         nLen += 1;
  4.         TCHAR *pszBuf = new TCHAR[nLen];
  5.         ZeroMemory(pszBuf, nLen);
  6.         ::SendMessage(hTargetWnd, WM_GETTEXT, nLen, (LPARAM)pszBuf);
  7.         GetParent()->SetDlgItemText(IDC_STATIC_SHOW, pszBuf);
  8.         delete [] pszBuf;
  9. }
复制代码

===================================================

  1. /************************************************************************
  2. // SmallestWindowFromPoint
  3. // Notice: from PasswordSpy by Brian Friesen
  4. //
  5. // Find the smallest window still containing the point
  6. //
  7. // WindowFromPoint returns the first window in the Z-order ->
  8. // if the password control is sorounded by a Group Box or some other control,
  9. // WindowFromPoint returns the handle to the sorounding control instead
  10. // to the password control.
  11. ************************************************************************/
  12. HWND SmallestWindowFromPoint(POINT point)
  13. {
  14.         RECT rect, rcTemp;
  15.         HWND hParent, hWnd, hTemp;

  16.         hWnd = ::WindowFromPoint(point);
  17.         if( hWnd != NULL ) {
  18.                 ::GetWindowRect(hWnd, &rect);
  19.                 hParent = ::GetParent(hWnd);

  20.                 // Has window a parent ?
  21.                 if(hParent != NULL) {
  22.                         // Search down the Z-Order
  23.                         hTemp = hWnd;
  24.                         do {
  25.                                 hTemp = ::GetWindow(hTemp, GW_HWNDNEXT);

  26.                                 // Search window contains the point, hase the same parent, and is visible?
  27.                                 ::GetWindowRect(hTemp, &rcTemp);
  28.                                 if(::PtInRect(&rcTemp, point) && ::GetParent(hTemp) == hParent && ::IsWindowVisible(hTemp)){
  29.                                         // Is it smaller?
  30.                                         if(((rcTemp.right - rcTemp.left) * (rcTemp.bottom - rcTemp.top)) < ((rect.right - rect.left) * (rect.bottom - rect.top))) {
  31.                                                 // Found new smaller window!
  32.                                                 hWnd = hTemp;
  33.                                                 ::GetWindowRect(hWnd, &rect);
  34.                                         }
  35.                                 }
  36.                         } while(hTemp != NULL);
  37.                 }
  38.         }

  39.         return hWnd;
  40. }
复制代码

  1. /////////////////////////////////////////////////////////////////////////////////////
  2. HWND hTargetWnd = SmallestWindowFromPoint(pt);
  3. if (GetWindowThreadProcessId(GetSafeHwnd(), NULL) == GetWindowThreadProcessId(hTargetWnd, NULL)) {
  4.         GetParent()->SetDlgItemText(IDC_STATIC_SHOW, _T(""));
  5.         return;
  6. }
复制代码

------------------------------------- End -------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
教程介绍及详情请见:https://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:https://www.cctry.com/static/vip/index.html





上一篇:VC++高级班之窗口篇-[6]打造自己的“按钮激活专家”
下一篇:VC++高级班之窗口篇-[8]模拟鼠标、键盘操作

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-11 02:52

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表