导入表
导入表简述
目的:为实现代码重用而设置的。
一个PE文件调用了多少外来函数,以及这些外来函数都存在于那些动态链接库DLL里等信息。
注:
PE到这里套娃就很晕了(本人实在太笨,看了很多遍才理顺,相信应该没有比我更笨的了,参考一些资料也思维都跳的比较厉害或缺这少那的,所以还是想把PE的汇总分享大家, 希望以下内容能帮助大家快速理清思路及共同喜欢研究这方面入门的朋友们少走弯路)。
调用一个外部函数流程
这里涉及导入表 和 IAT(导入函数地址表),它们分别是数据目录的第2项和第13项。
借助一个工具peinfo便能迅速定位。
导入表中涉及的数据结构
总览结构全局流程导向(这图要牢牢映入脑中)
吐槽一下:
鬼知道我画了多久!!
IMAGE_THUNK_DATA(这真是个理解大坑)
这句才是本质:
后面又给出里面具体定义(我是满脑子问号,还不如不给,跟简单话说复杂一样,里面内容我感觉是没什么用,如果有理解这个朋友请指教)
导入表描述符IMAGE_IMPORT_DESCRIPTOR结构信息
IMAGE_IMPORT_DESCRIPTOR STRUCT
union
Characteristics dd
OriginalFirstThunk dd ;000h - 桥1
ends
TimeDateStamp dd ;0004h - 时间表
ForwarderChain dd ;0008h - 链表的前一个结构
Name1 dd ;000ch - 指向链接库名字的指针
FirstThunk dd ;0010 - 桥2
IMAGE_IMPORT_BY_NAME
IMAGE_IMPORT_BY_NAME STRUCT
Hint dw ?;0000h -函数编号
Name1 db ?;0004h -表示函数名的字符串
IMAGE_IMPORT_BY_NAME ENDS
查看IAT和导入表并分析
1.得到导入表和导入地址表RVA和SIZE,同时转换成FOA
#导入表RVA = 0X2010
#导入表大小 = 0X3C
#导入函数地址表=0X2000
#导入函数地址表大小=0X10
转换成FOA
#导入表FOA = 0X610
#IAT = 0X600
导入表:每二十个字节描述一个引用DLL库相关函数信息。
分别是以下三组数据(磁盘和加载内存中的数据是一样的)
第一组DLL信息
第二组DLL信息
第三组是结束的标志
有工具就要充分利用,这里是上面3组数据转换成对应结构里面的内容。
证明(磁盘中)桥一和桥二最终指向一样
RVA = 0X205C
FOA=0X65C 即 hint / 函数名 内容
证明(加载内存中)桥一不变,桥二中地址操作系统填入函数真实地址
双桥结构存在的原因?
正是由于加载后,桥二IAT表中填入了真正的函数地址,如果你再想通过函数地址名字找到函数名,这时便时桥一INT表起作用的时候了。(INT起到为函数名备份的作用)