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. Arduino LED流水灯·基础实验

    Arduino初学IO控制,流水灯实验是很好的学习对象.分两个进程学习. 一.假流水灯,即基础效果实现 二.真流水灯,即采用PWM模拟真实流水渐变效果 我们设立5盏灯,正极分别连接数字口(Digita ...

  2. CF2039D Shohag Loves GCD

    思路(贪心 + 唯一分解定理) 这个题其实只需要考虑一件事:记答案数组为 \(a\),对于两个不同下标 \(i\) 和 \(j\),当 \(\gcd(i,j) = \min(i,j)\) 时,我们只需 ...

  3. Ai 文本生成式大模型 基础知识

    提示工程-RAG-微调 工程当中也是这个次序 提示词工程 RAG 微调 先问好问题 再补充知识 最后微调模型 RAG相关技术细节 选择合适的 Chunk 大小对 RAG 流程至关重要. Chunk 过 ...

  4. idea社区版配置springboot项目问题分析及处理

    前言 记录一次使用IDEA社区版配置SpringBoot项目的经历,包括遇到的问题及解决过程 IDEA版本:IntelliJ IDEA 2024.2.3 (Community Edition) 问题描 ...

  5. HarmonyOS Next 鸿蒙开发-如何使用服务端下发的RSA公钥(字符串)对明文数据进行加密

    如何使用服务端下发的RSA公钥(字符串)对明文数据进行加密 将服务器下发的RSA公钥字符串替换掉pubKeyStr即可实现,具体可参考如下代码: import { buffer, util } fro ...

  6. yolov5 train报错:TypeError: expected np.ndarray (got numpy.ndarray)

    前言 mac intel 机器上,使用 yolov5 物体检测训练时报错:TypeError: expected np.ndarray (got numpy.ndarray) 这个错误信息 TypeE ...

  7. docker报错 ERROR: Service 'workspace' failed to build: ERROR: Service 'php-fpm' failed to build:

    在 Windows 系统中使用 Laradock 搭建基于 Docker 的 PHP 开发环境 执行命令 docker-compose up nginx mysql redis 执行过程中出现错误 报 ...

  8. CVE-2025-29927 Next.js 中间件权限绕过漏洞复现

    漏洞信息 Next.js 是一个基于 React 的流行 Web 应用框架,提供服务器端渲染.静态网站生成和集成路由系统等功能.包含众多功能,是深入研究复杂研究的完美游乐场.在信念.好奇心和韧性的推动 ...

  9. osmts:OERV之一站式管理测试脚本

      最近团队里面实习的小伙伴开发了一个新的项目,可以用来一键式运行各种测试脚本并且完成数据总结,我也尝试部署了一下,遇到了一些问题,接下来一起解析一下这个项目.   首先是获取osmts git cl ...

  10. 面试题-Athas性能监控工具(原理部分未完成)

    前言 Arthas工具已经被我们项目组简单的应用到了物流项目的日常运维中.物流项目之前出现过生产消费速度不一致导致内存队列中的消息数据积压的问题,在后来解决了问题之后,我们项目组就更加重视了对JVM的 ...