話不多說,首先貼**,**主體參考自一本關於黑客技術的書,書名給忘了。
當時只是敲出來跟著用,也沒有深入理解,最近再看,才發現一些原理。
inline hook的好處就是可以獲取被hook函式的引數,我們可以自行處理這些資料,再呼叫本來的hook函式。
#include #include既不解釋**含義,也不解釋win32 api。需要注意的就是以下兩點。#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()
首先來看圖
為什麼是0xe9?0xe9代表jmp指令。
但是圖上不是eb嗎?
因為平時使用od這樣的除錯工具,大多數情況下修改跳轉,把jne之類的修改成jmp,
都是修改成了eb,久而久之,就忘了,jmp有好幾種跳轉方式,這種修改應該是屬於直接跳轉。
jmp
short.(說是short,實際上是乙個帶符號的位元組範圍 -128~127
)。如圖所示,位址0x00401200 和0x00401216,有著0x14個位元組的指令,這就是直接跳轉。
1個位元組,肯定不夠我們跳轉的,所以這裡要用的是第2種跳轉方式。再看另一副圖
從位址0x0041c3c1跳轉到0x41c2ae,用的是e9 e8feffff一種比較好的測試方案,就是使用od除錯以上**,ctrl+g跳轉到messageboxa的位址處,看看隨著**的執行,該位址處的指令如何變化。因為32位下jmp遠跳一共用了5位元組的記憶體。
e9 是jmp ,對應**中的第一處
剩下4位元組儲存的是 目的位址-起始位址-指令長度,對應**中的第二處
所以才有 0x41c2ae-0x41c3c1-5 = fffffee8 。因為記憶體裡面是小端,所以顯示出來就是e8feffff。
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位的系...