使得hook更加靈活,支持卸載
計(jì)算指令長(zhǎng)度使用另一個(gè)LDE32,代碼簡(jiǎn)潔,很容易看懂
Stub更加簡(jiǎn)潔,保存了寄存器,可以支持hook __fastcall的函數(shù)
增加了一個(gè)結(jié)構(gòu)體HOOKENVIRONMENT,一般情況下用不到,主要用來(lái)卸載的^_^
使用中有什么問(wèn)題跟帖說(shuō)明
/*
//////////////////////////////////////////////////////////////////////////
HookApi 0.5
thanks to xIkUg ,sucsor
by 海風(fēng)月影[RCT] , eIcn#live.cn
2008.04.15
//////////////////////////////////////////////////////////////////////////
//更新內(nèi)容
2008.04.15 0.5
1,重新寫(xiě)了Stub,換了一種模式,使hook更加自由,將hookbefore和hookafter合并
HookProc的定義方式與以前有所不同:
HookProc的函數(shù)類型和原來(lái)的api一樣,只是參數(shù)比原API多2個(gè)
DWORD WINAPI HookProc(DWORD RetAddr ,__pfnXXXX pfnXXXX, ...);
//參數(shù)比原始的API多2個(gè)參數(shù)
RetAddr //調(diào)用api的返回地址
pfnXXX //類型為_(kāi)_pfnXXXX,待hook的api的聲明類型,用于調(diào)用未被hook的api
詳見(jiàn)My_LoadLibraryA
原始的LoadLibraryA的聲明是:
HMODULE WINAPI LoadLibraryA( LPCSTR lpLibFileName );
那么首先定義一下hook的WINAPI的類型
typedef HMODULE (WINAPI __pfnLoadLibraryA)(LPCTSTR lpFileName);
然后hookproc的函數(shù)聲明如下:
HMODULE WINAPI My_LoadLibraryA(DWORD RetAddr,
__pfnLoadLibraryA pfnLoadLibraryA,
LPCTSTR lpFileName
);
比原來(lái)的多了2個(gè)參數(shù),參數(shù)位置不能顛倒,在My_LoadLibraryA中可以自由的調(diào)用未被hook的pfnLoadLibraryA
也可以調(diào)用系統(tǒng)的LoadLibraryA,不過(guò)要自己在hookproc中處理好重入問(wèn)題
另外,也可以在My_LoadLibraryA中使用UnInstallHookApi()函數(shù)來(lái)卸載hook,用法如下:
將第二個(gè)參數(shù)__pfnLoadLibraryA pfnLoadLibraryA強(qiáng)制轉(zhuǎn)換成PHOOKENVIRONMENT類型,使用UnInstallHookApi來(lái)卸載
例如:
UnInstallHookApi((PHOOKENVIRONMENT)pfnLoadLibraryA);
至于以前版本的HookBefore和HookAfter,完全可以在自己的HookProc里面靈活使用了
2,支持卸載hook
InstallHookApi()調(diào)用后會(huì)返回一個(gè)PHOOKENVIRONMENT類型的指針
需要卸載的時(shí)候可以使用UnInstallHookApi(PHOOKENVIRONMENT pHookEnv)來(lái)卸載
在HookProc中也可以使用UnInstallHookApi來(lái)卸載,參數(shù)傳入HookProc中的第二個(gè)參數(shù)
注意:當(dāng)HookProc中使用UnInstallHookApi卸載完后就不能用第二個(gè)參數(shù)來(lái)調(diào)用API了~~,切記!
2008.04.15 0.41
1,前面的deroko的LdeX86 有BUG,678b803412 會(huì)算錯(cuò)
換了一個(gè)LDX32,代碼更少,更容易理解
2,修復(fù)了VirtualProtect的一個(gè)小BUG
0.4以前
改動(dòng)太大了,前面的就不寫(xiě)了
*/