声明:因为pe文件已经学过,所有有很多重要东西没写上,只写了点之前不会的,仅供自己复习,有意者看。
PE文件结构:windows操作系统下的可执行文件的结构。
pe文件结构由为头部,和区块两部分组成。
pe文件的大致框架结构:
pe文件从磁盘加载到内存时会分配4GB虚拟地址,在磁盘上的结构与内存中的结构是一一对应的,程序运行时内存中拉伸了一点。
虚拟地址:j加载到内存的地址
基址:imagebase
相对地址虚拟:偏移
虚拟地址=基质+相对虚拟地址
DOS头:是古老的16位的操作体统,微软为了兼容16位程序的运行,把DOS头放在了pe文件2框架的头部。
重要属性:MZ标志 pe文件跳转
标准pe头:
重要属性:numofsection:文件区的块数
timDataStamp:时间戳
sizeofoptionhead:可选pe头大小
可选pe头:
重要属性:addressofentorypoint:(RVA)相对虚拟地址
imagebase; 数据开始执行位置
sizeofhead:头尺寸大小
区块表:
重要属性:vituraladdress (RVA)区段相对偏移地址
pointRawData:在文件中偏移地址
sizeofRvaData:在文件中的对其大小
链接库
把库文件打包成一个二进制文件
静态链接库(引用文件,利用):
在生成可执行文件之前,已经把所有的链接操作完成。
缺点:直接把二进制文件编译到exe文件中,不便于更改
动态链接库(提供给函数)
在程序执行的时候进行链接(生成的.dill文件,属于在单独在一个模块,如要进行某功能的修改,只需要修改.dill文件即可),对应的库文件称为动态链接库。
记载dill方法
1.显示·链接:使用时加载,用完释放。
2.隐式链接:一开始程序启动时加载,程序结束释放。
区别:静态链接库因为在程序运行之前就已经链接,,所以·可以独立运行。,而动态链接库生成的可执行文件在运行时才会链接所引用的外部地址,所以不能独立运行。
输入表(导入表):保存函数名和有关dill信息
每个dill都存放函数地址
IAT:相当于RVA相对虚拟地址
操作找函数所在地址
跳转到该地址,找到函数名
输入表位于数据目录表的第二个位置
我们可以找到他在文件中的位置,virturaladress是相对位置(RVA)通过工具即可找到输入表所在位置
输入表大体结构:
寻找dill(IAT)名字
寻找函数(IAT)名字
根据最后一个属性:FIrstTRunk
找到名称地址
继续转换该地址
即可找到函数名地址
大概流程: