發(fā)布時間:2022年04月15日 05:52:43分享人:我是定期發(fā)光來源:互聯(lián)網(wǎng)17
一、下面我們來創(chuàng)建一個屏蔽鼠標(biāo)過程的hook:1.創(chuàng)建基于MFC的一個InnerHook工程項目2.在BOOLCInnerHookerDlg::OnInitDialog()中添加hookSetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());要獲得當(dāng)前線程句柄,使用函數(shù)DWORD GetCurrentThreadId(void);3.實現(xiàn)鼠標(biāo)過程MouseProc為:LRESULTCALLBACK MouseProc(intnCode,WPARAMwParam,LPARAMlParam){return1;//返回值為一表示屏蔽鼠標(biāo)過程}二、如果要屏蔽鍵盤消息,可以添加如下代碼1.在CPP文件中添加一個變量:HHOOKg_hKeyBoard;2.在CInnerHookerDlg::OnInitDialog()中添加hookg_hKeyBoard=SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,NULL,GetCurrentThreadId());3.實現(xiàn)鍵盤過程keybroadProc為(只屏蔽空格鍵):4.下邊添加代碼使程序在F2鍵按下后退出。要關(guān)閉窗口,首先要獲得窗口的句柄,先聲明一個全局變量Hwnd g_hWnd,在OnInitDialog()中把窗口句柄傳給它:g_hWnd=m_hWnd;接下來為鍵盤鉤子過程添加代碼:這時我們只能屏蔽主線程的鍵盤消息,如果要屏蔽所有消息,就得把代碼放到動態(tài)鏈接庫中實現(xiàn)。三、屏蔽所有線程的消息首先要創(chuàng)建一個動態(tài)鏈接庫1.新建一個Win32 Dynamic-LinkLibrary項目工程Hook得到動態(tài)鏈接庫模塊的句柄有兩種方式:方法1。DllMain函數(shù)方式:HMODULE和HINSTANCE可以通用方法2。GetModuleHandle函數(shù)方式SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);//這個值為0,這個安裝的鉤子過程將于桌面上運行的所有線程都相關(guān)。這樣我們所安裝的鉤子過程就和運行在同一個桌面上的所有進(jìn)程相關(guān)了2.編寫MouseProc()3.之后新建一個模塊文件Hook.def,添加代碼:LIBRARYHookEXPORTSSetHook@2//@2用來指定序號。4.編譯生成dll文件接下來新建一個工程,用來測試剛才的DLL首先安裝一個鼠標(biāo)Hook屏蔽所有的鼠標(biāo)消息。1.新建一個基于MFC對話框的項目工程HookTest2.在BOOLCHookTestDlg::OnInitDialog()前聲明SetHook函數(shù)_declspec(dllimport) void SetHook();3.在Setting對話框的Link選項卡的,添加庫文件:..HookDebugHook.lib4.在OnInitDialog()中調(diào)用 SetHook();5.將生成好的動態(tài)鏈接庫拷貝到測試程序項目工程目錄下面。調(diào)試運行,你會發(fā)現(xiàn)你的鼠標(biāo)壞了,所有的鼠標(biāo)操作都被屏蔽了。然后安裝一個鍵盤Hook,我們可以按照剛才所做鍵盤Hook的過程在動態(tài)鏈接庫中也做一個Hook,這是需要給SetHook帶上參數(shù)HWND hwnd.在測試程序中要把函數(shù)也帶上參數(shù),并給SetHook傳入窗口句柄 SetHook(m_hWnd)。接著,讓程序窗口始終在其他窗口之前,而且將它最大化,從而使用戶不能切換到窗口。可以使用SetWindowPos函數(shù)BOOLSetWindowPos(HWNDhWndInsertAfter,intX,intY,intcx,intcy,UINTuFlags);A windowcan be moved to the top of the Z-order either by setting thepWndInsertAfter parameterto &wndTopMost and ensuringthat the SWP_NOZORDER flagis not set or by setting a window’s Z-order so that it is above anyexisting topmost windows. When a nontopmost window is made topmost,its owned windows are also made topmost. Its owners are notchanged.得到窗口的大小,可以使用函數(shù)GetSystemMetricsintGetSystemMetrics(int nIndex);代碼:intcxScreen,cyScreen;cxScreen=GetSystemMetrics(SM_CXSCREEN);cyScreen=GetSystemMetrics(SM_CYSCREEN);SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);SetHook(m_hWnd);因為第一個參數(shù)設(shè)置為&wndTopMost,這時程序始終處于頂層窗口,不管怎樣切換窗口,我們的窗口顯示在最前面。四、如何實現(xiàn)在切換到其他線程時,也能響應(yīng)F2退出程序在程序中,我們屏蔽了鼠標(biāo)和鍵盤,但是我們留下了一個退出程序的后門(F2)。前面講過動態(tài)鏈接庫共享性的原理,多個進(jìn)程可以共享同一份代碼與數(shù)據(jù)頁,按道理切換到其它線程之后,按下F2應(yīng)該也可以退出程序才對,但是發(fā)現(xiàn)當(dāng)切換到其他程序后,再按F2 程序不會退出,這是因為系統(tǒng)的頁面拷貝機(jī)制,如果系統(tǒng)發(fā)現(xiàn)被某線程要修改某個數(shù)據(jù)頁面,它就會先拷貝一份頁面數(shù)據(jù),再對新的頁面數(shù)據(jù)進(jìn)行修改,其它沒有更新數(shù)據(jù)的線程繼續(xù)使用舊的頁面數(shù)據(jù)。比如:SetHook(HWND hwnd)中將形參傳遞給了一個全局變量g_hWnd,那么調(diào)用SetHook的線程將使用新的存放了hwnd的數(shù)據(jù)頁面,而其它的線程繼續(xù)使用舊的數(shù)據(jù)頁面,所以在其它線程成為活動窗口的時候,按下F2時,因為沒有g(shù)_hWnd沒有傳遞到hwnd窗口,所以按下F2沒有反應(yīng)。我們可以通過創(chuàng)建一個新的節(jié),將全局變量放到這個節(jié)當(dāng)中,然后將這個節(jié)設(shè)置為一個共享的節(jié),這樣全局變量就可以在多個線程間共享,從而使切換到其他線程時也能按下F2退出程序。要顯示動態(tài)鏈接庫的節(jié),可以使用命令行:dumpbin-headersHook.dll如何創(chuàng)建一個新的節(jié)?如果確實想在其他程序窗口下關(guān)閉我們的程序窗口,可以把共享窗口句柄,使系統(tǒng)不再進(jìn)行頁面拷貝,方法是使用下面語句把窗口句柄設(shè)為共享:#pragmadata_seg("MySec")//MySec是新創(chuàng)建的節(jié)的名字(不能超過8個字節(jié))HWNDg_hWnd=NULL;//新變量必須初始化,否則沒有新建節(jié)的信息#pragmadata_seg()//以上為新建節(jié)新創(chuàng)建的節(jié)共享以后才有效,共享節(jié)有兩種方法:1.#pragmacomment(linker,"/section:MySec,RWS")//設(shè)置節(jié)的屬性,讀,寫,共享2.也可以把#pragma comment(linker,"/section:MySec,RWS")省略。在Hook.def中添加如下代碼:SEGMENTSMySecread write shared也能對節(jié)的屬性進(jìn)行設(shè)置把SetWindowsHookEx函數(shù)的第一個參數(shù)設(shè)為WH_GETMESSAGE,能夠破解密碼。使用Hook時要小心。
愛華網(wǎng)本文地址 » http://www.klfzs.com/a/25101016/306826.html
更多閱讀

SQL中EXISTS怎么用——簡介EXISTS用于檢查子查詢是否至少會返回一行數(shù)據(jù),該子查詢實際上并不返回任何數(shù)據(jù),而是返回值True或FalseSQL中EXISTS怎么用——方法/步驟SQL中EXISTS怎么用 1、EXISTS用于檢查子查詢是否至少會返回一行數(shù)據(jù),該

原文地址:http://blog.163.com/xiangzaihui@126/blog/static/166955749201182695220753/一個標(biāo)準(zhǔn)的strcpy函數(shù):原本以為自己對strcpy還算比較了解,結(jié)果面試時還是悲劇了。下面給出網(wǎng)上strcpy的得分版本:2分voids

準(zhǔn)確地講,本文所涉及的內(nèi)容是C++中較難理解的,本文的目的不是在于將它們解釋清楚,因為這需要你循序漸進(jìn)地做很多練習(xí)才可以。看下面一個例子:int (*func(bool real))(int, int) 你覺得它的返回值是什么?這里就涉及到了如何理解指向函數(shù)

命令提示符(cmd)中的tracert命令詳解 精——簡介tracert也被稱為Windows路由跟蹤實用程序,在命令提示符(cmd)中使用tracert命令可以用于確定IP數(shù)據(jù)包訪問目標(biāo)時所選擇的路徑。本文主要探討了tracert命令的各個功能。命令提示符(cmd)中的tr
易語言QQ空間編碼轉(zhuǎn)換 - 漢語編程作者/佚名 來源/本站整理 發(fā)布時間/2010-3-10 13:14:27 所屬類別/漢語編程 點擊/ 11 次子程序名 返回值類型 公開 備注解密空間編碼 文本型 √參數(shù)名 類型 參考 可空 數(shù)組 備注編碼 文本型變量名 類