• 解析资源


    1.资源类型

    #define RT_CURSOR           MAKEINTRESOURCE(1)              //光标
    #define RT_BITMAP           MAKEINTRESOURCE(2)              //位图
    #define RT_ICON             MAKEINTRESOURCE(3)              //图标
    #define RT_MENU             MAKEINTRESOURCE(4)              //菜单
    #define RT_DIALOG           MAKEINTRESOURCE(5)              //对话框
    #define RT_STRING           MAKEINTRESOURCE(6)              //字符串
    #define RT_FONTDIR          MAKEINTRESOURCE(7)              //字体目录
    #define RT_FONT             MAKEINTRESOURCE(8)              //字体
    #define RT_ACCELERATOR      MAKEINTRESOURCE(9)              //加速键
    #define RT_RCDATA           MAKEINTRESOURCE(10)              //未格式化
    #define RT_MESSAGETABLE     MAKEINTRESOURCE(11)              //消息表
    #define DIFFERENCE     11
    #define RT_GROUP_CURSOR MAKEINTRESOURCE((ULONG_PTR)(RT_CURSOR) + DIFFERENCE)    //光标组
    #define RT_GROUP_ICON   MAKEINTRESOURCE((ULONG_PTR)(RT_ICON) + DIFFERENCE)      //图标组
    #define RT_VERSION      MAKEINTRESOURCE(16)                //版本
    #define RT_DLGINCLUDE   MAKEINTRESOURCE(17)                2.

    2.PE资源表组织方式

    共有4级,称为1级目录,2级子目录,3级子目录,4级具体数据

    1级目录按资源类型分类,如光标,菜单,加速键等

    2级子目录按资源id分类

    3级子目录按照资源代码页分类,不同语言的代码页对应不同数据

    4级就是数据,文件了

    3.PE资源分布及其数据结构

    (1). 资源表定位

    位于数据目录中的第3个目录项中, 显示了资源表所在的节的RVA及其大小

    (2) 资源目录头

    typedef struct _IMAGE_RESOURCE_DIRECTORY {
        DWORD   Characteristics;    //必须是0
        DWORD   TimeDateStamp;      //创建资源时间
        WORD    MajorVersion;      //0
        WORD    MinorVersion;      //0
        WORD    NumberOfNamedEntries;  //以名称命名的资源个数
        WORD    NumberOfIdEntries;    //以id命名的资源个数
    //  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
    } IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;

    (3)资源目录项

    紧跟在资源目录后的结构,先按字母升序排列,再按id升序排列

    typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
        union {
            struct {
                DWORD NameOffset:31; 
                DWORD NameIsString:1;
            } DUMMYSTRUCTNAME;
            DWORD   Name;  //最高位如果是1,则指向结构体:IMAGE_RESOURCE_DIR_STRING_U
            WORD    Id;
        } DUMMYUNIONNAME;
        union {    //最高位为0时指向描述资源数据块的指针,为1时指向下一级目录块基址
            DWORD   OffsetToData;
            struct {
                DWORD   OffsetToDirectory:31;
                DWORD   DataIsDirectory:1;
            } DUMMYSTRUCTNAME2;
        } DUMMYUNIONNAME2;
    } IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;

    (4)数据项

    typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
        DWORD   OffsetToData;  //资源数据的RVA
        DWORD   Size;        //资源数据大小
        DWORD   CodePage;      //代码页
        DWORD   Reserved;      //保留字段
    } IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;

    例如:

     这里是一个1级目录的内容是:IMAGE_RESOURCE_DIRECTORY结构和IMAGE_RESOURCE_DIRECTORY_ENTRY结构数组. 

    可以发现IMAGE_RESOURCE_DIRECTORY的的NumberOfNamedEntries为0,NumberOfIdEntries为9,和下面的

    IMAGE_RESOURCE_DIRECTORY_ENTRY结构数组个数相同.根据里面的内容知道该PE文件使用了9种不同的资源

     然后紧接着:

    第2个IMAGE_RESOURCE_DIRECTORY就是2级目录,第3个就是3级目录,第4个就是数据目录

    在2级目录中:

    ...........

    是1级目录中对应资源类型的具体描述 ,3级目录又是2级目录的具体描述,4级目录时3级目录的具体描述

  • 相关阅读:
    python day6
    python day5
    python基础晋级篇
    python基础篇
    初识Python
    if语句
    A22. openstack架构实战-openstack的api
    A21. openstack架构实战-配置三层网络vxlan
    A20. openstack架构实战-虚拟机创建的流程
    A19. openstack架构实战-云主机的冷迁移
  • 原文地址:https://www.cnblogs.com/freesec/p/6677125.html
Copyright © 2020-2023  润新知