PE头-关于导入表的计算
我们使用01Editor观察任意标准程序,比如笔记本notepad.exe。
在节NTHeader的DataDirArray的Import
我们得到
记录导入表的RVA:7604H。
虽然记录在VritualAddress的字段中但是值为RVA。
那么怎么得到导入表呢?
- 判断RVA所处的节并获取节的ViatualAddress
- 计算RVA与RVA所处的节的ViatualAddress的偏移值
- 计算偏移值+RVA所处的节的PointerToRawData并得到导入表的位置
第一步,我们要判断RVA所处的节的位置,这个过程是
判断SectionHeader节点的VirtualAddress+SizeofRawData大于等于RVA。
当某个节点成立时,RVA则属于这个节。
本文中则是属于第一节也就是下标为0的SechitonHeaders【0】
第二步,计算偏移值
这个偏移值为RVA-VirtualAddress
在本文中则为
7604h-1000h=6604h
第三步 计算文件位置
偏移值+PointerToRawData即为文件位置
6604h+400h=6A04h
这个值就是导入表的结构体的值
那么如何计算具体使用了什么函数呢呢?
我们来计算一下INT的算法吧。
我们已INT为例,也就是Import Name Table的缩写。意思是导入了什么函数。
OriginalFirstThunk这个字段的值是RVA,指向一个import by name的结构体。这个结构体中有俩个字段,第一个字段就是固有编号,长度为两个字节。第二个是字段是代表名字的数组,长度是比特数组。
那么怎么得到这个import by name的结构体?
还是一样重复上面计算导入表的过程。
也即是
1 判断RVA的节 =>0节
2 偏移值=>7990h-1000h=6990h
3 计算文件位置= >6990h+400h=6D90h
我们跳转到6d90这个位置,这个位置的值指向import by name的结构体,所以我们还要重复一次上述计算的过程=》7A7A-1000+400=6E7A
这样我们就计算完成了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现