• PE文件格式详解(四)


    0x00 前言

      上一篇介绍了区块表的信息,以及如何在hexwrokshop找到区块表。接下来,我们继续深入了解区块,并且学会文件偏移和虚拟地址转换的知识。

    0x01 区块对齐值

      首先我们要知道啥事区块对齐?为啥要区块对齐?这个问题其实困扰了我很久,只能怪我操作系统没学好。。。我现在的理解是由于内存和磁盘存在分页的问题所以使得不同区块一般要放到不同的分页中,当然也可以多个区块合并以节省空间,但是对于不能合并的区块如代码和数据块就不得不放在不同分页上了。学过操作系统的都知道不管是磁盘和内存分页都是一个大学问。由于不同块放在不同分页,其实这个对齐值就是分页的整数的值。至于为啥要区块对齐,这也是有分页导致的。下图为PE文件加载映射示意图:

     根据上图我们知道PE文件有两个对齐值,一个是磁盘的对齐值,一个是内存中的对齐值。

    1)磁盘中对齐值是定义在PE文件头中的FileAligament中。每一块区块从对齐值倍数位置开始存放,对于没有填满的部分会用0填充。这些0构成了区块间隙。例如:对齐值为200h,一个区块大小位50h,它从400h开始存放,直到450h结束,其后的450h600h就用0填充。

    2)内存的对齐值和磁盘差不多。它是定义在PE文件头的SectionAligaments中。它也是从一个对齐值整数倍开始存放,未填满的用0填充。

    0x01 文件地址和虚拟地址转换

      首先为啥要转换?由上图可知,其实主要是是因为PE文件加载后它在磁盘和内存中的地址是不一样的。我们一般都能抓取他在内存中的值,然后根据内存中的值(叫虚拟地址)来逆推出它在磁盘中的位置。这样我们也能判断PE加载后到底调用了系统中哪些函数。下图展示了各个地址间的关系:

    这里的FileOffset就是我们要找的各个区块在磁盘中的位置。

    由于同一区块内FileOffset和相对地址RAV之间的值是一定的。比如.text区块中的FileOffsetRVA之间都是0c00h,用k表示他们之间的差值。就有公式FileOffset=RAV-K,一般情况下都是由RVAFileOffset

    举个例子:某个PE文件载入后读出的虚拟地址VA值为401112hImageBase值为400000hk的值为0c00h,求它的文件的FileOffset值。

       RAV=VA-ImageBse=401112h-400000h=11112h

       FileOffset=RVA-k=11112h-0c00h=512h

  • 相关阅读:
    設計模式學習(一)觀察者模式(Observer)
    JavaScript對Table進行排序(jQuery)
    一个很好的String组合连接的方法(StringBuffer)
    关于C#静态构造函数的几点说明 (轉載)
    在DataGrid中添加序號
    C# 对象深拷贝、浅铐贝、直接拷贝(转)
    在做數據插入時,傳參數應該注意的小細節!
    JavaScript檢驗時間格式
    獲得鼠標位置(js)
    my tools
  • 原文地址:https://www.cnblogs.com/2f28/p/9818333.html
Copyright © 2020-2023  润新知