实验环境:Windows 10,LordPE,PEView
PE文件结构:PEview打开PE文件,可观察到PE文件的结构,由MZ文件头、DOS插桩程序、节表头、节(.text,.rdata,.data,.idata,.reloc)组成。
- PE文件被执行后,PE装载器首先检查MZ头及DOS头是否有签名,从而判定该PE文件是否有效,再读入PE头的总体信息,接着读取节表中的节信息,映射至内存,再根据PE文件中的导入表(IT)读取INT表和IAT表,INT表是存储函数名称、DLL名称信息,IAT表存储函数偏移地址等。PE文件运行时,从INT加载信息,把动态函数地址写入IAT中。
。这几个表都在.idata节中,通过LordView可查找出.idata的节偏移,如下图所示:
可计算出.idata节偏移 = 00030000 - 00001000 = 2F000
再查看IT表的RVA:00030000,IAT表的RVA:00030178
此时可根据LordPE查看IT表在文件中的偏移地址:0002E000,IAT表的文件偏移地址为:0002E178。
与PEView中的结果相符:
此处计算出来的节偏移:00030000 - 0002E000 = 2000,00030178 - 0002E178 = 2000与前面所查到的.idata的节偏移(00030000 - 00001000 = 2F000)不符,这里初步判定前面所查询到的节偏移有误(各节表在文件中的偏移地址不是按照递增顺序,且不同节表有相同地址的冲突,因此判断其有误),因此确定.idata的节偏移为2000。
对于IAT表的函数地址也一致,如下图,ExitProcess函数的RVA为:000302C8,根据节偏移为2000,可计算出其在文件中的偏移地址为:002E2C8,与LordPE中结果相符。
由此可进一步确定文件偏移地址 = RVA - 节偏移。