百度空间 | 百度首页 
 
查看文章
 
自己写的一个GetProcAddress【转载】
2009-03-04 01:51
DWORD GetFunctionAddress( HMODULE phModule,char* pProcName )
{
if (!phModule)
  
return 0;
PIMAGE_DOS_HEADER pimDH
= (PIMAGE_DOS_HEADER)phModule;
PIMAGE_NT_HEADERS pimNH
= (PIMAGE_NT_HEADERS)((char*)phModule+pimDH->e_lfanew);
PIMAGE_EXPORT_DIRECTORY pimED
= (PIMAGE_EXPORT_DIRECTORY)((DWORD)phModule+pimNH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
DWORD pExportSize
= pimNH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
DWORD pResult
= 0;


if ((DWORD)pProcName < 0x10000)
{
  
if ((DWORD)pProcName >= pimED->NumberOfFunctions+pimED->Base || (DWORD)pProcName < pimED->Base)
   
return 0;
   pResult
= (DWORD)phModule+((DWORD*)((DWORD)phModule+pimED->AddressOfFunctions))[(DWORD)pProcName-pimED->Base];
}
else
{
   DWORD
* pAddressOfNames = (DWORD*)((DWORD)phModule+pimED->AddressOfNames);
  
for (int i=0;i<pimED->NumberOfNames;i++)
  
{
   
char* pExportName = (char*)(pAddressOfNames[i]+(DWORD)phModule);
   
if (strcmp(pProcName,pExportName) == 0)
   
{
     WORD
* pAddressOfNameOrdinals = (WORD*)((DWORD)phModule+pimED->AddressOfNameOrdinals);
     pResult  
= (DWORD)phModule+((DWORD*)((DWORD)phModule+pimED->AddressOfFunctions))[pAddressOfNameOrdinals[i]];
    
break;
    }

   }

}

if   (pResult != 0 && pResult >= (DWORD)pimED && pResult < (DWORD)pimED+pExportSize)
{
  
char* pDirectStr = (char*)pResult;
  
bool pstrok = false;
  
while (*pDirectStr)
  
{
   
if (*pDirectStr == '.')
   
{
     pstrok
= true;
    
break;
    }

    pDirectStr
++;
   }

  
if (!pstrok)
   
return 0;
  
char pdllname[MAX_PATH];
  
int   pnamelen = pDirectStr-(char*)pResult;
  
if (pnamelen <= 0)
   
return 0;
   memcpy(pdllname,(
char*)pResult,pnamelen);
   pdllname[pnamelen]
= 0;
   HMODULE phexmodule
= GetModuleHandle(pdllname);
   pResult
= GetFunctionAddress(phexmodule,pDirectStr+1);
}


return pResult;
}


类别:代码杂谈 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu