用戶登錄  |  用戶注冊
首 頁源碼下載網絡學院最新源碼源碼排行屏蔽廣告
當前位置:新興網絡 > 網絡學院 > 編程開發 > C/C++

C++ Win32 API Hook類

減小字體 增大字體 作者:佚名  來源:本站整理  發布時間:2011-03-25 17:21:21

示例.rar

HookApi.h

C/C++ code復制代碼
#include <windows.h>
#ifndef _HOOKAPI_H
#define _HOOKAPI_H

class CHOOKAPI {
public:
    LPVOID    pOldFunEntry, pNewFunEntry ;    // 初始函數地址、HOOK后的函數地址
    BYTE    bOldByte[5], bNewByte[5] ;        // 原始字節、目標字節

public:
    CHOOKAPI () {}
    ~CHOOKAPI() {}
    // 實現HOOK API
    void Hook ( PSTR szModuleName, PSTR szFunName, FARPROC pFun )
    {   
        HMODULE    hMod = ::GetModuleHandleA ( szModuleName ) ;
        if ( hMod != NULL )
        {
            pNewFunEntry    = (LPVOID)pFun ;
            pOldFunEntry    = (LPVOID)GetProcAddress ( hMod, szFunName ) ;
            bNewByte[0]        = 0xE9 ;
            *((PDWORD)(&(bNewByte[1])))    = (DWORD)pNewFunEntry - (DWORD)pOldFunEntry - 5 ;

            DWORD   dwProtect, dwWriteByte, dwReadByte ;
            VirtualProtect ( (LPVOID)pOldFunEntry, 5, PAGE_READWRITE, &dwProtect );
            ReadProcessMemory    ( GetCurrentProcess(), (LPVOID)pOldFunEntry, bOldByte, 5, &dwReadByte ) ;       
            WriteProcessMemory    ( GetCurrentProcess(), (LPVOID)pOldFunEntry, bNewByte, 5, &dwWriteByte ) ;
            VirtualProtect ( (LPVOID)pOldFunEntry, 5, dwProtect, NULL ) ;
        }
    }
    // 重新HOOK
    void ReHook ()
    {
        DWORD    dwProtect, dwWriteByte ;
        VirtualProtect ( pOldFunEntry, 5, PAGE_READWRITE, &dwProtect );
        WriteProcessMemory ( GetCurrentProcess(), pOldFunEntry, bNewByte, 5, &dwWriteByte ) ;
        VirtualProtect ( pOldFunEntry, 5, dwProtect, NULL ) ;
    }
    // 撤消HOOK
    void UnHook ()
    {
        DWORD    dwProtect, dwWriteByte ;
        VirtualProtect ( pOldFunEntry, 5, PAGE_READWRITE, &dwProtect );
        WriteProcessMemory ( GetCurrentProcess(), pOldFunEntry, bOldByte, 5, &dwWriteByte ) ;
        VirtualProtect ( pOldFunEntry, 5, dwProtect, NULL ) ;
    }
} ;

#endif

調用測試:

C/C++ code復制代碼
#include "stdafx.h"
#include "HookApi.h"
CHOOKAPI    HookItem ;

// 定義MessageBoxA函數原型
typedef int (WINAPI* PFNMessageBoxA)( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType ) ;

// 自定義的MessageBoxA函數
// 實現對原始MessageBoxA的輸入、輸出參數的監控,甚至是取消調用
int WINAPI New_MessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType )
{
    // 撤消HOOK
    HookItem.UnHook () ;
   
    // 此處可以觀察/修改調用參數,甚至可以取消調用直接返回。
    // ……
   
    // 取得原函數地址
    PFNMessageBoxA pfnMessageBoxA = (PFNMessageBoxA)HookItem.pOldFunEntry ;
   
    // 調用原函數,修改輸入參數
    int ret = pfnMessageBoxA ( hWnd, "這是HOOK函數過程的消息框", "[測試]", uType ) ;
   
    // 此處可以查看/修改調用原函數的返回值
    // ……
   
    // 重新HOOK
    HookItem.ReHook () ;
   
    return ret ;
}

int main(int argc, char* argv[])
{
    // 原始API
    MessageBoxA ( 0, "正常消息框", "測試", 0 ) ;
   
    // HOOK API
    HookItem.Hook ( "USER32.dll", "MessageBoxA", (FARPROC)New_MessageBoxA ) ;
   
    // 調用API,測試
    MessageBoxA ( 0, "正常消息框", "測試", 0 ) ;

    // 撤消HOOK
    HookItem.UnHook () ;

    printf("Hello World!\n");
    return 0;
}

Tags:Hook 鉤子 Win32 VC

作者:佚名
  • 好的評價 如果您覺得此文章好,就請您
      50%(3)
  • 差的評價 如果您覺得此文章差,就請您
      50%(3)

網絡學院評論評論內容只代表網友觀點,與本站立場無關!

   評論摘要(共 0 條,得分 0 分,平均 0 分) 查看完整評論
美国百家乐注册