• PE文件之资源讲解


    资源是PE文件中非常重要的部分,几乎所有的PE文件中都包含资源,与导入表与导出表相比,资源的组织方式要复杂得多,要了解资源的话,重点在于了解资源整体上的组织结构。

    我们知道,PE文件资源中的内容包括:光标、图标、位图、菜单等十几种标准的类型,除此之外,还可以使用自定义的类型,每种类型的资源中,可能存在多个资源项,这些资源项用不同的ID或者名称来分辨,在某个资源ID下,还可以同时存在不同代码页的版本。

    PE文件中资源的组织方式

     

    资源的组织方式

    1. 获取资源的位置
    2. 资源目录
    3. 资源数据入口

    我们怎么获取资源的位置呢?

    我们可以在IMAGE_OPTIONAL_HEADER32结构的数据目录字段中获取,数据目录中的第三个IMAGE_DATA_DIRECTORY结构便是资源的定义,从这个结构的VirtualAddress得到的就是资源块地址的RVA值。

    什么是资源目录?

    我们应该了解的是:不管是根目录,还是第二层,第三层目录,每个目录都是由一个IMAGE_RESOURCE_DIRECTORY结构与紧跟后面的数个IMAGE_RESOURCE_DIRECTORY_ENTRY结构组成,这两种结构一起构成了一个目录快。

    IMAGE_RESOURCE_DIRECTORY的定义如下:

    在这个结构中最重要的是最后两个字段,两者相加的结果就是IMAGE_RESOURCE_DIRECTORY_ENTRY的数量结果。

    现在来介绍一下IMAGE_RESOURCE_ENTRY结构,每个这种结构描述了一个目录项,其定义如下:

    当Name1字段作为ID使用时,是可以存放一个双字的。但是,当Name1字段作为字符串使用时,一个双字是远远不够的,这样的话,那么,我们就只有在这里定义一个字符串的指针了。针对这两种情况,我们怎么来定义呢?定义的方法是:使用该字段的最高位(第31位)来区分这两种情况。当第31位是0时,表示字段的值作为ID来使用;当第31位为1时,字段的低位作为字符串指针来使用。但由于资源名称字符串是使用Unicode来编码的,所用这个指针并不直接指向字符串,而是指向一个IMAGE_RESOURCE_DIR_STRING_U的结构,这个结构包含Unicode字符串的长度与字符串本身。IMAGE_RESOURCE_DIR_STRING_U的定义如下:

    什么是资源数据入口呢?

    IMAGE_RESOURCE_DATA_ENTRY结构描述了资源数据所处的位置和大小,换句话说就是:我们终于得到了某个资源的详细信息。这个结构就是资源数据的入口。

    其定义如下:

  • 相关阅读:
    抽象工厂
    组合和继承
    Mysql 设置远程连接
    websocket
    redis 持久化
    django urls
    git gitignore
    Mysql 系统表
    cudnn升级之后caffe无法训练的问题
    python numpy初始化一个图像矩阵
  • 原文地址:https://www.cnblogs.com/milantgh/p/3969532.html
Copyright © 2020-2023  润新知