使得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
也可以调用系统的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以前
改动太大了,前面的就不写了
*/