孫鑫 第二十講 Hook過程函式與資料庫基礎知識

2021-06-02 14:37:46 字數 3654 閱讀 4038

通過安裝hook過程,遮蔽訊息佇列中某些訊息

the setwindowshookex function

syntax

hhook setwindowshookex( 

int idhook,

hookproc lpfn,

hinstance hmod,

dword dwthreadid 

//為零表示和所有安裝的執行緒相關);

要遮蔽滑鼠過程,首先在bool cinnerhookerdlg::oninitdialog()中新增

setwindowshookex(wh_mouse,mouseproc,null,getcurrentthreadid());

要獲得當前執行緒控制代碼,使用函式dword getcurrentthreadid(void);

其中滑鼠過程mouseproc為:

lresult callback mouseproc( 

int ncode,

wparam wparam,

lparam lparam)

如果要遮蔽鍵盤訊息,可以新增如下**

hhook g_hkeyboard;

1。g_hkeyboard=setwindowshookex(wh_keyboard,keyboardproc,null,getcurrentthreadid());

2。lresult callback keyboardproc( 

int ncode,

wparam wparam,

lparam lparam)

下邊新增**使程式在f2鍵按下後退出。要關閉視窗,首先要獲得視窗的控制代碼,先宣告乙個全域性變數g_hwnd,在oninitdialog()中把視窗控制代碼傳給它:

g_hwnd=m_hwnd;

接下來為鍵盤鉤子過程新增**:

if(vk_f2==wparam)

return 1;

這時我們只能遮蔽主線程的鍵盤訊息,如果要遮蔽所有訊息,就得把**放到動態鏈結庫中實現。

bool winapi dllmain(

hinstance hinstdll,

dword fdwreason,

lpvoid lpvreserved)

hmodule和hinstance可以通用

2。getmodulehandle函式方式

setwindowshookex(wh_mouse,mouseproc,getmodulehandle("hook"),0);

這樣我們所安裝的鉤子過程就和執行在同乙個桌面上的所有程序相關了

之後新建乙個模組檔案hook.def,新增**:

library hook

exports

sethook 

@2 //@2

用來指定序號。

接下來新建乙個工程,用來測試剛才的dll

在bool chooktestdlg::oninitdialog()前宣告sethook函式

_declspec(dllimport) void sethook();

直接在oninitdialog()中呼叫,

sethook();

除錯執行,你會發現你的滑鼠壞了。

接下來安裝鍵盤hook,我們可以按照剛才所做鍵盤hook的過程在動態鏈結庫中也做乙個hook,這是需要給sethook帶上引數hwnd hwnd.

在測試程式中要把函式也帶上引數,並給sethook傳入視窗控制代碼 sethook(m_hwnd)。

bool setwindowpos( 

hwnd hwnd,

hwnd hwndinsertafter,

int x,

int y,

int cx,

int cy,

uint uflags);

如果要得到視窗的大小,可以使用函式getsystemmetrics

the getsystemmetrics function retrieves various system metrics (widths and heights of display elements) and system configuration settings. all dimensions retrieved by getsystemmetrics are in pixels.

int getsystemmetrics(int nindex);

**:int cxscreen,cyscreen;

cxscreen=getsystemmetrics(sm_cxscreen);

cyscreen=getsystemmetrics(sm_cyscreen);

setwindowpos(&wndtopmost,0,0,cxscreen,cyscreen,swp_showwindow);

sethook(m_hwnd);

這樣的話,我們的程式始終處於頂層視窗,不管怎樣切換視窗,整個視窗都只有我們乙個程式

顯示動態鏈結庫的節,可以使用命令列

dumpbin  -headers  hook.dll

我們可以發現當切換到其他程式後,我們按f2我們的程式不會退出,按動態鏈結庫共享性的原理和我們對桌面執行緒的關聯,應該是所有的執行緒都能使用這個dll來關閉我們的程式。

這是因為系統的頁面拷貝機制,如果系統發現被共享的dll被某執行緒修改,它就會先拷貝乙份頁面資料,再對原先的頁面資料進行修改,共享該dll的其它執行緒使用新的頁面資料。

如果確實想在其他程式視窗下關閉我們的程式視窗,可以把共享視窗控制代碼,使系統不再進行頁面拷貝,方法是使用下面語句把視窗控制代碼設為共享:

#pragma data_seg("mysec")

hwnd g_hwnd=null; 

//這裡的初始化是必須的,否則沒有新建節的資訊

#pragma  data_seg() 

//以上為新建節

#pragma comment(linker,"/section:mysec,rws") 

//設定節的屬性,讀,寫,共享

也可以把#pragma comment(linker,"/section:mysec,rws")省略。

在hook.def中新增如下**:

segments

mysec read write shared

也能對節的屬性進行設定

把setwindowshookex函式的第乙個引數設為wh_getmessage,能夠破解密碼,具體方法還不會。

com[計] 小型可執行程式的副檔名, 序列通訊埠

[域] commercial organizations,商業組織,公司

the component object model元件物件模型

ado的三個核心物件

connection物件

connection物件表示了到資料庫的連線,它管理應用程式和資料庫之間的通訊。recordest和command物件都有乙個activeconnection屬性,該屬性用來飲用connection物件。

command物件

command物件被用來處理重複執行的查詢,或處理需要檢查在儲存過程呼叫中的輸出或返回引數的值的查詢。

recordset物件

recordset物件被用來獲取資料。recordset物件存放查詢的結果,這些結果又資料的行(稱為記錄)和列(成為字段)組成。每一列都存放在recordset的fields集合中的乙個filed物件中

資料結構與演算法之美學習筆記 第二十八講

對於每個節點的值都大於等於子樹中每個節點值的堆 對於每個節點的值都小於等於子樹中每個節點值的堆 從圖中我們可以看到 1 陣列中下標為 i 的節點的左子節點,就是下標為 i 2 的節點,2 右子節點就是下標為 i 2 1 的節點,父節點就是下標為 i2 的節點。1 堆化 2 從下往上的堆化方法 讓新插...

第二十六講專案3 分段函式求值switch版語句版

分段函式 程式 include include csdn學院 2016級 檔名稱 myfun31.c 完成日期 2016年11月13日 問題描述 從鍵盤輸入x的值 要求為整型 根據公式1計算並輸出x和y的值。要求用switch語句完成。int main printf 4f y return 0 輸出...

《APUE》讀書筆記 第二十章資料庫函式庫

本章的內容是開發乙個簡單的 多使用者資料庫的c函式庫。呼叫此函式庫提供的c語言函式,其他程式可以讀取和儲存資料庫中的記錄。絕大部分商用資料庫函式庫提供多程序同時更新資料庫所需要的併發控制,採用建議記錄鎖 b 樹 動態雜湊實現資料庫。1 函式庫 開發類似ndbm函式庫,增加了併發控制機制,從而允許多程...