你不能不知道到的Hook!

2021-07-26 13:21:50 字數 2472 閱讀 8704

hook是什麼?

hook翻譯之後是鉤子的意思,hook的用途主要是用來攔截訊息的,看到這裡大家可能會迷茫,what is a hook?所以這時就不得不普及一下作業系統的原理。

舉個例子:假如你是一名遊戲熱衷者,在玩遊戲時,你要釋放技能那麼你就會對鍵盤滑鼠進行操作,表面上你是直接操作遊戲,其實中間經過了幾個環節。

首先,你操作鍵盤滑鼠,那麼計算機底層鍵盤滑鼠的驅動就會收到乙個訊息。

然後,這個驅動會把訊息傳個作業系統。

其次,作業系統會判斷這個訊息是作用在哪個程式上。

最後,作業系統會把這個事件傳給相應的程式,那麼,你就可以看到你操作遊戲的樣子了。

做自己的hook!

好!說了這些,大家想想假如你寫了乙個hook,在別人的電腦上攔截了這個訊息,作業系統就不知道這個訊息,你可以把這個訊息通過網路發到你的電腦,那個那台電腦的一舉一動你都清楚....(當然我教大家這個不是希望你們做壞事,而是同過hook更深入學習計算     機    和保護自己電腦),下面我來同過乙個簡單的程式來讓大家了解hook。

1

intmain()

2

這是一段簡單的程式,其功能是為了顯示乙個對話視窗。這個對話視窗作業系統已經幫我們寫好了,我們實際上是在呼叫這段**。好!大家想一下我們能不能在呼叫這個函式之前截斷這個呼叫,讓程式呼叫自己的函式。(想想做外掛程式是不是這個原理)答案是肯定的,我們能夠截斷這個訊息並讓他呼叫自己的函式。下面我們來**實現一下。

1

intwinapi mymsg( hwnd hwnd,

2lpctstr iptext,

3lpctstr ipcaption,

4uint utype)

5

這是我寫的乙個函式(注意:函式返回值和引數一定要和messagebox一樣,這樣介面才能對上,不然會報錯),我們要讓程式執行我們的函式,那麼我們就要寫乙個鉤子。

1

bool

hook()2;

8//0xe9無條件跳轉(學過彙編的同學應該知道)

9 b[0] = 0xe9;10

//計算偏移位址。 偏移位址 = 跳轉位址-messagebox的位址

11 *(dword*)(b + 1) = (dword)mymsg - (dword)p - 5;12

/*通過上面三行**,這個陣列儲存的**意思是(無條件跳轉到我的函式位址位置)

*/13

14//

在計算位置的記憶體中寫入資料

15 writeprocessmemory(getcurrentprocess(), p, b, 5

, null);

16return1;

17 }

我已經寫好了乙個鉤子,下面我放出完整程式的**

1  #include 2  #include 3

4int

winapi mymsg( hwnd hwnd,

5lpctstr iptext,

6lpctstr ipcaption,

7uint utype)812

13bool

hook()14;

20//

0xe9無條件跳轉(學過彙編的同學應該知道)

21 b[0] = 0xe9;22

//計算偏移位址。 偏移位址 = 跳轉位址-messagebox的位址

23 *(dword*)(b + 1) = (dword)mymsg - (dword)p - 5;24

/*通過上面三行**,這個陣列儲存的**意思是(無條件跳轉到我的函式位址位置)

*/25

26//

在計算位置的記憶體中寫入資料

27 writeprocessmemory(getcurrentprocess(), p, b, 5

, null);

28return1;

29}30int

main()

31

首先我們把hook注釋掉執行。執行結果如下。

如何加上hook,你會發現一件令人興奮的事情,並沒有彈出對話方塊。執行結果如下

通過這個例子相信大家對hook有了一些了解,現在大家肯能會有乙個疑問,我能跳轉,能不能回去呢,答案是能的。我也給大家提供乙個點思路readprocessmemory()用這個api來儲存原來的段位址和記憶體中的**,回去時在利用writeprocessmemory()再跳轉一次,就可以會到原來呼叫的**處了,這些是不是很棒,大家可以回家自行試驗,也可以鞏固一下今天所學的知識。

如果中間有什麼錯誤,還請高手能幫我指出。

Linux 你不能不知道的小知識

1.在命令列中開啟 display 2.在命令列中開啟pdf,word,ppt等 gnome open 或者xdg open 3.在命令列中開啟檔案的圖形介面 nautilus 4.游標掉轉終端命令的最前端 ctrl a 最後 ctrl e 去掉前乙個空格後面的命令 ctrl w 5.vim 沒有許...

關於unicode不能不知道的知識

在計算機出現的中後期,人們開發了unix,並為無重音英語字母開發了一套稱為ascii的編碼,它能夠使用32到127之間的數字表示各個字元,空格是32。由於那個時期生產的大多數計算機使用8位大小的位元組,因此使用者不僅可以存放所有可能的ascii字元,而且還有整整一位空餘下來。他們想可以把128 25...

你不能不知道的11個軟體測試步驟

第一步 評定開發方案和狀態 這第一步是建立w t計畫的先決條件,w t計畫用於評估執行的軟體解決方案。在這一步,測試員可質疑開發方案的完整性和正確性。並且基於專案計畫的完整和延伸定義,測試員要估計出測試這個執行的軟體解決方案所需要的資源數量。第二步 形成測試計畫 形成測試計畫應該要符合軟體開發過程的...