WEB开发网
开发学院软件开发VC PE文件格式详解(下) 阅读

PE文件格式详解(下)

 2006-07-20 11:43:35 来源:WEB开发网   
核心提示: 以下的函数示范了如何获得指定模块的所有函数名, // PEFILE.Cint WINAPI GetImportFunctionNamesByModule(LPVOID lpFile, HANDLE hHeap,char *pszModule, char **pszFunctions){PI

以下的函数示范了如何获得指定模块的所有函数名。 // PEFILE.C
int WINAPI GetImportFunctionNamesByModule(LPVOID lpFile, HANDLE hHeap,
  char *pszModule, char **pszFunctions)
{
 PIMAGE_IMPORT_MODULE_DIRECTORY pid;
 IMAGE_SECTION_HEADER idsh;
 DWORD dwBase;
 int nCnt = 0, nSize = 0;
 DWORD dwFunction;
 char *psz;
 /* 定位.idata段的头部 */
 if (!GetSectionHdrByName(lpFile, &idsh, ".idata"))
  return 0;
 pid = (PIMAGE_IMPORT_MODULE_DIRECTORY)ImageDirectoryOffset
   (lpFile, IMAGE_DIRECTORY_ENTRY_IMPORT);
 dwBase = ((DWORD)pid. idsh.VirtualAddress);
 /* 查找模块的pid */
 while (pid->dwRVAModuleName && strcmp (pszModule,
   (char *)(pid->dwRVAModuleName+dwBase)))
  pid++;
 /* 如果模块未找到,就退出 */
 if (!pid->dwRVAModuleName)
  return 0;
 /* 函数的总数和字符串长度 */
 dwFunction = pid->dwRVAFunctionNameList;
 while (dwFunction && *(DWORD *)(dwFunction + dwBase) &&
   *(char *)((*(DWORD *)(dwFunction + dwBase)) + dwBase+2))
 {
  nSize += strlen ((char *)((*(DWORD *)(dwFunction +
   dwBase)) + dwBase+2)) + 1;
  dwFunction += 4;
  nCnt++;
 }
 /* 在堆上分配函数名称的空间 */
 *pszFunctions = HeapAlloc (hHeap, HEAP_ZERO_MEMORY, nSize);
 psz = *pszFunctions;
 /* 向内存指针复制函数名称 */
 dwFunction = pid->dwRVAFunctionNameList;
 while (dwFunction && *(DWORD *)(dwFunction + dwBase) &&
  *((char *)((*(DWORD *)(dwFunction + dwBase)) + dwBase+2)))
 {
  strcpy (psz, (char *)((*(DWORD *)(dwFunction + dwBase)) +
    dwBase+2));
  psz += strlen((char *)((*(DWORD *)(dwFunction + dwBase))+
    dwBase+2)) + 1;
  dwFunction += 4;
 }
 return nCnt;
}
  
就像GetImportModuleNames函数一样,这一函数依靠每个信息列表的末端来获得一个置零的入口。这在种情况下,函数名称列表就是以零结尾的。

上一页  4 5 6 7 8 9 10  下一页

Tags:PE 文件 格式

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接