资源表:


PE中的相关资源可以通过程序进行深度定位,所获取的二进制字节码与资源脚本语句之间是一一对应的。

这些数据可能是源代码内部需要用到的常景,比如 菜单选项、界面描述等;也可能是源代码外部的,比如程序的图标文件、背景音乐文件、配置 文件等,以上这些数据统称为资源。


逆向调试入门-PE结构-资源表07/07_PE结构资源表


常见的资源


程序中常用的六类资源包括:

1、位图资源

2、光标资源

3、图标资源

4、菜单资源

5、对话框资源

6、自定义资源


逆向调试入门-PE结构-资源表07/07_PE结构资源表_02


结构体:


IMAGE_RESOURCE_DIRECTORY STRUCT 
Characteristics //dd 0000h资源属性
TimeDatestamp //dd 0004h时间戳
MajorVersion //dw 0008h资源大版本号
MinorVersion //dw 0008h资源小版本号
NumberOfNamedEntries //dw 以名称命名的入口数量
NumberOfIdEntries //dw 命名的入口数量
IMAGE RESOURCE DIRECTORY ENDS


资源目录结构


typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
union {
struct {
DWORD NameOffset : 31; //资源名偏移
DWORD NameIsString : 1; //资源名为字符串
};
DWORD Name; //资源/语言类型
WORD Id; //资源数字ID
};
union {
DWORD OffsetToData; //数据偏移地址
struct {
DWORD OffsetToDirectory : 31; //子目录偏移地址
DWORD DataIsDirectory : 1; //数据为目录
};
};
} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;



我们使用工具进行实验

工具有

1、360zip程序

2、resource hacker或者是exescope

3、stud_pe


逆向调试入门-PE结构-资源表07/07_资源表_03


首先我们查看PE资源表


逆向调试入门-PE结构-资源表07/07_PE结构资源表_04


有9个资源组


逆向调试入门-PE结构-资源表07/07_PE结构资源表_05


第一个资源表


逆向调试入门-PE结构-资源表07/07_PE结构资源表_06


我们进行观察下


逆向调试入门-PE结构-资源表07/07_资源表_07


我们对该程序的资源表有个大概的了解之后


逆向调试入门-PE结构-资源表07/07_资源表_08


使用resource 打开该程序


逆向调试入门-PE结构-资源表07/07_PE结构资源表_09


我们对菜单的功能进行修改


逆向调试入门-PE结构-资源表07/07_资源表_10


文件会模拟出菜单选项


逆向调试入门-PE结构-资源表07/07_PE结构资源表_11


将一级菜单改掉


逆向调试入门-PE结构-资源表07/07_资源表_12


将二级菜单中的打开文件操作,修改下名称


逆向调试入门-PE结构-资源表07/07_PE结构资源表_13


选择编译脚本


逆向调试入门-PE结构-资源表07/07_PE结构资源表_14


文件另存为


逆向调试入门-PE结构-资源表07/07_PE结构资源表_15


该文件,如果直接打开


逆向调试入门-PE结构-资源表07/07_资源表_16


我们将文件放到程序目录


逆向调试入门-PE结构-资源表07/07_PE结构资源表_17


一个是正版,一个是我们修改之后的程序(壳)


逆向调试入门-PE结构-资源表07/07_资源表_18


正常画面


逆向调试入门-PE结构-资源表07/07_PE结构资源表_19


修改之后的画面


逆向调试入门-PE结构-资源表07/07_PE结构资源表_20


修改成功。


由于PE结构中资源表一层套一层。难以手动分析,所以使用工具是最佳选择。