下面给出使用地址比较的方法。

HMODULE hModule=GetModuleHandle(NULL);

ULONG size;

PIMAGE_IMPORT_DESCRIPTOR pImport=(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData

                                      (hModule,true,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);

UpdateData();
//获得MessageBoxA的地址。
PROC pfnOld=GetProcAddress(GetModuleHandle("User32.dll"),"MessageBoxA");

   
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)

   {

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

     if(*ppfn==pfnOld)pfnOld为要查询的函数地址。

      {

      MessageBox("找到给定的函数");

       return ;

     }

    pThunk++;

  }

   pImport++;

}
 


  当然以上仅仅是找到相应的函数。要用我们期望的函数代替它,还需要我们自己定义函数。

  此处有一点要特别注意,当我们对某函数进行拦截时,要替换的函数必须与被替换的函数的原型完全相同。

  比如此时我们要对MessageBoxA进行拦截,我们定义自己的函数的原型与MessageBoxA原型是完全一致的:

int WINAPI MyMessageBoxA(HWND hWnd,LPSTR  str,LPSTR caption ,UINT type)

{

     //定义函数的行为。

}
 


  我们可以在函数中调用被拦截的函数,也可以不对拦截的函数进行调用而进行其他操作。

  注意:在拦截后,原来的函数地址已经被我们自定义的函数的地址覆盖,如果之后需要调用被拦截的函数,必须在覆盖之前保存被拦截函数的地址。如果我们没有保存而直接调用,调用的只是替换后的函数。