设为首页 收藏本站
查看: 582|回复: 0

[经验分享] 简易Windows密码查看器

[复制链接]
发表于 2018-6-12 09:17:22 | 显示全部楼层 |阅读模式
[标题]:简易Windows密码查看器   
[时间]:2009-10-09     
[摘要]:通过全局钩子获取当前鼠标处的窗口控件句柄,然后直接调用GetWindowText()获取密码文本。     
[关键字]:密码、查看、星号、全局钩子、Hook、WM_COPYDATA、DLL、XP样式     
[环境]:Visual Studio 2008、Visual C++ 6.0     
[作者]:天堂露珠 (wintys@gmail.com)
   
[正文]:
      此密码查看器原理:通过全局钩子获取当前鼠标处的窗口控件句柄,然后直接调用GetWindowText()获取密码文本。工程在VC++6.0和VS2008中编译通过。
  1、查看密码的DLL工程      因为查看密码功能要用到全局鼠标Hook,所以要把功能放到一个DLL中。
  PasswordViewerMouseHookDLL.h:
     #pragma once
    #ifdef PSWMOUSEHOOKDLL_API_EXPORTS      
#define PSWMOUSEHOOKDLL_API __declspec(dllexport)      
#else      
#define PSWMOUSEHOOKDLL_API __declspec(dllimport)      
#endif
    /*      
Winty:2009-09-29      
调用SetHook()设置Hook,但无需卸载Hook,DLLMain中有清理。      
*/      
//My Declaration================================      
#define MAXCOUNT 200 //密码最大长度      
#define DWDATA_PSW_NOTIFY 1 //COPYDATASTRUCT的dwData自定义值
    //密码信息结构体,用于发送      
typedef struct tagPswNotify      
{      
    char psw[MAXCOUNT];//password/text      
    POINT pt;//鼠标位置      
    HWND hWnd;//控件句柄      
} PSWNOTIFY , *PPSWNOTIFY;
    /*extern表示这里只是变量声明,变量定义在cpp文件中*/      
extern PSWMOUSEHOOKDLL_API BOOL g_bReadySend;//WM_COPYDATA互斥的标志,因为WM_COPYDATA不能重叠      
extern PSWMOUSEHOOKDLL_API HWND g_hWnd; //接收消息的窗体句柄      
extern PSWMOUSEHOOKDLL_API HHOOK g_hhk; //钩子句柄      
extern PSWMOUSEHOOKDLL_API BOOL g_bView;//是否需要查看密码
    //鼠标钩子过程      
PSWMOUSEHOOKDLL_API LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam );      
//设置钩子(可在窗口的OnInitDialog()中调用)      
PSWMOUSEHOOKDLL_API void SetHook(HWND hWnd);

  PasswordViewerMouseHookDLL.cpp:
     #include "stdafx.h"
    #define PSWMOUSEHOOKDLL_API_EXPORTS      
#include "PasswordViewerMouseHookDLL.h"
    #include <stdio.h>
    //进程间共享数据,还要在链接器选项里添加:"/SECTION:.MyShare,RWS"      
//或: #pragma   comment(linker,"/SECTION:.MyShare,RWS")  
//查看结果:dumpbin /headers *.DLL      
#pragma data_seg(".MyShare")      
HHOOK g_hhk = NULL;/*Hook句柄*/      
HWND  g_hWnd = NULL;/*接收消息的窗口句柄*/      
BOOL  g_bReadySend = TRUE;/*用于同步COPYDATA消息*/      
#pragma data_seg()      
#pragma   comment(linker,"/SECTION:.MyShare,RWS")
    BOOL APIENTRY DllMain( HANDLE hModule,      
                       DWORD  ul_reason_for_call,      
                       LPVOID lpReserved      
                     )      
{      
    switch (ul_reason_for_call)      
    {      
        case DLL_PROCESS_ATTACH:      
            break;      
        case DLL_PROCESS_DETACH:      
            if(g_hhk != NULL)      
            {      
                UnhookWindowsHookEx(g_hhk);      
                g_hhk = NULL;      
                g_hWnd = NULL;      
            }      
            break;      
        case DLL_THREAD_ATTACH:      
        case DLL_THREAD_DETACH:      
            break;
        }      
    return TRUE;      
}
    LRESULT CALLBACK MouseProc(      
                           int nCode,      // hook code      
                           WPARAM wParam,  // message identifier      
                           LPARAM lParam   // mouse coordinates      
)      
{      
    if(nCode == HC_ACTION)      
    {      
        PMOUSEHOOKSTRUCT pMouseHookStruct      
            = reinterpret_cast<PMOUSEHOOKSTRUCT>(lParam);      
        LONG x = pMouseHookStruct-&gt;pt.x;      
        LONG y = pMouseHookStruct-&gt;pt.y;      
        HWND hWnd = pMouseHookStruct-&gt;hwnd;
            HWND hWndFromPoint = ::WindowFromPoint(pMouseHookStruct-&gt;pt);
            if(hWndFromPoint != g_hWnd  &&  g_bReadySend)//不能获取显示密码的文本框的内容      
        {      
            g_bReadySend = FALSE;      
            char psw[MAXCOUNT];      
            ::GetWindowText(hWndFromPoint , psw , MAXCOUNT);      
            PSWNOTIFY pswNotify;      
            strcpy(pswNotify.psw , psw);      
            pswNotify.pt.x = x;      
            pswNotify.pt.y = y;      
            pswNotify.hWnd = hWndFromPoint;
                COPYDATASTRUCT cd;      
            cd.lpData = &pswNotify;      
            cd.cbData = sizeof(PSWNOTIFY);      
            cd.dwData = DWDATA_PSW_NOTIFY;      
            ::SendMessage(g_hWnd, WM_COPYDATA, NULL , (LPARAM)(LPVOID)&cd);      
        }      
    }
        return CallNextHookEx(g_hhk , nCode , wParam ,lParam);      
}
    void SetHook(HWND hWnd)      
{      
    g_hWnd = hWnd;      
    g_hhk = SetWindowsHookEx(WH_MOUSE ,      
                             MouseProc ,      
                             GetModuleHandle("PasswordViewerMouseHookDLL") ,      
                             NULL);      
}

  
      DLL要想将密码消息发送到主窗口显示,要用WM_COPYDATA消息(或其它进程间通信方式),否则会发送失败。如果用WM_SETTEXT,因为全局Hook发送的消息所带的字符串指针lParam可能不能被主窗口访问,从而造成访问异常。
      g_bReadySend的设置是因为WM_COPYDATA消息不能连续发送,必须等前一条消息取走之后才能发送下一条消息。
  2、显示密码的工程PasswordViewer      创建一个对话框工程PasswordViewer。
  使用DLL步骤:
  
       
  • 把PasswordViewerMouseHookDLL工程生成的PasswordViewerMouseHookDLL.dll、PasswordViewerMouseHookDLL.lib,以及PasswordViewerMouseHookDLL.h复制到PasswordViewer工程。      
    [参考资料]:      
    [附件]:   
  • 在PasswordViewerDlg.cpp 中加入#include "PasswordViewerMouseHookDLL.h"和#pragma comment(lib , "PasswordViewerMouseHookDLL.lib")
      如果要设置最后生成XP样式的窗口,得在PasswordViewerDlg.cpp 中加入
     #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

  
  
      PasswordViewerDlg.cpp主要代码为响应WM_COPYDATA消息,把消息内容显示到窗口上:
     BOOL CPasswordViewerDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)      
{      
    if(pCopyDataStruct-&gt;dwData == DWDATA_PSW_NOTIFY && !g_bReadySend)      
    {      
        PPSWNOTIFY pPswNotify = (PPSWNOTIFY)pCopyDataStruct-&gt;lpData;
            CString strMousePosition;      
        strMousePosition.Format("(%3d,%3d)" , pPswNotify-&gt;pt.x ,pPswNotify-&gt;pt.y);      
        m_strMousePosition = strMousePosition;      
        CString strPsw;      
        strPsw.Format("%s" , pPswNotify-&gt;psw);      
        m_strPsw = strPsw;      
        CString strHWnd;      
        strHWnd.Format("%p" , pPswNotify-&gt;hWnd);      
        m_strHWnd = strHWnd;      
        UpdateData(FALSE);
            g_bReadySend = TRUE;
            return TRUE;      
    }      
    else      
    {      
        CString str(_T("未发现窗口"));      
        m_strPsw = str;
            UpdateData(FALSE);
            return CDialog::OnCopyData(pWnd, pCopyDataStruct);      
    }   
}

  
      别忘了要在CPasswordViewerDlg::OnInitDialog()中调用DLL的SetHook(m_hWnd),初始化全局钩子。
  3、运行      运行结果如图:
  http://blog.51cto.com/wintys/../attachment/200910/200910101255176621750.jpg

  【cpp_PasswordViewer.jpg】
  [附件]:
  PasswordViewer.zip:
  PasswordViewer.exe、PasswordViewerMouseHookDLL.dll、工程源代码


附件:http://down.51cto.com/data/2354266

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-522557-1-1.html 上篇帖子: MRTG监控windows服务器流量 下篇帖子: windows server2000 下的***和NAT的案例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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