最近刚刚接触了PE文件格式,仔细学了一下,写了一个简单的分析工具,奉上源码,希望大家多多交流,不吝赐教!
部分预览:
代码:
//输出重定位信息 PIMAGE_BASE_RELOCATION pBaseReloc; if (pOptHeader->DataDirectory[5].VirtualAddress) { printf("===========IMAGE_BASE_RELOCATION=============="); pBaseReloc = (PIMAGE_BASE_RELOCATION)((LPBYTE)lpBaseAddr+RvaToOffset(pOptHeader->DataDirectory[5].VirtualAddress)); } else{ printf("NO RELOC TABLE!\n"); pBaseReloc = 0; } while (pBaseReloc && pBaseReloc->VirtualAddress) //判断是否到了重定位表的末尾 { //打印当前分配表的基址和大小 printf("Base:0x%08x,SizeOfBlock:%0x\n",pBaseReloc->VirtualAddress,pBaseReloc->SizeOfBlock); for (unsigned int i=8;i<pBaseReloc->SizeOfBlock;i+=2){ WORD wRelocData = *(LPWORD)((LPBYTE)pBaseReloc+i); if (!wRelocData) continue; DWORD RvaData = (wRelocData&0xFFF)+pBaseReloc->VirtualAddress; printf("0x%04x 0x%04x 0x%08x==>0x%08x\n",wRelocData,wRelocData&0x0FFF,RvaData,*(LPDWORD)(RvaToOffset(RvaData)+(DWORD)lpBaseAddr)); } //pBaseReloc指向下一个分配表 pBaseReloc =(PIMAGE_BASE_RELOCATION) ((LPBYTE)pBaseReloc+pBaseReloc->SizeOfBlock); }
今天仔细看了一下,发现了一个问题,有些程序(如何win7自带的记事本、explorer.exe等等)的IMAGE_IMPORT_DESCRIPTOR中的 OrignalFirstThunk和FirstThunk都不为零,但是所最终指向的位置不是同一个Image_Import_By_name数据结构,不知道怎么发生的?请教各位!