0x01 前言

上一篇讲到了数据目录表的结构和怎找到到数据目录表(DataDirectory[16]),这篇我们我来讲讲数据目录表后面的另一个结构——区块表。

0x01 区块

区块就是PE载入器将PE文件载入后,将PE文件分割成若干块,每块包含不同的信息,由读写数据块.data,代码块.code,只读数据块.rdata等等,一般至少得有读写数据块和代码块。区块的的划分信息保存在一张名为区块表(IMAGE_SECTION_HEADER)的结构中。区块表紧邻着PE文件头IMAGE_NT_HEAER。它的结构如下:

typedef struct _IMAGE_SECTION_HEADER

{

BYTE Name[IMAGE_SIZEOF_SHORT_NAME];     // 节表名称,如“.text”

//IMAGE_SIZEOF_SHORT_NAME=8

union
         {

DWORD PhysicalAddress;        // 物理地址

DWORD VirtualSize;                // 真实长度,这两个值是一个联合结构,可以使用其中的任何一个,一

// 般是取后一个

} Misc;

DWORD VirtualAddress;              // 节区的 RVA 地址

DWORD SizeOfRawData;            // 在文件中对齐后的尺寸

DWORD PointerToRawData;        // 在文件中的偏移量

DWORD PointerToRelocations;     // 在OBJ文件中使用,重定位的偏移

DWORD PointerToLinenumbers;   // 行号表的偏移(供调试使用地)

WORD NumberOfRelocations;      // 在OBJ文件中使用,重定位项数目

WORD NumberOfLinenumbers;    // 行号表中行号的数目

DWORD Characteristics;              // 节属性如可读,可写,可执行等} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

大小位40字节。由于它紧邻PE文件头,而PE文件头的中的Data[16]中的最后一个保留双字开头为100h+F0h=1F0h故区块表的开始位为1F0h+8h=1f8h,共占四十个字节,如下图:

由上图我们可读出很多重要信息,前八个字节可以知道这是个.code块,后面四个字节为00001000h这个是VirtualSize字段即Vsize,再后面四个字节是00001000h这个是VirtualAddress,即RAV字段,这个字段很有用,后面将会讲到。再后面是00000200h,标识的是SizeOfRawData字段,这个字段也很有用。再后面的几个字段就不再介绍了,其实用的也不多,用到了可以再进行分析。上图可知Code区段后面就是DATA区段了,分析方法和CODE字段一样,这里就不再做介绍了。

对于上述的分析其实我们也可以通过工具来完成,我们今天来使用另一个强大的工具PEID,这个工具对于脱壳来说很有用。我们打开PEID.exe。直接把文件拖到PEID窗口即可,点击EP段:边上的按钮即可查看刚刚分析的内容。如下图:

显然我们的分析是正确的。注意这里写的V偏移即为RAV,V大小即为Vsize,R大小即为SizeOfRawData,至于R偏移后面会介绍。

PE文件结构详解(三)的更多相关文章

  1. PE文件结构详解(三)PE导出表

    上篇文章 PE文件结构详解(二)可执行文件头 的结尾出现了一个大数组,这个数组中的每一项都是一个特定的结构,通过函数获取数组中的项可以用RtlImageDirectoryEntryToData函数,D ...

  2. PE文件结构详解(六)重定位

    前面两篇 PE文件结构详解(四)PE导入表 和 PE文件结构详解(五)延迟导入表 介绍了PE文件中比较常用的两种导入方式,不知道大家有没有注意到,在调用导入函数时系统生成的代码是像下面这样的: 在这里 ...

  3. PE文件结构详解(四)PE导入表

    PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPO ...

  4. PE文件结构详解(五)延迟导入表

    PE文件结构详解(四)PE导入表讲 了一般的PE导入表,这次我们来看一下另外一种导入表:延迟导入(Delay Import).看名字就知道,这种导入机制导入其他DLL的时机比较“迟”,为什么要迟呢?因 ...

  5. PE文件结构详解(二)可执行文件头

    在PE文件结构详解(一)基本概念里,解释了一些PE文件的一些基本概念,从这篇开始,将详细讲解PE文件中的重要结构. 了解一个文件的格式,最应该首先了解的就是这个文件的文件头的含义,因为几乎所有的文件格 ...

  6. PE文件结构详解(一)基本概念

    PE(Portable Execute) 文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任 何扩展名.那 ...

  7. PE文件结构详解

    (注:最左边是文件头的偏移量.) IMAGE_DOS_HEADER STRUCT { +0h WORD e_magic // Magic DOS signature MZ(4Dh 5Ah) DOS可执 ...

  8. PE文件详解(三)

    本文转自小甲鱼的PE文件详解系列传送门 PE文件到内存的映射 在执行一个PE文件的时候,windows 并不在一开始就将整个文件读入内存的,二十采用与内存映射文件类似的机制. 也就是说,windows ...

  9. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

随机推荐

  1. cocos2dx获得字体的宽高

    Android: 1.在CCImage中添加下面的方法: //头文件声明略. cocos2d::CCSize CCImage::getStringSize(const char *text, cons ...

  2. Java重置Mysql主键自增长值

    MySql 主键自增重置器(统一处理多个表) resetAutoincrement 是一款基于 Java 开发的程序,其功能为重置 mysql 数据库表的主键自增的值为最近的一个. 介绍 开发背景主要 ...

  3. python3 优惠券查询GUI程序

    from tkinter import ttkfrom tkinter import messageboximport pymssqlimport tkinterimport decimalimpor ...

  4. Python快速入门文档

    前言 此文本质为本人学习Python过程中的笔记,部分地方叙述表达可能不够清晰,欢迎留言. (本文适合有一定程序语言基础的读者阅读(最好是c语言)) 一.基本语法 1.框架: (1)以缩进表示层次所属 ...

  5. java作品集:企业信息门户webtap

    作品背景 随着企业应用的软件越来越多,并且信息软件基本以B/S为主了,很多时候各种软件的地址,让大家记的头昏脑胀,并且一堆密码要记,而且大部分系统之间无法互通,虽然市面上有各种集成方案,但无法做到简单 ...

  6. ASP.NET Core中间件与HttpModule有何不同

    前言 在ASP.NET Core中最大的更改之一是对Http请求管道的更改,在ASP.NET中我们了解HttpHandler和HttpModule但是到现在这些已经被替换为中间件那么下面我们来看一下他 ...

  7. 第12章 Java内存模型与线程

    参考<深入理解Java虚拟机> 一.Java内存模型 1.Java内存模型 2.内存间交互操作  流程图: 3.volatile关键字 两个特性: 3.1.保证变脸对所有线程的可见性: 由 ...

  8. 手把手教你用JS/Vue/React实现幸运水果机(80后情怀之作)

    项目体验地址 免费视频教程 分别使用原生JS,Vue和React,手把手教你开发一个H5小游戏,快速上手Vue和React框架的使用. 项目截图 在线体验 在线体验 游戏介绍 幸运水果机是一款街机游戏 ...

  9. Crypto++ AES 加密解密流程

    // aesdemo.cpp : 定义控制台应用程序的入口点. // #include <stdio.h>#include <tchar.h>#include <iost ...

  10. Bash知识点记录

    变量的设置规则   1.  等号两边不能直接接空格符.   2. 右侧的变量内容若有空格符,可使用双引号或单引号将变量内容括起来,其中, 双引号内的特殊字符如 $ 等,可以保有原本的特性.如下所示: ...