正文
检测API函数的InlineHook
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
BOOL GetProcHookStatus(LPCSTR lpModuleName, LPCSTR lpProcName)
{
HMODULE hModule = GetModuleHandleA(lpModuleName);
if (NULL == hModule)
{
hModule = LoadLibraryA(lpModuleName);
if (NULL == hModule)
return -;
} FARPROC farProc = GetProcAddress(hModule, lpProcName);
if (NULL == farProc)
return -; BYTE buffer[] = {};
if (!ReadProcessMemory(GetCurrentProcess(), farProc, &buffer, , NULL))
return -; if (buffer[] == 0x8B && buffer[] == 0xFF && buffer[] == 0x55 && buffer[] == 0x8B && buffer[] == 0xEC)
return FALSE;
if (buffer[] == 0xEB || buffer[] == 0xE9 || buffer[] == 0xEA)
return TRUE; return -;
}
注意,此函数只能用于检测系统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位全指针