标签:
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 }
注意,此函数只能用于检测系统API的InlineHook,因为使用到了MS的系统API函数的特点: 每个正常系统API的开头前五个字节必为8B FF 55 8B EC,
这是MS为热补丁技术留下的接口,也是Detours库留下的接口,具体可以自行搜索
另外判断InlineHook的关键是,buffer第一个字节是否为EB E9 EA,因为直接的JMP分成三种,
标签:
原文地址:http://www.cnblogs.com/gwsbhqt/p/4682067.html