我喜欢你检查导入和导出目录的结构(IMAGE_DIRECTORY_ENTRY_EXPORT、IMAGE_DIRECTORY_ENTRY_IMPORT、IMAGE_DIRECTORY_ENTRY_IAT 和IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT),从那时起我打开了一个旧项目。我可以简单地解释你有问题的部分。我的意思是如何在 PE 内部找到指向例如 IMAGE_EXPORT_DIRECTORY 的指针的部分。
首先,可以使用读/写文件操作来分析PE文件,但使用文件映射要容易得多,如下所示:
hSrcFile = CreateFile (pszSrcFilename, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL);
hMapSrcFile = CreateFileMapping (hSrcFile, NULL, PAGE_READONLY, 0, 0, NULL);
pSrcFile = (PBYTE) MapViewOfFile (hMapSrcFile, FILE_MAP_READ, 0, 0, 0);
在我们有了指向PE文件的指针pSrcFile之后,我们可以在PE内部找到另一个重要的地方:
pDosHeader = (IMAGE_DOS_HEADER *)pSrcFile;
IMAGE_NT_HEADERS32 *pNtHdr = (IMAGE_NT_HEADERS32 *)
((PBYTE)pDosHeader + pDosHeader->e_lfanew);
IMAGE_SECTION_HEADER *pFirstSectionHeader = (IMAGE_SECTION_HEADER *)
((PBYTE)&pNtHdr->OptionalHeader +
pNtHdr->FileHeader.SizeOfOptionalHeader);
现在我们已经有了所有需要的任何目录的虚拟地址。例如,
pNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress
是导出目录的虚拟地址。之后要将虚拟地址转换为内存指针,我们应该找出PE里面有这个虚拟地址的部分。为此,我们可以枚举 PE 的部分并找到大于或等于 0 且小于 pNtHdr->FileHeader.NumberOfSections 的 i,其中
pFirstSectionHeader[i].VirtualAddress <=
pNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress
同时
pNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress
< pFirstSectionHeader[i].VirtualAddress + pFirstSectionHeader[i].Misc.VirtualSize
那么你应该在pFirstSectionHeader[i]部分搜索导出数据:
IMAGE_SECTION_HEADER *pSectionHeader = &pFirstSectionHeader[i];
IMAGE_EXPORT_DIRECTORY *pExportDirectory =
(IMAGE_EXPORT_DIRECTORY *)((PBYTE)pbyFile + pSectionHeader->PointerToRawData +
pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress -
pSectionHeader->VirtualAddress);
您应该重复相同的过程来查找对应于IMAGE_DIRECTORY_ENTRY_IMPORT 的(IMAGE_IMPORT_DESCRIPTOR *) 和对应于IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 的(IMAGE_BOUND_IMPORT_DESCRIPTOR *),以转储包含绑定信息(如果存在)的导入信息。
要转储来自IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT(对应于delayimp.h 中定义的(ImgDelayDescr *))的信息,您还应该使用来自IMAGE_DIRECTORY_ENTRY_IAT(对应于(IMAGE_THUNK_DATA32 *))的信息。
关于PE的更多信息我推荐你http://msdn.microsoft.com/en-us/magazine/cc301808.aspx