1. 進程鉤子 鍵盤鉤子 內核鉤子都是什麼意思呢。
鍵盤鉤子分幾種,有進程鉤子,就是只是捕獲某一個特定進程的鍵盤輸入。有程序鉤子,只捕獲某一個程序的鍵盤輸入。還有全局鉤子,可以捕獲所有進程或者程序的鍵盤輸入。捕獲就是說鉤子程序能獲取你輸入的信息,比方說原來有一些QQ木馬就是安裝鍵盤鉤子,用於記錄你輸入的QQ號和密碼,又或者一些游戲的盜號程序就是這樣的。
建議進行查殺
2. 鍵盤鉤子怎麼 使用
I:設置鉤子
設置鉤子是通過SetWindowsHookEx ()的API函數.
原形: HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId)
idhook:裝入鉤子的類型.
lpfn: 鉤子進程的入口地址
hMod: 應用程序的事件句柄
dwThreadId: 裝入鉤子的線程標示
參數:
idHook:
這個參數可以是以下值:
WH_CALLWNDPROC、WH_CALLWNDPROCRET、WH_CBT、WH_DEBUG、WH_FOREGROUNDIDLE、WH_GETMESSAGE、WH_JOURNALPLAYBACK、WH_JOURNALRECORD、WH_KEYBOARD、WH_KEYBOARD_LL、WH_MOUSE、WH_MOUSE_LL、WH_MSGFILTER、WH_SHELL、WH_SYSMSGFILTER。
對於這些參數,我不想一一加以解釋,因為MSDN中有關於他們的詳細註解。我只挑選其中的幾個加以中文說明。
WH_KEYBOARD:一旦有鍵盤敲打消息(鍵盤的按下、鍵盤的彈起),在這個消息被放在應用程序的消息隊列前,WINDOWS將會調用你的鉤子函數。鉤子函數可以改變和丟棄鍵盤敲打消息。
WH_MOUSE:每個滑鼠消息在被放在應用程序的消息隊列前,WINDOWS將會調用你的鉤子函數。鉤子函數可以改變和丟棄滑鼠消息。
WH_GETMESSAGE:每次當你的應用程序調用一個GetMessage()或者一個PeekMessage()為了去從應用程序的消息隊列中要求一個消息時,WINDOWS都會調用你的鉤子函數。而鉤子函數可以改變和丟棄這個消息。
II:釋放鉤子
鉤子的釋放使用的是UnhookWindowsHookEx()函數
原形:BOOL UnhookWindowsHookEx( HHOOK hhk )
UnhookWindowsHookEx()函數將釋放的是鉤子鏈中函數SetWindowsHookEx所裝入的鉤子進程。
hhk: 將要釋放的鉤子進程的句柄。
III:鉤子進程
鉤子進程使用函數HookProc;其實HookProc僅僅只是應用程序定義的符號。比如你可以寫成KeyBoardHook.但是參數是不變的。Win32 API提供了諸如:CallWndProc、GetMsgProc、DebugProc、CBTProc、MouseProc、KeyboardProc、MessageProc等函數,對於他們的詳細講解,可以看MSDN我在此只講解一下KeyBoardHook的含義。
原形:LRESULT CALLBACK KeyBoardHook (int nCode, WPARAM wParam, LPARAM lParam)
說明:鉤子進程是一些依附在一個鉤子上的一些函數,因此鉤子進程只被WINDOWS調用而不被應用程序調用,他們有時就需要作為一個回調函數(CALLBACK)。
參數說明:
nCode:鉤子代碼,鉤子進程使用鉤子代碼去決定是否執行。而鉤子代碼的值是依靠鉤子的種類來定的。每種鉤子種類都有他們自己一系列特性的代碼。比如對於WH_KEYBOARD,鉤子代碼的參數有:HC_ACTION,HC_NOREMOVE。HC_ACTION的意義:參數wParam 和lParam 包含了鍵盤敲打消息的信息,HC_NOREMOVE的意義:參數wParam 和lParam包含了鍵盤敲打消息的信息,並且,鍵盤敲打消息一直沒有從消息隊列中刪除。(應用程序調用PeekMessage函數,並且設置PM_NOREMOVE標志)。也就是說當nCode等於HC_ACTION時,鉤子進程必須處理消息。而為HC_NOREMOVE時,鉤子進程必須傳遞消息給CallNextHookEx函數,而不能做進一步的處理,而且必須有CallNextHookEx函數的返回值。
wParam:鍵盤敲打所產生的鍵盤消息,鍵盤按鍵的虛擬代碼。
lParam:包含了消息細節。
注意:如果鉤子進程中nCode小於零,鉤子進程必須返回(return) CallNextHookEx(nCode,wParam,lParam);而鉤子進程中的nCode大於零,但是鉤子進程並不處理消息,作者推薦你調用CallNextHookEx並且返回該函數的返回值。否則,如果另一個應用程序也裝入WH_KEYBOARD 鉤子,那麼該鉤子將不接受鉤子通知並且返回一個不正確的值。如果鉤子進程處理了消息,它可能返回一個非零值去阻止系統傳遞該信息到其它剩下的鉤子或者windows進程。所以最好在鉤子進程的最後都返回CallNextHookEx的返回值。
IV:調用下一個鉤子函數
調用下一個鉤子函數時使用CallNexHookEx函數。
原形:LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam )
CallNexHookEx()函數用於對當前鉤子鏈中的下一個鉤子進程傳遞鉤子信息,一個鉤子進程既可以在鉤子信息處理前,也可以在鉤子信息處理後調用該函數。為什麼使用該函數已在iii鉤子進程中的「注意」中,加以了詳細的說明。
hhk: 當前鉤子的句柄
nCode: 傳送到鉤子進程的鉤子代碼。
wParam:傳送到鉤子進程的值。
lParam:傳送到鉤子進程的值。
參數:
hhk: 當前鉤子的句柄. 應用程序接受這個句柄,作為先前調用SetWindowsHookE函數的結果
nCode: 傳送到鉤子進程的鉤子代碼,下一個鉤子進程使用這個代碼以此決定如何處理鉤子信息
wParam:傳送給鉤子進程的wParam 參數值 ,參數值的具體含義與當前鉤子鏈的掛接的鉤子類型有關
lParam : 傳送給鉤子進程的wParam 參數值 ,參數值的具體含義與當前鉤子鏈的掛接的鉤子類型有關
返回值:返回值是鏈中下一個鉤子進程返回的值,當前鉤子進程必須返回這個值,返回值的具體含義與掛接的鉤子類型有關,詳細信息請參看具體的鉤子進程描述。
V 建立一個動態連接庫(DLL)
當我們熟悉了以上的各個函數後,現在我們開始編寫一個動態連接庫(DLL)。在這兒我採用的是WIN32 DLL,而不是MFC DLL。而且以下所有的程序也都是採用C語言去編寫。這主要是因為使用WIN32 API能夠更詳細、更全面的控製程序的如何執行,而使用MFC,一些低級的控制是不可能實現的(當然,僅對該程序來說,也是可以使用MFC的)。
1:建立一個動態連接庫的.cpp文件。比如我們現在建立一個名為hookdll.cpp的文件。在hookdll.cpp的文件中加上如下內容:
#include <windows.h>
#include "string.h"
#include "stdio.h"
HINSTANCE hInst;
#pragma data_seg("hookdata")
HHOOK oldkeyhook=0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:hookdata,RWS")
#define DllExport extern "C"__declspec(dllexport)
DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );
DllExport void InstallHook(int nCode);
DllExport void EndHook(void);
BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
{
switch(What)
{
case DLL_PROCESS_ATTACH:
hInst = hInstance;
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
void InstallHook(int nCode)
{
oldkeyhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInst,0);
}
DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )
{
WPARAM j;
FILE *fp;
if(lParam&0x80000000)
{
j = wParam;
fp=fopen("c:\hook\key.txt","a");
fprintf(fp,"%4d",j);
fclose(fp);
}
return CallNextHookEx(oldkeyhook,nCode,wParam,lParam);
}
void EndHook(void)
{
UnhookWindowsHookEx(oldkeyhook);
}
這個動態連接庫的源代碼hookdll.cpp包含了鍵盤處理函數,設置鉤子,退出鉤子函數。並將鍵盤敲下的鍵以值的格式存入到c:hookkey.txt文件中。以下是對該文件的詳細的解釋。
使用包含在DLL的函數,必須將其導入。導入操作時通過dllimport來完成的,dllexport和dllimport都是vc(visual C++)和bc(Borland C++)所支持的擴展的關鍵字。但是dllexport和dllimport關鍵字不能被自身所使用,因此它的前面必須有另一個擴展關鍵字__declspec。通用格式如下:__declspec(specifier)其中specifier是存儲類標示符。對於DLL,specifier將是dllexport和dllimport。而且為了簡化說明導入和導出函數的語句,用一個宏名來代替__declspec.在此程序中,使用的是DllExport。如果用戶的DLL被編譯成一個C++程序,而且希望C程序也能使用它,就需要增加「C」的連接說明。#define DllExport extern "C"__declspec(dllexport),這樣就避免了標准C++命名損壞。(當然,如果讀者正在編譯的是C程序,就不要加入extern 「C」,因為不需要它,而且編譯器也不接受它)。有了宏定義,現在就可以用一個簡單的語句就可以導出函數了,比如:
DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );DllExport void InstallHook(int nCode);DllExport void EndHook(void);
第一個#pragma 語句創造數據段,這里命名為hookdata。其實也可以命名為您喜歡的任意的一個名稱。#pragma 語句之後的所有初始化的變數都進入hookdata段中。第二個#pragma語句是數據段的結束標志。對變數進行專門的初始化是很重要的,否則編譯程序將把它們放在普通的未初始化的段中而不是放在hookdata中。
但是鏈接程序必須直到有一個hookdata段。我們可以在Project Setting(vc6.0) 對話框中選擇Link選項,選中HOOKDLL時在Project Options域(在Release 和Debug配置中均可),包含下面的連接語句:/SECTION:hookdata,RWS字母RWS是表明該段具有讀、寫、和共享屬性。當然,您也可以直接用DLL源代碼指定鏈接程序就像HOOKDLL.c那樣:#pragma comment(linker,"/SECTION:hookdata,RWS")。
由於有些DLL需要特殊的啟動和終止代碼。為此,所有的DLL都有一個名為DllMain()的函數,當初始化或終止DLL時調用該函數。一般在動態連結庫的資源文件中定義此函數。不過如果沒有定義它,則編譯器會自動提供預設的形式。
原型為:BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
參數:
hInstance:DLL實例句柄
What:指定所發生的操作
NotUsed:保留參數
其中What的值可以為以下值:
DLL_PROCESS_ATTACH:進程開始使用DLL
DLL_PROCESS_DETACH:進程正在釋放DLL
DLL_THREAD_ATTACH:進程已創建一個新的線程
DLL_THREAD_DETACH:進程已舍棄了一個線程
總的來說,無論何時調用DllMain()函數,都必須根據What的內容來採取適當的動作。這種適當的動作可以什麼都不做,但不是返回非零值。
DllMain()接下來的便是設置鉤子,鍵盤處理,和釋放鉤子。
2:建立頭文件
正如應用程序所使用的其它任何庫函數一樣,程序也必須包含dll內的函數的原型。所有得Windows程序都必須包含windows.h的原因。所以我們現在建立一個頭文件hookdll.h如下:
#define DllImport extern"C"__declspec(dllimport)
DllImport void InstallHook(int nCode);
DllImport LRESULT CALLBACK KeyBoardProc (int nCode,WPARAM wParam, LPARAM lParam );
DllImport void EndHook(void);
使用dllimport主要是為了使代碼更高效,因此推薦使用它。但是在導入數據時是需要dllimport的。當完成了上面的程序後,建一個項目工程,不妨為hookdll,然後將hookdll.c插入導項目工程中,編譯,則可以生成了hookdll.dll和hookdll.lib。
3:建立程序主文件
我們在上面作的所有得工作都是為現在的主程序打得基礎。其實當我們完成了Dll文件後,剩下的就是調用設置鉤子函數:InstallHook 。如果你對windows編程十分的熟悉,那麼你可以在你任何需要的時候來調用InstallHook。但是在你必須記住在你退出程序的時候你需要調EndHook以便釋放你所裝入的鉤子函數。現在我在建立了一個hookspy.cpp,並將生成好的hookdll.dll和hookdll.lib拷貝到從一個目錄下,並建立一個hookspy的項目工程。將hookspy.cpp,hookdll.dll,hookdll.lib,hookdll.h插入到項目工程中去。然後在建立windows窗口時就將鉤子設置,在退出程序時退出鉤子函數。比如:
case WM_CREATE:
InstallHook(TRUE);
break;
case WM_DESTROY: //terminate the program
EndHook();
PostQuitMessage(0);
break;
3. 什麼是鍵盤鉤子
簡單的講,鍵盤鉤子就是通過編程實現屏蔽系統熱鍵。
------------------------------------
fingerwin解釋得不錯。不好一兩句話讓你明白透徹。
http://bbs.xml.org.cn/blog/more.asp?name=%BE%ED%BB%FD%C4%DA%BA%CB&id=11193
如果你有興趣,建議你把上面的這篇文章讀懂。
4. 用串口接收數據,如何判斷是否按下了鍵盤的上下左右鍵,求高手解答(linux C語言)
如果沒其他辦法,就用鉤子, 去找找鉤子的文章,它可以判斷所有鍵盤信息。包括你說的這些。
5. 如何在linux下接收串口2發來的按鍵數據
用echo可以,不過需要一個串口的軟體,就跟win的超級終端一樣,開啟後連接串口,然後另一邊發送數據,你這邊就能顯示出來,我記得好像叫做minicom
6. 我用c++寫了一個鍵盤的全局鉤子,雖然掛上了,但是進行鍵盤操作時,鉤子函數沒有被執行,為什麼
代碼發出來看看。 你說的鉤子是winodws還是linux平台
7. linux鉤子函數處理時間
處理的時間是2到3分鍾。
鉤子(Hook)處理的時間是2到3分鍾,是Windows消息處理機制的一個平台,應用程序可以在上面設置子程以監視指定窗口的某種消息,而且所監視的窗口可以是其他進程所創建的。當消息到達後,在目標窗口處理函數之前處理它。鉤子機制允許應用程序截獲處理window消息或特定事件。
8. 什麼是鍵盤鉤子
分幾種,有進程鉤子,就是只是捕獲某一個特定進程的鍵盤輸入。有程序鉤子,只捕獲某一個程序的鍵盤輸入。還有全局鉤子,可以捕獲所有進程或者程序的鍵盤輸入。捕獲就是說鉤子程序能獲取你輸入的信息,比方說原來有一些QQ木馬就是安裝鍵盤鉤子,用於記錄你輸入的QQ號和密碼,又或者一些游戲的盜號程序就是這樣的。