Windows下32位程式的Inline Hook

2022-09-18 03:33:42 字數 1629 閱讀 8901

話不多說,首先貼**,**主體參考自一本關於黑客技術的書,書名給忘了。

當時只是敲出來跟著用,也沒有深入理解,最近再看,才發現一些原理。

inline hook的好處就是可以獲取被hook函式的引數,我們可以自行處理這些資料,再呼叫本來的hook函式。

#include #include 

#include

using

namespace

std;

class

myhook

~myhook()

/**hook的模組名稱,hook的api函式名稱,鉤子函式位址

*/winbool hook(lpstr modulename, lpstr funcname, proc hookfunc)

return

bret;

}void

unhook()

}winbool rehook()

return

ret;

}private

: proc funcaddr;

byte oldbytes[5];

byte newbytes[5];

};myhook hook;

intwinapi mymessageboxa(hwnd hwnd,lpcstr lptext,lpcstr lpcaption,uint type)

intmain()

既不解釋**含義,也不解釋win32 api。需要注意的就是以下兩點。

首先來看圖

為什麼是0xe9?

0xe9代表jmp指令。

但是圖上不是eb嗎?

因為平時使用od這樣的除錯工具,大多數情況下修改跳轉,把jne之類的修改成jmp,

都是修改成了eb,久而久之,就忘了,jmp有好幾種跳轉方式,這種修改應該是屬於直接跳轉。

jmp

short.(說是short,實際上是乙個帶符號的位元組範圍 -128~127

)。如圖所示,位址0x00401200 和0x00401216,有著0x14個位元組的指令,這就是直接跳轉。

1個位元組,肯定不夠我們跳轉的,所以這裡要用的是第2種跳轉方式。再看另一副圖

從位址0x0041c3c1跳轉到0x41c2ae,用的是e9 e8feffff

因為32位下jmp遠跳一共用了5位元組的記憶體。

e9 是jmp ,對應**中的第一處

剩下4位元組儲存的是 目的位址-起始位址-指令長度,對應**中的第二處

所以才有 0x41c2ae-0x41c3c1-5 = fffffee8 。因為記憶體裡面是小端,所以顯示出來就是e8feffff。

一種比較好的測試方案,就是使用od除錯以上**,ctrl+g跳轉到messageboxa的位址處,看看隨著**的執行,該位址處的指令如何變化。

windows32位下安裝Redis 連線PHP

為了省去用cmd進入資料夾的麻煩可以直接進入到你的redis資料夾下shift 滑鼠右鍵 如右圖 接著輸入以下指令 redis.conf為redis的配置檔案,有需要的可以修改過後執行,這個是我從網上copy下來改好能用的 如果你能看到cmd顯示以下內容,恭喜你,你的redis服務端已經能用了 以後...

在64位linux下編譯32位程式

一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在32位平台上編譯32位程式而在64位平台上編譯64位程式。現在64位的系統 這裡主要指x86 64系統,包括amd64和intel的em64t 已經開始廣泛的使用起來了,甚至於你現在要是想買32位的處理器根本就沒有。64位的系統在效能和...

在64位linux下編譯32位程式

留存備份 一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在32位平台上編譯32位程式而在64位平台上編譯64位程式。現在64位的系統 這裡主要指x86 64系統,包括amd64和intel的em64t 已經開始廣泛的使用起來了,甚至於你現在要是想買32位的處理器根本就沒有。64位的系...