以下代码将对MessageBox的调用进行拦截,并用我们的自定义函数MyMessageBox替代。

  g_addr用于存储拦截之前MessageBox的地址

Typedef int (WINAPI *PFNMESSAGEBOX(HWND,LPSTR,LPSTR,UINT);//定义函数指针。

 PFNMESSAGEBOX g_addr=(PFNMESSAGEBOX)MessageBoxA;//存储MessageBoxA的地址。

//自定义的函数。

int WINAPI MyMessage(HWND hWnd,LPSTR a,LPSTR b,UINT type)

{

     return ((PFNMESSAGEBOX)g_addr)(hWnd,a,"替换后的函数!?",MB_YESNO);

}

//对 MessageBox进行拦截,用MyMessageBox进行替换。

Void ReplaceOneFunc(PCSTR ModuleName,PFNMESSAGEBOX pfnOld,PFNMESSAGEBOX pfnNew)

{

     pfnOld=(PFNMESSAGEBOX)MessageBoxA;

     pfnNew=(PFNMESSAGEBOX)MyMessageBox;

     HMODULE hModule=GetModuleHandle(NULL);

     ULONG size;

     PIMAGE_IMPORT_DESCRIPTOR pImport=(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData

                                                                      (hModule,true,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);

     UpdateData();

     while(pImport->FirstThunk)

     {

        char *ModuleName=(char*)((BYTE*)hModule+pImport->Name);

        PIMAGE_THUNK_DATA pThunk=(PIMAGE_THUNK_DATA)((BYTE*)hModule+pImport->FirstThunk);

        while(pThunk->u1.Function)

        {

          PFNMESSAGEBOX *ppfn=(PFNMESSAGEBOX*)&(pThunk->u1.Function);

          if(*ppfn==pfnOld)

          {

             MessageBox("找到函数!恭喜你!");

             SIZE_T num;

             WriteProcessMemory(GetCurrentProcess(),ppfn,&pfnNew,4,&num);

             MessageBox(NULL,"现在调用的是替换后的API!","",MB_OK);

             ((PFNMESSAGEBOX)g_addr)(NULL,"哈哈,现在终于轮到你了","",MB_OK);

            return ;

         }

        pThunk++;

      }

    pImport++;

    }

    MessageBox("没有找到该函数!");

 }
 


  WriteProcessMemory(GetCurrentProcess(),ppfn,&pfnNew,4,&num);

  此函数用于修改内存。实现用MyMessagebox的地址替换MessageBox的地址。关于此函数的功能请参考MSDN。

  ((PFNMESSAGEBOX)g_addr)(NULL,"哈哈,现在终于轮到你了","",MB_OK);

  此句用于调用在拦截之前MessageBox的地址。此处的调用是调用的MessageBox函数,而不是MyMessageBox函数。

  至此关于修改导入段拦截API介绍完毕。