• Ring3 Hook API


    
    

     hook  计算机里面一般是指 挂钩某函数, 就是替换掉原来的函数。

    inline hook ,  是直接在以前的函数替里面修改指令,用一个跳转或者其他指令来达到挂钩的目的。
                    这是相对普通的hook来说,因为普通的hook只是修改函数的调用地址,而不是在原来的函数体里面做修改。

    一般来说 普通的hook比较稳定使用。 inline hook 更加高级一点,一般也跟难以被发现。所以很多人比如病毒制作者都比较推崇inline hook。

     1 /*Ring3 inline Hook API 本进程内*/
     2 #include<windows.h>
     3 #include<stdio.h>
     4 
     5 typedef (WINAPI *pMessageBoxDef)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
     6 
     7 char szOldMessageBox[5] = {0};
     8 char szJmpMyMessageBox[5] = {(char)0xe9}; //0xe9为jmp指令
     9 
    10 pMessageBoxDef  pMessageBox = NULL;
    11 
    12 int WINAPI MyMessageBox(
    13   HWND hWnd,          // handle of owner window
    14   LPCTSTR lpText,     // address of text in message box
    15   LPCTSTR lpCaption,  // address of title of message box
    16   UINT uType          // style of message box
    17 )
    18 {
    19 
    20     printf("函数拦截成功,可以修改传进来的参数,做坏事啦,只是一个例子!\n");
    21 
    22     WriteProcessMemory((void*)-1, pMessageBox, szOldMessageBox, 5, NULL);
    23 
    24     MessageBoxW(hWnd, lpText, lpCaption, uType);
    25 
    26     WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL);
    27     
    28     return 0;
    29 }
    30 
    31 int main()
    32 {
    33     DWORD dwJmpAddr = 0;//jmp指令jmp到的地址(机器码表示)
    34 
    35 
    36     HMODULE hModule  = LoadLibrary("USER32.dll");
    37     
    38 
    39     pMessageBox = GetProcAddress(hModule, (LPCSTR)"MessageBoxW");
    40     // 0xE9 (code) -> code = 目标地址(就是你hook函数所在地址) - 源地址(就是被hook地方地址) - 5
    41     dwJmpAddr = (DWORD)MyMessageBox - (DWORD)pMessageBox - 5;//MyMessageBox是函数入口地址 pMessageBox也是函数入口地址
    42     //pMessageBox(0,0,0,0);
    43     memcpy(szJmpMyMessageBox + 1, &dwJmpAddr, 4);//dwJmpAddr = 0x8869AACC(只是我机器上的,这个数值会变动)
    44 
    45     FreeLibrary(hModule);
    46 
    47      ReadProcessMemory((void*)-1, pMessageBox, szOldMessageBox, 5, NULL);//读出原来的前5个字节 在地址pMessageBox(0x77d66534)处:
    48                                                                          //8B FF 55 8B EC
    49     WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL);//写入我们处理后的5个字节 在地址pMessageBox(0x77d66534)处:
    50                                                                             //E9 CC AA 69 88 (jmp XXXXXX)
    51 
    52 
    53     MessageBoxW(GetForegroundWindow(), L"Inline Hook:MessageBox", L"HOOK API", MB_OK);
    54 
    55     MessageBoxW(GetForegroundWindow(), L"Hello World", L"Win32", MB_OK);
    56 
    57     return 0;
    58 }

    详情参考:

    http://bbs.pediy.com/archive/index.php?t-67311.html

  • 相关阅读:
    详细解释:nginx中ChsHttpProxyModule模块各项配置及其含义
    详细解释:nginx中ngx_http_headers_module模块配置及各个参数含义
    java生成UUID通用唯一识别码 (Universally Unique Identifier)
    详细解释:nginx中gzip的各项配置以及配置参数的意思详解
    详细解释:nginx中ChsHttpUpstreamModule模块配置及各个参数含义
    linux下jdk、tomcat的安装及项目的部署和去掉项目名访问详细总结
    ORACLE中的序列和触发器
    详解之:linux下tomcat、nginx的负载均衡及memcached对session共享的实现配置详细总结
    ASp.net 剖析三层架构
    asp.net简单的注册或者登陆三层架构的例子
  • 原文地址:https://www.cnblogs.com/foohack/p/3132976.html
Copyright © 2020-2023  润新知