PE6.0格式研究 (6)

作者:陆麟
转载请征得作者同意.
1999.9.13



typedef struct {
 PEIMAGE_DATA_DIRECTORY ExpTbl; //Export Table RVA and size
 PEIMAGE_DATA_DIRECTORY ImpTbl; //Import ..................
 PEIMAGE_DATA_DIRECTORY ResTbl; //Resources ...............
 PEIMAGE_DATA_DIRECTORY ExcptTbl; //Execption ...........
 PEIMAGE_DATA_DIRECTORY CrtfTbl; //Certificate .........
 ......
}_IMG_DATA_DIR,*pIMG_DATA_DIR;

这个结构是上次就公开了的.想来还有部分东西要讲解.
ExpTbl如果存在的话,将是一个.data SECTION的RVA. RVA是相对于HMODULE的偏移.例如RVA 1000H,HMOD为400000,实际内存里的地址为401000H.使用RVA的原因是为了在MODULE重定位时减少麻烦.有关SECTION的概念将在以后讲到.因为接下来要写的结构就是有关SECTION的.
ImpTbl如果存在,将指向.idata节.同样也是RVA.还有TLSTBL等,都是RVA.
强调是RVA就意味者他们并不一定是相对于文件开始的偏移.当然,在实际编程中,90%的情况下RVA其实和文件偏移是相等的.但是,由于文件对齐和内存定位对齐可能不同,而且CPU的页对齐和文件对齐也并不一定相同,所以,在实际编程中一定要将RVA-SECTION RAW DATA后得出的偏移才是正确的偏移.
单纯地得到COFF OPTIONAL HEADER里的RVA是没有用的.因为他不是文件内部的指针.所以尽管PE文件头提供了这些信息,这些信息却只有在PE文件被映射到进程的地址空间里才有用.说到这里,另外要说的就是.HMOD所指向的数据结构其实就是这里公开的所有的数据结构加上以后要讲的SECTION结构.

这回就说到这里,且听下会分解.