• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-60  評論-111  文章-0  trackbacks-0
            1. 借用了海風月影的HookApi 0.5的一些思路;
            2. 又是一個APIHOOK,沒什么特別的!能順利完成任務,沒有什么多余的!代碼里用到了libdasm去下載一個吧!
            3. HookProc的函數類型和原來的api一樣,只是參數比原API多2個
              DWORD WINAPI HookProc(DWORD RetAddr ,__pfnXXXX pfnXXXX, ...);
              //參數比原始的API多2個參數
              RetAddr //調用api的返回地址
              pfnXXX  //類型為__pfnXXXX,待hook的api的聲明類型,用于調用未被hook的api
            4. 做成了一個類,構造對象的時候自動HOOK,析構的時候UnHook,注意一下實例的生存期就可以實現臨時hook和全局hook。
            使用例子,注意黃色部分:
             1 typedef int (WINAPI *__pfnMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
             2 
             3 int WINAPI MyMessageBoxW(DWORD RetAddr, __pfnMessageBoxW pfnLoadLibraryA, HWND hWnd, LPCWSTR lpText,
             4     LPCWSTR lpCaption, UINT uType)
             5 {
             6     return pfnLoadLibraryA(hWnd,lpText,L"MyMessageBoxW",uType);
             7 }
             8 
             9 void Test()
            10 {
            11     {
            12         CApiHook h("user32.dll","MessageBoxW",MyMessageBoxW);
            13         MessageBoxW(this->m_hWnd,L"標題應該被修改了",L"標題",MB_OK);
            14     }
            15     MessageBoxW(this->m_hWnd,L"標題應該沒有被修改了",L"標題",MB_OK);
            16 
            ApiHook.h
             1 #pragma once
             2 typedef int (WINAPI *__pfnMessageBoxW)( HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
             3 class CApiHook
             4 {
             5 protected:
             6     bool m_bHooked;
             7     PBYTE m_Stub;
             8     int m_ReplaceCodeSize;
             9     LPVOID m_pfnAPI;
            10 public:
            11     CApiHook(LPCTSTR lpLibName,LPCTSTR lpProcName,LPVOID lpHookProc);
            12     ~CApiHook(void);
            13     bool Hooked();
            14 };
            15 
            ApiHook.cpp
              1 #include "ApiHook.h"
              2 #include "libdasm.h"
              3 #pragma comment( lib, "libdasmd.lib" )
              4 
              5 //00   FF3424        push    dword ptr [esp]
              6 //03   FF3424        push    dword ptr [esp]
              7 //06   50            push    eax
              8 //07   E8 00000000   call    0C
              9 //0C   58            pop     eax
             10 //0D   83C0 0E       add     eax, 0E
             11 //10   894424 0C     mov     dword ptr [esp+C], eax
             12 //14   58            pop     eax
             13 //15   E9 00000000   jmp     1A <== modify
             14 
             15 const BYTE Stub_Temp[]=
             16 {
             17     //0    1    2    3    4    5    6    7    8    9    a    b    c    d    e    f
             18     0xFF,0x34,0x24,0xFF,0x34,0x24,0x50,0xE8,0x00,0x00,0x00,0x00,0x58,0x83,0xC0,0x0E,
             19     0x89,0x44,0x24,0x0C,0x58,0xE9,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x90,
             20     //                            ~~~~~~~~~~~~~~~~~~~
             21     0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90 
             22 };
             23 
             24 #define JMP_MY_OFFSET (0x15)
             25 #define ORG_HEAD_OFFSET (0x1a)
             26 #define STUB_LENGTH (0x30)
             27 CApiHook::CApiHook(LPCTSTR lpLibName,LPCTSTR lpProcName,LPVOID lpHookProc)
             28     :m_bHooked(false)
             29     ,m_Stub(NULL)
             30     ,m_ReplaceCodeSize(0)
             31 {
             32     HMODULE hMod=GetModuleHandle(lpLibName);
             33     if(hMod==NULL)
             34     {
             35         hMod=LoadLibrary(lpLibName);
             36     }
             37     if(hMod==NULL)
             38     {
             39         return;//取模塊句柄失敗
             40     }
             41     LPVOID pfnAPI;
             42     pfnAPI=GetProcAddress(hMod,lpProcName);
             43     if(pfnAPI==NULL)
             44     {
             45         return;//取API地址失敗
             46     }
             47     INSTRUCTION inst;
             48     int iReplaceCodeSize=0,il;
             49     DWORD RetSize=0;
             50     while(iReplaceCodeSize<5)
             51     {
             52         iReplaceCodeSize+=(il=get_instruction(&inst,(BYTE*)pfnAPI+iReplaceCodeSize,MODE_32));
             53         if(il==0)
             54         {
             55             return;//解析指令失敗
             56         }
             57     }
             58     if(iReplaceCodeSize>16)
             59     {
             60         return;//超出預計的大小
             61     }
             62     m_Stub=(PBYTE)VirtualAlloc(NULL,STUB_LENGTH,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
             63     if(m_Stub==NULL)
             64     {
             65         return;
             66     }
             67     __try
             68     {
             69         memcpy(m_Stub,Stub_Temp,sizeof(Stub_Temp));
             70         if(ReadProcessMemory(GetCurrentProcess(),pfnAPI,&m_Stub[ORG_HEAD_OFFSET],iReplaceCodeSize,&RetSize)==0)
             71         {
             72             return;//保存原始API頭失敗
             73         }
             74         DWORD dwDelta;
             75         //set my jump
             76         dwDelta=(DWORD)lpHookProc-(DWORD)&m_Stub[JMP_MY_OFFSET+5];
             77         *(DWORD*)&m_Stub[JMP_MY_OFFSET+1]=dwDelta;
             78         //set org jmp
             79         m_Stub[ORG_HEAD_OFFSET+iReplaceCodeSize]=0xe9;
             80         dwDelta=((DWORD)pfnAPI+iReplaceCodeSize)-(DWORD)&m_Stub[ORG_HEAD_OFFSET+iReplaceCodeSize+5];
             81         *(DWORD*)&m_Stub[ORG_HEAD_OFFSET+iReplaceCodeSize+1]=dwDelta;
             82 
             83         //modify API entry
             84         BYTE buf[8];
             85         dwDelta=(DWORD)&m_Stub[0]-((DWORD)pfnAPI+5);
             86         *(DWORD*)&buf[1]=dwDelta;
             87         buf[0]=0xe9;
             88         if(WriteProcessMemory(GetCurrentProcess(),pfnAPI,buf,5,&RetSize)==0)
             89         {
             90             return;
             91         }
             92         m_bHooked=true;
             93         m_pfnAPI=pfnAPI;
             94         m_ReplaceCodeSize=iReplaceCodeSize;
             95     }
             96     __finally
             97     {
             98         if(!Hooked())
             99         {
            100             VirtualFree(m_Stub,STUB_LENGTH,MEM_RELEASE);
            101             m_Stub=NULL;
            102         }
            103     }
            104 }
            105 
            106 CApiHook::~CApiHook(void)
            107 {
            108     DWORD RetSize=0;
            109     if(Hooked())
            110     {
            111         WriteProcessMemory(GetCurrentProcess(),m_pfnAPI,&m_Stub[ORG_HEAD_OFFSET],m_ReplaceCodeSize,&RetSize);
            112         VirtualFree(m_Stub,STUB_LENGTH,MEM_RELEASE);
            113     }
            114 }
            115 
            116 bool CApiHook::Hooked()
            117 {
            118     return m_bHooked;
            119 }
            posted on 2011-07-31 15:21 shaker(太子) 閱讀(2838) 評論(0)  編輯 收藏 引用 所屬分類: C++
            国产精品久久久亚洲| 国产一区二区精品久久岳| 久久人妻AV中文字幕| 亚洲伊人久久精品影院| 996久久国产精品线观看| 狠狠久久综合| 无码国内精品久久人妻蜜桃 | 久久人人爽爽爽人久久久| 亚洲v国产v天堂a无码久久| 久久综合九色综合网站| 久久精品国产精品亚洲人人 | 久久超碰97人人做人人爱| 国内精品久久久久影院网站| 久久精品国产免费观看三人同眠| 奇米影视7777久久精品人人爽| 久久综合国产乱子伦精品免费| 亚洲国产成人久久综合碰碰动漫3d| 日产久久强奸免费的看| 国产精品久久久久天天影视 | 久久精品九九亚洲精品| 久久久久综合中文字幕| 无码精品久久久天天影视| 国产精品欧美久久久久天天影视| 亚洲精品无码久久久久sm| 久久99国产精一区二区三区| 亚洲精品综合久久| 办公室久久精品| 91麻豆精品国产91久久久久久| 青青草原精品99久久精品66| 精品久久人人爽天天玩人人妻| 久久久久国产一级毛片高清版| 久久天天躁狠狠躁夜夜不卡| 人妻无码久久精品| 久久久久国产一区二区三区| 91精品国产高清91久久久久久| 亚洲级αV无码毛片久久精品| 97久久精品无码一区二区天美| 99久久免费国产精品特黄| 人妻精品久久久久中文字幕| 亚洲国产小视频精品久久久三级 | 99国产欧美精品久久久蜜芽|