欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

PE文件格式学习小结 之 文件偏移地址计算器功能的实现

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。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功