https://www.bpsend.net/thread-411-1-1.html

资源表

  • 资源的管理方式采用windows资源管理器目录的管理方式,一般有三层目录。
  • 根目录 结构体IMAGE_RESOURCE_DIRECTORY:描述名称资源和ID资源各自的数量,不描述文件。资源本质都是二进制数据,光标图标是图片有自己的文件格式,字符串什么的需要编译后写进文件,对话框是资源脚本,在rc里。在rc里对话框是一堆字符串,编译器解析字符串后显示出来的,操作系统可以根据文本字符串来创建对话框,但由于需要解析语法效率很低。为了提高效率使用资源编译,将文本字符串生成二进制,用结构体来描述,读资源时将对应数据强转成结构体就完事了。链接时会把res所有二进制数据插入PE文件里。
    • 第一层目录描述了资源类型,一般只有目录,以RT_开头的一组宏分类。
    • 第二层目录指向各类资源ID。如果是图标类型的资源,每种分辨率都会占一个ID。目录项数由资源目录的数量字段控制。
    • 第三层目录再进去之后就是指向资源数据(即代码页)了,一般只会有一项。
  • 在PE里为了更快的找到资源,有一些组织方式。正常情况下所有资源数据都会在.rsrc里。
  • 流程:根目录 - 资源类型 - 资源ID - 资源数据。
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 

// 根目录 - 资源目录 - 名称资源和ID资源各自的数量
typedef struct _IMAGE_RESOURCE_DIRECTORY {
DWORD Characteristics;  // 属性
DWORD TimeDateStamp;    // 时间戳
WORD MajorVersion;      // 主版本号
WORD MinorVersion;      // 子版本号,前12字节无用 WORD NumberOfNamedEntries; // 按照名称命名的资源数量,一般都是0
WORD NumberOfIdEntries; // 按照ID命名的资源数量,编译器默认编译的一般都是序号
// IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; // 柔性数组,项数为上两者之和
} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY; // 第二层目录 - 表项,大小8字节
typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY { //四个字节最高位是1那么资源的id是字符串,低31位是偏移(指向一个结构体)
//,如果是0 资源id是数值 ,低16位就是id值  
union { 
    struct { // 四字节共用体,资源ID(类型)/名称
        DWORD NameOffset:31;    //位段低31位
        DWORD NameIsString:1;   //位段最高位
        } DUMMYSTRUCTNAME;
        DWORD Name;             // 最高位为1,用这个字段解析,低31位指向名称的节内偏移
        WORD Id;                // 最高位为0,用这个字段解析,低两位是ID
    } DUMMYUNIONNAME;  //四个字节 最高位是1那么是个目录,低31位是偏移(指向一个目录的结构体地址) 
 //       ,如果是0 那么是个数据,低31位是偏移(指向一个数据的结构体地址) 
 union { // 资源数据/资源目录
        DWORD OffsetToData; // 最高位为1,是目录,低31位是新目录的相对于根目录IMAGE_RESOURC
     struct {            // 最高位为0,是数据(类似文件),直接用IMAGE_RESOURCE_DATA_ENTRY解析
        DWORD OffsetToDirectory:31;  //位段低31位
        DWORD DataIsDirectory:1;     //位段最高位
       } DUMMYSTRUCTNAME2;
    } DUMMYUNIONNAME2; 
} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY; // 名称解析  -- ASCII
typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
  WORD Length;           // 长度
  CHAR NameString[ 1 ];     // ASCII字符串
} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING; // 名称解析  -- UNICODE
typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
  WORD Length;          // 长度
  WCHAR NameString[ 1 ]; // UNICODE字符串
} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U; // 数据项
typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
  DWORD OffsetToData; // 资源数据RVA,这里的OFFSET是相对资源节的偏移
  DWORD Size;         // 资源数据的长度
  DWORD CodePage;     // 代码页,一般是0
  DWORD Reserved;     // 保留字段
} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;

主要目的不是为了提取资源,而是在条件比较恶劣的情况下,在资源里面看看是不是塞了一些恶意的东西

资源id可以以数值命名,也可以以字符串命名

资源类型宏

以 类型 6 字符串为例继续解析

在看一下菜单资源

菜单类型是4

二进制数据对比,可以看到是一样的

往资源里面添加一个PE

因为该类型不属于已有类型,所以添加自定义类型

再用 winhex 打开 exe

资源类型

0x85 = 133 可以从资源.h 文件中看出,id是对的

800001a0 最高位是1 是个目录 ,偏移是 1a0 9a00+1a0= 9ba0

20c88 + 26000 = 46c88 所以数据从 20c88 到 4c688

把对应区域的数据拷贝出来保存到一个 文件里面

对比MD5 值,可以看到文件一模一样

使用自定义资源

    HRSRC hRsrc = FindResource(hInst, MAKEINTRESOURCE(IDR_EXE3), TEXT("EXE"));
    HGLOBAL hGlobal = LoadResource(hInst, hRsrc);
    LPVOID pRes = LockResource(hGlobal);    //返回资源的首地址

提取资源文件

以扫雷为例

4200 + 5e0 = 47e0 , 4200 + 60 = 4260

格式是 wav

4200+1d0 = 43d0

把数据拷出来复制到新文件, 以wav作为格式

WindowsPE文件格式入门11.资源表的更多相关文章

  1. [PE结构分析] 11.资源表结构

    资源表是一个树形结构,可以设置成2的31次方的层数,Windows 使用了3级: 类型->名称->语言 其中涉及到四个结构: Data Description Resource Direc ...

  2. WindowsPE 第七章 资源表

    资源表 在程序设计中,总会设计一些数据.这些数据可能是源代码内部需要用到的常量,菜单选项.界面描述等:也可能是源代码外部的,比如程序的图标文件.北京音乐文件.配置文件等,以上这些数据统称为资源.按照程 ...

  3. 无废话ExtJs 入门教程四[表单:FormPanel]

    无废话ExtJs 入门教程四[表单:FormPanel] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在窗体里加了个表单.如下所示代码区的第28行位置,items:form. ...

  4. 一文快速入门分库分表中间件 Sharding-JDBC (必修课)

    书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...

  5. 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件

    [源码下载] 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件 作者 ...

  6. 解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录,

    在用sudo apt-get install kmymoney2安装软件kmymoney2时,由于速度太慢,想换个软件源,直接关闭了终端,apt-get但进程没有结束,结果终端提示:“E: 无法获得锁 ...

  7. 问题:无法获得锁 /var/lib/dpkg/lock - open (11: 资源临时不可用)

    无法获得锁 /var/lib/dpkg/lock - open (11: 资源临时不可用) 问题: 运行程序更新时出现报错: 无法获得锁 /var/lib/dpkg/lock - open (11: ...

  8. 无法获得锁 /var/lib/dpkg/lock - open (11: 资源临时不可用)

    转自:http://www.cnblogs.com/ManMonth/archive/2010/01/14/1648010.html 问题: 运行程序更新时出现报错: 无法获得锁 /var/lib/d ...

  9. 出现Fatal IO error 11 (资源暂时不可用) on X server :0.0.的可能原因及解决方案

    我在使用python的过程当中发现了这个有这样的错误,后来看了下面这篇文档才知道原因所在. 最近在编写一个局域网的聊天工具,在编写客户端时,我把界面部分和事件处理函数写好后,准备再开一个线程用于接收服 ...

  10. 【Linux/Ubuntu学习 7】E: 无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录

    在用sudo apt-get install 安装软件时,由于速度太慢,想换个软件源,直接关闭了终端,apt-get但进程没有结束,结果终端提示 :“E: 无法获得锁 /var/lib/dpkg/lo ...

随机推荐

  1. Sqoop - [01] 概述

    将关系型数据库(Oracle.MySQL.PG等)数据与Hadoop数据进行转换的工具. 一.Sqoop1和Sqoop2的区别 Sqoop1由client端直接接入Hadoop,任务通过解析生成对应的 ...

  2. Ansible - [06] Playbook

    Playbook 概述 Ansible ad-hoc 可以通过命令行形式远程管理其他主机 适合执行一些临时性简单任务 Ansible playbook 中文名称叫 剧本 将经常需要执行的任务写入一个文 ...

  3. Hive - 多种表类型的CURD测试

    关于torc.textfile.orc.es.hyperdrive表的CURD测试 TORC(支持事务的orc表)测试 TORC(分区表)测试 TEXTFILE 表测试 ORC 表测试 ES(Elas ...

  4. Win10打开IE自动跳转至Edge解决办法

    WIN + R输入inetcpl.cpl弹出Internet属性对话窗口 点击上面菜单中的[高级]选项 滑动右侧滚动条,找到[浏览]项下面的[启用第三方浏览器拓展*]并取消勾选 双击IE浏览器图标测试 ...

  5. 【由技及道】统一封装API返回结果后String返回报错文件解决原理--Spring 消息转换器的层次图解与规则说明【人工智障AI2077的开发问题日志002】

    ▄▀▄ ▀■■■▀ AI2077的日志片段 ▄■■■■■▄ [ERROR] | 量子通道波动异常! | 检测到StringConverter试图吞噬ApiResult对象 | 启动二向箔防御程序... ...

  6. go ceph s3文件管理

    导入依赖 go get gopkg.in/amz.v1/aws go get gopkg.in/amz.v1/s3 创建用户 在初始化连接之前,我们需要创建一个用户得到accessKey和secret ...

  7. golang中容易遇到的错误

    前言 在循环中,有几种情况可能会导致混乱,需要弄清楚. 循环迭代器变量中使用引用 出于效率考虑,我们经常使用单个变量来循环迭代器.但在循环中,每次循环迭代中都会有不同的值,有时候会导致未知的行为. i ...

  8. docker常见问题修复方法

    一.运行容器报错:Error response from daemon: Error running DeviceCreate (createSnapDevice) dm_task_run faile ...

  9. [每日算法 - 华为机试] 剑指 Offer 10- II. 青蛙跳台阶问题

    入口 力扣https://leetcode.cn/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/ 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该 ...

  10. Linux-Deepin下搭建云笔记

    背景 操作系统切换为Deepin以后,因为没有windows,各家的云笔记产品,几乎对Linux都没有很好的支持. 印象笔记,没有linux版本,web版本不支持markdown 为知笔记,需要收费, ...