`

[原]简易Windows密码查看器

阅读更多

[标题]:简易Windows密码查看器
[时间]:2009-10-09
[摘要]:通过全局钩子获取当前鼠标处的窗口控件句柄,然后直接调用GetWindowText()获取密码文本。
[关键字]:密码、查看、星号、全局钩子、Hook、WM_COPYDATA、DLL、XP样式
[环境]:Visual Studio 2008、Visual C++ 6.0
[作者]:天堂露珠 (wintys@gmail.com) http://www.blogjava.net/wintys

[正文]:

    此密码查看器原理:通过全局钩子获取当前鼠标处的窗口控件句柄,然后直接调用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->pt.x;
        LONG y = pMouseHookStruct->pt.y;
        HWND hWnd = pMouseHookStruct->hwnd;

        HWND hWndFromPoint = ::WindowFromPoint(pMouseHookStruct->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->dwData == DWDATA_PSW_NOTIFY && !g_bReadySend)
    {
        PPSWNOTIFY pPswNotify = (PPSWNOTIFY)pCopyDataStruct->lpData;

        CString strMousePosition;
        strMousePosition.Format("(%3d,%3d)" , pPswNotify->pt.x ,pPswNotify->pt.y);
        m_strMousePosition = strMousePosition;
        CString strPsw;
        strPsw.Format("%s" , pPswNotify->psw);
        m_strPsw = strPsw;
        CString strHWnd;
        strHWnd.Format("%p" , pPswNotify->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、运行

    运行结果如图:

cpp_PasswordViewer

【cpp_PasswordViewer.jpg】

[附件]:

PasswordViewer.exe、PasswordViewerMouseHookDLL.dll、工程源代码

原创作品,转载请注明出处。
作者:Winty (wintys@gmail.com)
博客:http://www.blogjava.net/wintys
分享到:
评论

相关推荐

    很简易的密码查看器密码查看器

    为了应对这种需求,一种名为“很简易的密码查看器”的工具应运而生。正如其名称所暗示的,这款工具的出现是为了帮助用户将隐藏的密码,那些以星号(*)形式显示的密码,转换成可见的明文密码。 这种密码查看器的基本...

    window开机密码查看工具

    一款简易快捷的windows操作系统开机密码查看工具,适用于Windows系列产品。无需PE系统,可直接查看开机密码。

    C#简易Windows任务管理器

    【C#简易Windows任务管理器】是一个利用Visual Studio 2010开发的应用程序,它模仿了Windows操作系统内置的任务管理器的部分功能。这个项目旨在帮助用户了解如何在C#环境中实现进程管理和系统监控的基本功能。下面...

    ADSL密码查看器 V3.0 中文绿色版

    在这个场景下,它可能是用来启动ADSL密码查看器的简易安装或运行脚本。 2. **注册.reg**:这通常是一个注册表文件,用于导入Windows注册表中的键值。这个文件可能包含将ADSL密码查看器相关的设置信息添加到用户或...

    Access数据库密码查看器

    针对这一问题,"Access数据库密码查看器"是一款实用的工具,能够帮助用户查看并恢复丢失的Access数据库密码。 这款工具设计简洁,易于操作,而且是免费提供的。它的工作原理主要是通过分析Access数据库文件的结构,...

    方便的星号密码查看器

    其中,“星号密码查看器”作为一种帮助用户恢复密码可见性的工具,在多种使用场景中扮演着重要的角色。本文将详细探讨星号密码查看器的用途、工作原理以及潜在的利弊。 首先,星号密码查看器主要应用于需要用户验证...

    简易图片查看器

    总的来说,【简易图片查看器】是一个学习C#编程、Windows Forms应用开发和图像处理的入门级项目。对于初学者来说,阅读和理解这样的代码有助于提升编程技能,同时也能理解一个简单桌面应用的完整生命周期。

    简易示波器程序 简易示波器程序

    简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易示波器程序简易...

    简易文本编辑器

    “简易文本编辑器”是一个模仿Windows操作系统中经典“记事本”程序的应用。记事本虽然简单,但却是日常生活中处理纯文本文件的实用工具,其核心功能包括打开、编辑、保存文本,以及提供基本的格式设置。而“简易...

    《简易密码管理器》程序

    《简易密码管理器》是一款专为现代人设计的密码及重要信息管理程序,旨在解决日益增长的密码记忆难题。在信息化社会,我们不仅有各种网站账号、邮箱、社交媒体的密码,还有银行账户、会员卡号等重要信息需要妥善保管...

    简易的Windows媒体播放器

    本文将详述基于MFC(Microsoft Foundation Classes)编写的简易Windows媒体播放器及其功能,尤其是针对AVI视频格式的播放。 MFC是微软提供的一套C++类库,它为开发Windows应用程序提供了基础框架。通过MFC,开发者...

    单片机简易电子密码锁系统的设计

    单片机简易电子密码锁系统的设计 课程设计

    简易密码锁控制

    简易密码锁控制

    PCI简易通讯控制器驱动

    PCI简易通讯控制器驱动是计算机硬件系统中的一个重要组成部分,主要用于扩展计算机的串行通信接口。在PC架构中,PCI(Peripheral Component Interconnect)是一种标准的扩展总线,它允许计算机主板与各种外部设备...

    Windows server 2016 MEI驱动 解决PCI简易通讯控制器黄色叹号

    在Windows Server 2016操作系统中,遇到“PCI简易通讯控制器”显示黄色叹号的情况通常是由于缺少必要的驱动程序导致的。这个问题与英特尔® Management Engine Interface(MEI)紧密相关,它是一个内置在许多英特尔...

    简易windows资源管理器

    一个简单的Windows资源管理器,用Java代码写的,实现的功能有剪切、复制、粘贴、删除等基本操作,还可以打开本地的一些常用媒体文件,如mp3、rmvb、txt等常用文件,但有一个缺陷就是文件名不能包含空格的字符。...

    密码验证简易度

    8. **密码管理器**:鼓励用户使用密码管理器,它们可以生成强密码,存储和管理复杂信息,降低因使用弱密码或重复密码导致的风险。 9. **安全策略**:企业应制定明确的密码策略,包括最小长度、有效期、历史记录,...

    简易ascii码查看器

    简易ascii码查看器,要的拿去!

    简易电子密码锁设计源程序

    大学课程设计小模块;简易电子密码设计,又自动获取动态密码功能

    MFC 写一个简易版 windows资源管理器

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 框架来创建一个简易版的Windows资源管理器。MFC是Microsoft为C++开发者提供的一套库,它封装了Windows API,使得开发Windows应用程序更为便捷。...

Global site tag (gtag.js) - Google Analytics