1.Hook簡(jiǎn)介:作用是攔截某些消息,,關(guān)鍵函數(shù)是SetWindowsHookEX()
2.示例程序: a.新建一基于對(duì)話框工程,,InnerHook,此過(guò)程的鉤子是只攔截本進(jìn)程的。 b.在OnInitDialog()中添加代碼: g_hWnd=m_hWnd; g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());設(shè)置了鼠標(biāo)鉤子 g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());設(shè)置了鍵盤鉤子
c.完成鉤子函數(shù)的編寫: HHOOK g_hKeyboard=NULL; HHOOK g_hMouse; HWND g_hWnd=NULL;
LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { return 1; }
LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { //if(VK_SPACE==wParam || VK_RETURN==wParam)如果是空格鍵 /*if(VK_F4==wParam && (1==(lParam>>29 & 1)))攔截ALT+F4按鍵,! return 1; else return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/ if(VK_F2==wParam)按F2時(shí)程序可以退出,,這是留的后門。否則程序無(wú)法關(guān)閉,,只能用任務(wù)管理器來(lái)關(guān)閉它了,。 { ::SendMessage(g_hWnd,WM_CLOSE,0,0); UnhookWindowsHookEx(g_hKeyboard);當(dāng)程序退出時(shí)最好將鉤子移除。 UnhookWindowsHookEx(g_hMouse); } return 1; }
3.編寫一個(gè)屏屏蔽所有進(jìn)程和所有線程的鉤子程序,。此時(shí)這個(gè)鉤子必須安裝在DLL中,,然后被某個(gè)程序調(diào)用才行。 a.新建一個(gè)DLL工程名為Hook b.增加Hook.cpp c.代碼如下: #include <windows.h>包含頭文件
HHOOK g_hMouse=NULL; HHOOK g_hKeyboard=NULL;
#pragma data_seg("MySec")新建了一個(gè)節(jié),,用于將下面的這個(gè)變量設(shè)為全局共享,。 HWND g_hWnd=NULL;這個(gè)變量是全局共享的。 #pragma data_seg()
//#pragma comment(linker,"/section:MySec,RWS") /*HINSTANCE g_hInst;
BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to the DLL module DWORD fdwReason, // reason for calling function LPVOID lpvReserved // reserved ) { g_hInst=hinstDLL; }*/
LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { return 1;攔截了鼠標(biāo)消息,。 }
LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { if(VK_F2==wParam)如果是F2鍵,,則退出。 { SendMessage(g_hWnd,WM_CLOSE,0,0); UnhookWindowsHookEx(g_hMouse);當(dāng)退出時(shí)將鉤子卸掉,。 UnhookWindowsHookEx(g_hKeyboard); } return 1; }
void SetHook(HWND hwnd)此函數(shù)設(shè)置了鉤子,。 { g_hWnd=hwnd;注意這種傳遞調(diào)用它的進(jìn)程的句柄的方法,比較巧妙,! g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0); g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0); } Hook.DEF的代碼如下: LIBRARY Hook EXPORTS SetHook @2 SEGMENTS MySec READ WRITE SHARED 也可以設(shè)置節(jié)的屬性,。 d.新建一個(gè)工程調(diào)用此鉤子函數(shù)。工程名為HookTest,基于對(duì)話框的,。在OnInitDialog()中調(diào)用SetHook(),,要事先聲明_declspec(dllimport) void SetHook(HWND hwnd); 然后在Project->Setting->Link->加入..\Hook\Debug\Hook.lib,并將Hook.Dll拷貝到當(dāng)前目錄,。 int cxScreen,cyScreen; cxScreen=GetSystemMetrics(SM_CXSCREEN); cyScreen=GetSystemMetrics(SM_CYSCREEN); SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);將窗口保持在最前面,。 SetHook(m_hWnd); e.DLL的調(diào)試方法,設(shè)置斷點(diǎn),,然后運(yùn)行時(shí)斷點(diǎn)時(shí),,step into即可。
4.數(shù)據(jù)庫(kù)編程 a.ODBC,,ADO簡(jiǎn)介:ADO可以認(rèn)為是建立在ODBC上的,。 ADO的三個(gè)核心對(duì)象 Connection對(duì)象 Connection對(duì)象表示了到數(shù)據(jù)庫(kù)的連接,它管理應(yīng)用程序和數(shù)據(jù)庫(kù)之間的通信,。 Recordset和Command對(duì)象都有一個(gè)ActiveConnection屬性,,該屬性用來(lái)引用Connection對(duì)象,。 Command對(duì)象 Command對(duì)象被用來(lái)處理重復(fù)執(zhí)行的查詢,或處理需要檢查在存儲(chǔ)過(guò)程調(diào)用中的輸出或返回參數(shù)的值的查詢,。 Recordset對(duì)象 Recordset對(duì)象被用來(lái)獲取數(shù)據(jù),。 Recordset對(duì)象存放查詢的結(jié)果,這些結(jié)果由數(shù)據(jù)的行(稱為記錄)和列(稱為字段)組成,。每一列都存放在Recordset的Fields集合中的一個(gè)Field對(duì)象中,。 b.演示在VB中使用ADO的方法,方法比較簡(jiǎn)單,,使用方便,。另外在VB中演示了Connection和Command和Recordset的方法,用這三種方法都可以執(zhí)行SQL語(yǔ)句,。 c.在VC中利用ADO訪問(wèn)數(shù)據(jù)庫(kù),。 aa.新建一個(gè)基于對(duì)話框的工程,名為ADO,。 bb.在對(duì)話框中放一ListBox和一個(gè)Button控件,。 cc.在使用時(shí)須導(dǎo)入MSADO15.dll,方法是在StdAfx.h中#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF") 至少于將EOF改名為rsEOF,,是為了避免與文件中的EOF重名。然后編譯程序,,將產(chǎn)生的debug目錄下的兩個(gè)文件MSADO15.tlh和MSADO15.tli加到工程中,,其目的只是方便我們查看而已。并不是編譯需要它,。 ADO也是COM組件,須初始化COM庫(kù)方法是CoInitialize(NULL);使用完后須CoUninitialize(); 代碼如下: void CAdoDlg::OnBtnQuery() { // TOD Add your control notification handler code here CoInitialize(NULL);初始化 _ConnectionPtr pConn(__uuidof(Connection));產(chǎn)生connection智能指針 _RecordsetPtr pRst(__uuidof(Recordset));產(chǎn)生recordset智能指針 _CommandPtr pCmd(__uuidof(Command));產(chǎn)生command智能指針 pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs";數(shù)據(jù)庫(kù)信息 pConn->Open("","","",adConnectUnspecified);打開數(shù)據(jù)庫(kù) //pRst=pConn->Execute("select * from authors",NULL,adCmdText);用記錄集查詢數(shù)據(jù) //pRst->Open("select * from authors",_variant_t((IDispatch*)pConn), // adOpenDynamic,adLockOptimistic,adCmdText); pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn)); pCmd->CommandText="select * from authors";用這種方法也可以查詢數(shù)據(jù) pRst=pCmd->Execute(NULL,NULL,adCmdText); while(!pRst->rsEOF)將查詢到的數(shù)據(jù)加到列表框咯,。 { ((CListBox*)GetDlgItem(IDC_LIST1))->AddString( (_bstr_t)pRst->GetCollect("au_lname")); pRst->MoveNext(); }
pRst->Close(); pConn->Close(); pCmd.Release(); pRst.Release(); pConn.Release(); CoUninitialize(); }
下面是具體的步驟: SetWindowsHookEx; 1新建一個(gè)基于對(duì)話框的MFC程序 2然后在其OnInitDialog中 添加
SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { return 1;//表示已經(jīng)處理過(guò)了 }
下面添加一個(gè)項(xiàng)目鍵盤的鉤子:
HHOOK g_hkeyboard=NULL;//用來(lái)接收返回的HOOK句柄
g_hkeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { return 1; }
LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { if(VK_SPACE==wParam||VK_RETURN==wParam)//屏蔽了空格鍵和回車鍵 return 1; else return CallNextHookEx(g_hkeyboard,code,wParam,lParam); }
HWND hwnd;//用來(lái)保存對(duì)話框的句柄
hwnd=m_hWnd;
LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { //if(VK_SPACE==wParam||VK_RETURN==wParam)//屏蔽了空格鍵和回車鍵 if(VK_F2==wParam) ::SendMessage(hwnd,WM_CLOSE,wParam,lParam); else return CallNextHookEx(g_hkeyboard,code,wParam,lParam); }
if(VK_F4&&(lParam>>29&1)) return 1; 屏蔽Alt+F4退出的按鈕 可以使用
UnhookWindowsHookEx 來(lái)刪除鉤子
上面這些都是局部的鉤子,,下面設(shè)計(jì)一個(gè)全局的鉤子,需要用到dll文件 新建一個(gè)hook.dll文件
#include<windows.h> LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { return 1; } void setHook() { SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("hook"),0); } 也可以不使用GetModulHandle來(lái)獲取實(shí)例 而是
#include<windows.h> HINSTANCE hInst; BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to the DLL module DWORD fdwReason, // reason for calling function LPVOID lpvReserved // reserved ) { hInst=hinstDLL; }
LIBRARY hook EXPORTS setHook @10086
基于MFC的對(duì)話框中的
#pragma comment(lib,"hook.lib")
OnInitDialog函數(shù)前聲明:(也可以使用19章的方法,,動(dòng)態(tài)調(diào)用)
_declspec(dllimport) void setHook(); OnInitDialog函數(shù)中,,調(diào)用 setHook(); 結(jié)果就是,所有的線程都不能使用鼠標(biāo),。這個(gè)時(shí)候,,按回車或空格退出。
#include<windows.h> HHOOK hmouse=NULL; HHOOK hkeyboard=NULL; HWND hwndkey; LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { return 1; } LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { //不能簡(jiǎn)單的返回1,,這樣非逼你關(guān)機(jī)不可,還是得留一個(gè)后路好 if(VK_F2==wParam) { SendMessage(hwndkey,WM_CLOSE,wParam,lParam); UnhookWindowsHookEx(hmouse); UnhookWindowsHookEx(hkeyboard); } else { return 1; } } void setHook(HWND hwnd) { hwndkey=hwnd; hmouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("hook"),0); hkeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("hook"),0); }
OnInitDialog函數(shù)前聲明:(也可以使用19章的方法,動(dòng)態(tài)調(diào)用)
_declspec(dllimport) void setHook(HWND hwnd); OnInitDialog函數(shù)中,,調(diào)用 setHook(m_hWnd); 這樣,,鼠標(biāo)和鍵盤都沒(méi)有反應(yīng)了,只有F2是退出鍵,,但是當(dāng)用鍵盤的Alt+Tab組合的時(shí)候,,還是有挺多軟件可以使用鼠標(biāo)的 可以通過(guò)SetWindowPos函數(shù),講對(duì)話框窗口設(shè)置成最頂層窗口和全屏,,這樣Alt+Tab選中其他窗口的時(shí)候,,被最頂層窗口擋住了,(呵呵,,惡搞程序) 在OnInitDialog添加:
int cxClient,cyClient; cxClient=GetSystemMetrics(SM_CXSCREEN); cyClient=GetSystemMetrics(SM_CYSCREEN); SetWindowPos(&wndTopMost,0,0,cxClient,cyClient,SWP_SHOWWINDOW); setHook(m_hWnd);
可以使得用Alt+Tab切換到其他窗口(雖然看不見),,一樣可以F2刪除對(duì)話框 dll源文件:
#pragma data_seg("MySec") HWND hwndkey=NULL; //添加一個(gè)結(jié),,要初始化 #pragma data_seg() //#pragma comment(linker,"/setction:MySec,RWS")//設(shè)置共享節(jié)點(diǎn),,可讀,可寫,,共享
SEGMENTS MySec READ WRITE SHARED
|
|
來(lái)自: 筆錄收藏 > 《DLL,Lib,數(shù)據(jù)庫(kù)》