zoukankan      html  css  js  c++  java
  • 解析资源

    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级目录的具体描述

  • 相关阅读:
    服务器状态码
    QuerySet中添加Extra进行SQL查询
    django配置一个网站建设
    MySQL数据库查询中的特殊命令
    125. Valid Palindrome
    121. Best Time to Buy and Sell Stock
    117. Populating Next Right Pointers in Each Node II
    98. Validate Binary Search Tree
    91. Decode Ways
    90. Subsets II
  • 原文地址:https://www.cnblogs.com/freesec/p/6677125.html
Copyright © 2011-2022 走看看