PE文件之资源讲解
资源是PE文件中非常重要的部分,几乎所有的PE文件中都包含资源,与导入表与导出表相比,资源的组织方式要复杂得多,要了解资源的话,重点在于了解资源整体上的组织结构。
我们知道,PE文件资源中的内容包括:光标、图标、位图、菜单等十几种标准的类型,除此之外,还可以使用自定义的类型,每种类型的资源中,可能存在多个资源项,这些资源项用不同的ID或者名称来分辨,在某个资源ID下,还可以同时存在不同代码页的版本。

PE文件中资源的组织方式
资源的组织方式
- 获取资源的位置
- 资源目录
- 资源数据入口
我们怎么获取资源的位置呢?
我们可以在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结构描述了资源数据所处的位置和大小,换句话说就是:我们终于得到了某个资源的详细信息。这个结构就是资源数据的入口。
其定义如下:

PE文件之资源讲解的更多相关文章
- 浅析MSIL中间语言——PE文件结构篇
一.开篇 开篇我想讲一下于本文无关的话题,其实我很想美化一下自己博客园一直没时间弄,无意间找了博客园李宝亨的博客园里面有一篇分享自己主题的文章,我就将这个模板暂时用作我的blog主题,我要讲述一个关于 ...
- 深入学习PE文件(转)
PE文件是Win32的原生文件格式.每一个Win32可执行文件都遵循PE文件格式.对PE文件格式的了解可以加深你对Win32系统的深入理解. 一. 基本结构. 上图便是PE文件的基本结构.(注意:DO ...
- 深入剖析PE文件
不赖猴的笔记,转载请注明出处. 深入剖析PE文件 PE文件是Win32的原生文件格式.每一个Win32可执行文件都遵循PE文件格式.对PE文件格式的了解可以加深你对Win32系统的深入理解. 一. ...
- PE文件详解(九)
本篇文章转载自小甲鱼的一篇日志,原文地址 我们知道,Windows 将程序的各种界面定义为资源,包括加速键(Accelerator).位图(Bitmap).光标(Cursor).对话框(Dialog ...
- PE文件详解二
本文转自小甲鱼的PE文件相关教程,原文传送门 咱接着往下讲解IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用! 接着我们来谈谈 IMAGE_OPTIONAL_HEADER 结构 ...
- .NET的PE文件结构篇(转)
一.开篇 开篇我要讲述一个关于PE文件结构的文章,这篇文章动手能力比较强,希望大家能够动手进行操作,这边文章篇幅有可能会长一些,为了方便大家阅读我可以将其分为几个部分进行讲解,主要分为以下几个部分: ...
- PE文件学习系列三-PE头详解
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 最近比较忙 ...
- 【C#进阶系列】02 PE文件,程序集,托管模块,元数据——还是那个Hello world
好了,还是这张图,还是一样的Hello world. 因为本章其实很多都是讲一些命令行编译啊什么鬼的配置类的东西,要用的时候直接百度或者回头查书就可以了, 所以了解一下也就行了,也没有记录下来,接下来 ...
- PE文件结构部分解析以及输入的定位
原文链接地址:http://www.cnblogs.com/shadow-lei/p/3554670.html PE文件定义 PE 文件("Portable executable" ...
随机推荐
- android Material Design:主题
<style name="MyTheme" parent="@android:style/android:Theme.Material"> < ...
- Android的ADT内容助手快捷方式设置
请注明出处:http://www.cnblogs.com/killerlegend/p/3550019.html Written By KillerLegend 先将Word Completion的 ...
- Windos中无法删除桌面IE图标的解决方法
解决方法其实并不难,打开注册表,转到如下图的位置,详细地址在图片最下面: 需要注意的是,你需要在NameSpace中逐个查看各个项目的数据值,显示为数据值为Internet Explorer的项目即为 ...
- Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值
感谢原作者:破剑冰-Oracle中Clob类型处理解析 上一篇分析:ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值 最近为Clob字段在插入数据时发现当字符的字节数(一个半角字符一 ...
- C/C++ 关于大小端模式
大端模式: 数据的高字节存在低地址 数据的低字节存在高地址 小端模式: 数据的高字节存在高地址 数据的低字节存在低地址 如图,i为int类型占4个字节,但只有1个字节的值为1,另外3个字节值为 ...
- JavaScript 中怎样判断文本框只能输出英文字母、汉字和数字,不能输入特殊字符!
JS-只能输入中文和英文2008-11-08 10:17在js中用正则表达式对象(RegExp)判断中文 ^[\u0391-\uFFE5]+$英文 ^[A-Za-z]+$中文和英文/^[\u0391- ...
- libmemcached upcoming ISO C++ standard, C++0x
在编译我的小程序的时候,触发了一个编译错误,程序中使用了libmemcached,错误如下: 1 2 3 4 5 6 7 8 9 In file included from /usr/lib/gcc/ ...
- iOS-打包成ipa
第一步:模拟器选择栏,选择"Generic iOS Device ".早期版本需要断开手机连接,才可以找到. 第二步:选择"Product"菜单下的" ...
- APM飞控修改数传模块方法
APM飞控修改数传模块方法 硬件 ARDUCOPTER第二代 数传模块(USB接口) 数传模块(telem接口) usb-ttl模块 修改方法 注意:APM固件版本和数传模块估计版本是分开的,但有一定 ...
- Pintos修改优先级捐赠、嵌套捐赠、锁的获得与释放、信号量及PV操作
Pintos修改优先级捐赠.嵌套捐赠.锁的获得与释放.信号量及PV操作 原有的优先级更改的情况下面没有考虑到捐赠的情况,仅仅只是改变更改了当前线程的优先级,更别说恢复原本优先级了,所以不能通过任何有关 ...