检测API函数的InlineHook

 1 BOOL GetProcHookStatus(LPCSTR lpModuleName, LPCSTR lpProcName)
 2 {
 3     HMODULE hModule = GetModuleHandleA(lpModuleName);
 4     if (NULL == hModule)
 5     {    
 6         hModule = LoadLibraryA(lpModuleName);
 7         if (NULL == hModule)
 8             return -1;
 9     }
10 
11     FARPROC farProc = GetProcAddress(hModule, lpProcName);
12     if (NULL == farProc)
13         return -1;
14 
15     BYTE buffer[5] = {};
16     if (!ReadProcessMemory(GetCurrentProcess(), farProc, &buffer, 5, NULL))
17         return -1;
18 
19     if (buffer[0] == 0x8B && buffer[1] == 0xFF && buffer[2] == 0x55 && buffer[3] == 0x8B && buffer[4] == 0xEC)
20         return FALSE;
21     if (buffer[0] == 0xEB || buffer[0] == 0xE9 || buffer[0] == 0xEA)
22         return TRUE;
23     
24     return -1;
25 }
View Code

注意,此函数只能用于检测系统API的InlineHook,因为使用到了MS的系统API函数的特点: 每个正常系统API的开头前五个字节必为8B FF 55 8B EC,

这是MS为热补丁技术留下的接口,也是Detours库留下的接口,具体可以自行搜索

 

另外判断InlineHook的关键是,buffer第一个字节是否为EB E9 EA,因为直接的JMP分成三种,

Short Jump 短跳转 机器码 EB 只能跳转到256字节的范围内
Near Jump 近跳转 机器码 E9 可跳至同一个段的范围内的地址
Far Jump 远跳转 机器码 EA 可跳至任意地址,使用48位/32位全指针
posted on 2015-07-28 10:26  gwsbhqt 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/gwsbhqt/p/4682067.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值