PE文件格式学习小结 之 文件偏移地址计算器功能的实现
【文章标题】: 谈一下LoadPE的FLC功能的编程实现
【文章作者】: 美丽の破船
【作者邮箱】: juxingting@163.com
【作者主页】: http://hi.baidu.com/juxingting
【编写语言】: C/C++
【操作平台】: XP + VC6.0
【作者声明】: 学PE文件格式的练习程序,发出来供象我一样菜的朋友共同进步!程序实现的算法很笨,往高手指教!
【详细内容】:
LoadPE的功能强大想必是众所周知的!
小弟我最近在学习PE文件格式,为了巩固自己的所学,我也在模仿LoadPE的PE编辑器功能!
昨天,我把它的FLC功能给实现了,个人认为收获不小,颇为激动。
在失眠了一夜之后,终于耐不住、来发帖子,与大家分享我的所得!(说不定,再让我骗来个精华~
)
程序用的是最笨的方法,外加笨人比较愚笨,代码写的也罗嗦无比!故高手飘过~~~
闲话不说了,说主题:
在学习《加密与解密》(第二版)的时候,书里说的根据RVA计算文件偏移的方法如下:
1、先遍历区段表中每个区段的Virtual Offset得到每个节的起始RVA,并根据SizeOfRawData属性得到每个节的结束RVA
2、再根据第一步的结果判断要转换的RVA属于哪个区段内
3、然后根据区段表中相应区段的Virtual Offset和Raw Offset的值来计算出每个区段中,它们两个的差值:△k
4、最后就可以根据公式转换了!
RVA = VA - ImageBase;
File Offset = RVA - △k;
可是怎么根据File Offset来计算RVA就不知道怎么办了~~
随着我对PE文件结构的了解越来越深,慢慢的我才知道:节的PointerToRawData属性就是它在文件中的偏移地址!
这样一来,它们之间转换的方法就变成了:
1、先遍历区段表中每个区段的Virtual Offset得到每个节的起始RVA,并根据SizeOfRawData属性得到每个节的结束RVA
2、再根据第一步的结果判断要转换的RVA属于哪个区段内
3、然后用要转换的RVA - 它所在的起始RVA 得到 这个RVA位于起始RVA的偏移RVA'
4、最后取出它所在段的PointerToRawData属性值加上上一步算出来了RVA' 便得到它的文件偏移地址了!
从文件偏移转换到RVA的方法也可想出来了,只不过是把上面的方法倒过来就可以了~~~
下面我给出我写的代码:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
