[原创][更新]Extreme HookEngine——Ring3 API Hook 静态库

wjwmz 2010-6-26 10:49 15546
说明:
Extreme HookEngine,以Inline Hook的方法,内置反汇编引擎,能够高效、稳定地挂钩多种函数调用约定的API。一般的 WINAPI (stdcall)当然不在话下。理论上支持挂钩pascal,fastcall,cdecl,naked等类型的函数。

特点:
1、支持多种挂钩调用约定的函数,支持取消挂钩。
2、支持在未取消挂钩时调用原始函数。
3、支持导出函数(提供Dll名称、函数名称)和非导出函数(提供地址)的挂钩。
4、查找导出函数时支持ANSI、Unicode多种规范的字符串。
5、接口调用简单,一个结构体搞定一切。

举例:
挂钩 GetTempPathA。
#include "test.h"

HOOKINFO g_HookInfo;
typedef DWORD (WINAPI *RealGetTempPath) (DWORD nBufferLength, LPSTR lpBuffer);

DWORD WINAPI MyGetTempPath(DWORD nBufferLength, LPSTR lpBuffer)
{
    // Get original function
    RealGetTempPath pRGT = (RealGetTempPath)g_HookInfo.Stub;

    // Call the function which is original while hook enabled
    pRGT(nBufferLength, lpBuffer);

    // Process the result value. Tell us the hook is working
    strcat(lpBuffer, "Hooked\\");

    // Don't worry about how to return the result. Just do it as what you always do: return xxxx
    return strlen(lpBuffer);
}

void PrtTmpPath(void)
{
    char Path[MAX_PATH];
    GetTempPath(MAX_PATH, Path);
    printf("%s\n", Path);
}

int main()
{
    // Not Hooked
    PrtTmpPath();

    HEInitHook(&g_HookInfo, "kernel32", "GetTempPathA", MyGetTempPath);
    HEStartHook(&g_HookInfo);

    // Hooked
    PrtTmpPath();

    HEStopHook(&g_HookInfo);

    // UnHooked
    PrtTmpPath();
    getchar();
    return 0;
}


使用:
#include "hook.h"后,即可使用一下函数:
HEInitHook():初始化钩子,用于挂钩导出函数。(以地址Hook函数不需要调用本函数)
HeStartHook():安装钩子。
HeStopHook():卸载钩子。

HOOKINFO结构体成员说明:
FuncAddr:被挂钩函数的起始地址。
FakeAddr:过滤函数的地址。
CodeLength:被挂钩函数的起始地址被写入的挂钩代码的长度。(UnHook时要用)
Stub:在钩子生效时调用原始函数的函数指针。注意:调用时建议使用typedef声明函数类型,别忘了说明函数的调用约定。例如: typedef BOOL (WINAPI *OriginalFunction)(WORD Param1, DWORD param2);

更新:
2010-7-9 :[Fix Bug]对于分配的Stub,没有设置VirtualProtect,导致挂钩时调用原函数内存有时出错进行修补。

下载地址:
http://code.google.com/p/code-from-extreme/downloads/list

[原创文章]转载请注明出处:http://hi.baidu.com/q_lai_a_qu/blog/item/948864da97a776d6b6fd48a1.html
上传的附件:
最新回复 (20)
chenchuai 2010-6-26 11:12
2
牛人年年有,还是楼主最牛啊.....................
25
sudami 2010-6-26 11:34
3
Detours不是很好嘛.
10
cvcvxk 2010-6-26 13:03
4
求支持x64
zyanswer 2010-6-27 03:56
5
又见HOOK..........
hjonline 2010-6-27 07:17
6
支持楼主,新版的detour似乎与gcc 不能兼容。
网络游侠 2010-6-27 16:34
7
能兼容32/win7?
idigger 2010-6-27 16:36
8
感谢分享,下载收藏了
tensai 2010-6-29 16:04
9
感谢楼主的无私奉献
comeon 2010-6-30 08:39
10
点位 学习   (6个字了,干嘛非要6个字以上)
wjwmz 2010-7-9 14:02
11
现在已经更新下载,Fix了一个小Bug
hankcs 2010-7-9 14:59
12
LINK : warning LNK4098: defaultlib "LIBCMT" conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : fatal error LNK1000: unknown error; consult documentation for technical support options
wjwmz 2010-7-11 12:57
13
恩……库的版本问题。我发布的是Release版本的。PS:如果需要调试版(Debug),可以直接使用源代码。只需将头文件中的#pragma comment一行删去,并在“源代码”筛选器中加入HookEngine.c、ADE.c即可。
hankcs 2010-7-11 14:06
14
对,要是想做全局hook是不是非得注入dll?
1
morning 2010-7-12 09:59
15
1.static lib与编译器版本相关,遇到编译问题的应该使用source自己编译.
2.结构可以做得更优雅一些,运用一下模板,免去调用函数时手动强制类型转化.
gabalwto 2010-7-12 11:15
16
LZ有没有想过如何防检测??
kimgao 2010-7-12 14:27
17
强烈支持本帖·!
wjwmz 2010-7-13 15:34
18
小弟不会cpp……膜拜下~如果您可以修改,别忘了给我Src。谢谢!
pengyou 2010-12-23 10:50
19
下载了,谢谢楼主
9571 2011-4-21 23:49
20
好东西,感谢分享
tlHelen 2011-4-22 00:07
21
顶啊。。。。。。。。。。。。。
返回