0x01 输入表
实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 10 | |
二进制编辑器 | 010editor | |
样例程序 | PE32 |
实验过程
PE文件偏移0x3C处找到PE头偏移0xB0。
NT头的数据目录表找到导入表的RVA,计算File Offset。
IID数组,每个IID包含一个DLL的描述信息。
第一个字段OriginalFirstThunk,指向一个数组,这个数组的元素全是指针,分别指向引入函数名的ASCII字符串。实际是一种,如果OriginalFirstThunk为0,就要看FirstThunk的情况,它在程序运行时被初始化。
208Ch的FileOffset是68Ch。也就是偏移0x68C处是IMAGE_THUNK_DATA数组,它存储的是指向IAMGE_IMPORT_BY_NAME结构的地址,以一串00结束。
计算的2110h的FileOffset是710h,字符串时LoadIconA。前面一个字是Hint,这是作为函数名(Hint)引用的,可以为0。
第一个IID指向的API函数如表。
在程序运行前,它的FirstThunk字段值也指向一个地址串,而且和OriginalFirstThunk字段值指向的INT重复。系统在程序初始化时根据OriginalFirstThunk的值找到函数名,调用GetProcAddress函数并根据函数名取得函数的入口地址,然后用函数的入口地址取代FirstThunk指向地址串中对应的值。
如图为11个函数的地址。
0x02 输出表
实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 10 | |
二进制编辑器 | 010editor | |
样例程序 | PE32 |
实验过程
定位导出表位置0xC00。
IED结构如下:
- Name:RVA=4032h,FileOffset=C32h,DllDemo.DLL
- AddressOfNames:RVA=402Ch,FileOffset=C2Ch,值为403Eh,故而函数名为MsgBox
- AddressOfFunctions:RVA=4028h,FileOffset=C28h
- AddressOfNameOrdinals:RVA=4030h。FileOffset=C30h。即序号为0x0000。
由于不是序号查询,所以不需要-Base,因此就是第一个序号,AddressOfFunctions指向地址的第一个元素是RVA=4028h,所以MsgBox的RVA=1008h。
0x03 重定位表
实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 10 | |
二进制编辑器 | 010editor | |
样例程序 | PE32 |
实验过程
找到重定位表FOA=0xE00
(16-8)/2,有4组数据,前面两组的FOA是00Fh,和023h。
分别是00402000h和00403030h,执行PE文件前,加载程序进行重定位的时候,会用PE文件在内存中的实际映像地址减PE文件所需求的映像地址,根据重定位类型不同将差值添加到相应的地址数据中。
0x04 资源表
实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 10 | |
二进制编辑器 | 010editor | |
样例程序 | PE32 |
实验过程
FOA=0x4000处是资源起始地址。
后面又三个IMAGE_RESOURCE_DIRECOTRY_ENTRY结构。
最高位为1,还有下一层40h指向第二层目录块。资源块首地址+40h为4040h。
第二层目录中Name字段定义的是资源名称,第一个字节最高位为1,表明是一个指针,指向IMAGE_RESOURCE_DIR_STRING_U结构。OffsetToData最高位是1,说明还有下一层,4088是第三层目录块地址。
第三层目录中0409h表示代码页是英语,由于此时OffsetToData最高位是0,IMAGE_RESOURCE_DATA_ENTRY的结构是40C8h。图标真正的RVA是4400h,大小为5Ah。
文章评论