• 检测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位全指针
  • 相关阅读:
    java中文api 安装和引入eclipse
    【JAVA学习笔记】Java中的static关键字解析
    终于做好了JDBC在java和sql 2005之间的连接了 ,快哭了
    CF 5 A. Chat Server's Outgoing Traffic
    NYOJ 16 矩形嵌套
    poj 1061 青蛙的约会
    nefu 2 猜想
    nefu 120 梅森素数
    nefu 118 n!后面有多少个0
    nefu 117 素数个数的位数
  • 原文地址:https://www.cnblogs.com/gwsbhqt/p/4682067.html
Copyright © 2020-2023  润新知