• <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++
            精品久久久久久无码国产| 亚洲国产精品无码久久久蜜芽 | 久久国产精品二国产精品| 久久国产高清字幕中文| 久久99精品久久久久久不卡| 久久综合视频网站| 亚洲中文精品久久久久久不卡| 狠狠色丁香婷婷综合久久来| 久久国产午夜精品一区二区三区| 久久久这里只有精品加勒比| 大伊人青草狠狠久久| 国产精品久久久久久久久软件| 精品久久久久久无码专区| 久久久艹| 久久青草国产手机看片福利盒子| 蜜桃麻豆WWW久久囤产精品| 国产L精品国产亚洲区久久| 精品久久久无码人妻中文字幕| 国产成人精品久久一区二区三区av| 77777亚洲午夜久久多喷| 国产成人精品久久综合 | 久久人妻AV中文字幕| 久久精品国产一区| 久久天天躁狠狠躁夜夜网站| 亚洲精品视频久久久| 久久久久国产日韩精品网站| 久久99精品国产99久久| 日本强好片久久久久久AAA| 无码人妻久久一区二区三区蜜桃| 久久久久国产日韩精品网站| 色综合久久中文色婷婷| 9久久9久久精品| 99久久精品费精品国产一区二区| 欧美精品久久久久久久自慰| 亚洲中文字幕无码久久2017| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 亚洲AV日韩精品久久久久久久| 九九精品久久久久久噜噜| 一本久道久久综合狠狠躁AV| 久久久久av无码免费网| 欧美精品国产综合久久|