如何从PIMAGE_EXPORT_DIRECTORY节,得到某个API函数代码地址

//功能:得到某个API函数代码地址
//参数://hModule: 导入模块的句柄(如user32.dll模块的句柄,GetModuleHandle("user32.dll"))
//pProcName: 函数名或序号
const FARPROC GetExportFunctionFARPROC(HMODULE hModule, LPCSTR pProcName)
{
 PIMAGE_EXPORT_DIRECTORY pExport = (PIMAGE_EXPORT_DIRECTORY)
  GetDirectory(IMAGE_DIRECTORY_ENTRY_EXPORT);
 
 if ( pExport==NULL )
  return NULL;
 
 unsigned ord = 0;
 
 if ( (unsigned) pProcName < 0xFFFF ) // ordinal ?
  ord = (unsigned) pProcName;
 else
 {
  const DWORD * pNames = (const DWORD *) RVA2Ptr(pExport->AddressOfNames);
  const WORD  * pOrds  = (const WORD  *) RVA2Ptr(pExport->AddressOfNameOrdinals);
  
  // find the entry with the function name
  for (unsigned i=0; i<pExport->AddressOfNames; i++)
   if ( stricmp(pProcName, RVA2Ptr(pNames[i]))==0 )
   {
    // get the corresponding ordinal
    ord = pExport->Base + pOrds[i];
    break;
   }
 }
 
 if ( (ord<pExport->Base) || (ord>pExport->NumberOfFunctions) )
  return NULL;
 
 // use ordinal to get the address where export RVA is stored
 const char * pModule = (const char *) hModule;
 DWORD * pRVA = (DWORD *) (pModule + pExport->AddressOfFunctions) +
  ord - pExport->Base;
 
 // read original function address
 DWORD rslt = * pRVA;
 
 return (FARPROC) (pModule + rslt);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值