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