位图字体等,库罗德VA正是当PE文件棉被服装载到内部存款和储蓄器中后

《软件漏洞分析本领》笔记

SportageVA是相对设想地址(Relative Virtual
Address)的缩写,看名就可见意思,它是三个“相对”地址,也得以说是“偏移量”,PE文件的各类数据布局中涉及到地点的字段超过二分一皆以以奥迪Q3VA代表的。

此番的精晓首要教学PE的基本概念、MS-DOS文件头、PE文件头、区块、输入表、输出表等。

PE文件:

准确地说,奥迪Q5VA便是当PE文件棉被服装载到内存中后,某些数据的职分相对于文件头的偏移量。举例,借使Windows装载器将叁个PE文件装入
00400000h处的内部存款和储蓄器中,而某些节中的有些数据棉被服装入0040xxxxh处,那么那个数额的ENVISIONVA就是(0040xxxxh-
00400000h)=xxxxh,反过来讲,将PRADOVA的值加上文件棉被服装载的集散地址,就可以找到数据在内部存款和储蓄器中的莫过于地址。

这边笔者将会构成一个简短的小程序来加强小编对PE文件布局的精晓。

  PE(Portable
Executable)是win32平台下可实行遵从的数目格式。常常布满的比方*.exe和*.dll都是PE文件。

PE文件中冒出奥迪Q7VA的
概念是因为PE的内部存款和储蓄器影像和磁盘文件映疑似莫衷一是的,同意气风发数据相对于文件头的偏移量在内部存款和储蓄器卯月在磁盘文件中大概是不一样的,为了进步功用,PE文件头中使用的
都以内部存款和储蓄器影像中的偏移量,也正是奥迪Q5VA。从图17.3中也足以获取另三个定论,那正是RAV4VA仅仅是对于处于节中的数据来说的,对于文本头和节表来讲无所谓奥迪Q3VA和文件偏移,因为它们在被映射到内部存款和储蓄器中后不论是是高低仍然摇头都不会有其余变动。

 

  可施行文件:富含二进制代码,字符串,菜单,Logo,位图字体等。

 

采取学习工具:有StudyPE、LordPE、PEID。

  运转时操作系统会按PE文件的约定定位资源并装载入内部存款和储蓄器。可实施文件
——>拆分——>若干数目节<——区别的能源。

2、汇编中设想地址(VRA卡塔尔(英语:State of Qatar)与公事偏移地址(FileOffset卡塔尔国的竞相转变:

 学习PE建议看书。。和友好动手。。。

  规范PE文件日常饱含:.text(编写翻译器产生,存放二进制代码,
反汇编和调养的对象)、.data(起头化数据块)、.idata(使用的外来函数如动态链接库与公事音讯卡塔尔(قطر‎、.rsrc(存放程序财富),还包含别的如.reloc、.edata、.tls、.rdata等。

+———+———+———+———+———+———+

 

设想内部存款和储蓄器:

|  段名称   设想地址  设想大小  物理地址  物理大小   标记   |

PE文件:

  Windows内存:1.物理内部存款和储蓄器层面;2.设想内部存款和储蓄器层面。

+———+———+———+———+———+———+

  在WIN上,叁十六人的可实施文件是PE文件,六贰11个人的是PE32+文件
,DLL文件的格式和PE格式差不离,唯风度翩翩的分别是PE和DLL的有三个字段标志这么些文件是EXE还是DLL。

  物理内部存储器日常内核等级ring0技巧看出;经常顾客情势下见到的为Windows顾客态内存映射机制下的设想内部存款和储蓄器。

|  Name     VOffset    VSize    ROffset    RSize      Flags |

  公海710登录网址 1

  内部存款和储蓄器管理器能够使进度在骨子里唯有512MB物理内部存款和储蓄器的气象下使进度“以为”自身具有4GB内部存款和储蓄器(此中蕴含代码,
栈空间,财富区,动态链接库等)。

+———+———+———+———+———+———+

如上就是一个PE文件的协会图,PE文件使用的是四个平面地址空间,全部的多寡都融入在联合,文件的从头到尾的经过又被分割为不相同的区块(Section),

公海710登录网址 2

|  .text   00001000   00000092  00000400  00000200  60000020|

次第区块按页的境界来对齐。每一种块都有温馨的性情(是还是不是可读,是或不是可写,是或不是可施行等等卡塔尔国。

  这种状态和事实上生活中国际清算银行行行日常,你需求用的钱其实并不等于你持有的财富,银行其实具有的金额数稍差于全数储户的财物和。

|  .rdata  00002000   000000F6  00000600  00000200  40000040|

 

  那万黄金年代有客商供给抽取超超过实际际金额数如何是好,操作系统原理中有“设想内部存款和储蓄器”概念,
即在这里种场馆下不时会将“部分硬盘空间”权且作为内部存储器使用。(两个“设想内部存款和储蓄器“概念对象差异,不宜同日来说)

|  .data   00003000   0000018E  00000800  00000200  C0000040|

基地址:

PE文件与虚构内部存款和储蓄器之间的光彩夺目

|  .rsrc   00004000   000003A0  00000A00  00000400  C0000040|

     
当PE文件被装载器装载了后头,内存中的板块被称作模块。映射文件的发端地址被堪当模块句柄—内部存款和储蓄器中的模块代表那进度从那一个可试行文件中所要求的代码、数据、财富、输入表、输出表及任李国华西所选拔的事物放在三个连连的内部存储器块中。在装载中,PE文件的多少个字段会告诉系统把文件映射到内存须求多少内部存款和储蓄器,无法被映射的数据被停放在文件的尾巴。

  (1).文件偏移地址(File Offset):数据在PE文件中的地址,在磁盘上贮存时相对于文件开始的舞狮。

+———+———+———+———+———+———+

     
在WIN3第22中学,能够动用HMODULE GetModuleHandle(LPCTST途睿欧lpModuleName卡塔尔国来博取三个模块的称号。当传递一个可实践文件也许DLL作为参数,

  (2).装载基址(Image Base):PE装入内部存储器时的集散地址。暗中认可EXE文件在内部存储器中的营地址为0x00400000,DLL为0x10000000。当然地点可由编写翻译选项改良。

文件设想偏移地址和文书物理偏移地址的总结公式如下:

借使系统成功找到那些文件,就能够回到该可推行文件只怕DLL文件影象加载到的营地址。

  (3).设想内部存款和储蓄器地址(Virtual
Address,VA):PE文件中的指令棉被服装入内部存款和储蓄器后的地址。

www.710.com , 

     
在PE文件中,有多个字符设置了营地址,VC++建构的exe文件的营地址是0x00400000h,DLL文件的营地址是0x10000000h。

  (4).相对虚构地址(Relative Virtual
Address,MuranoVA):内部存款和储蓄器地址相对于映射基址(即装载基址)的偏移量。

>>>>>>>VaToFileOffset( 设想地址转文件偏移地址卡塔尔

 

  VA、Image Base、奇骏VA之间涉及:

如VA = 00401000 (虚拟地址卡塔尔国

相对设想地址:

        VA = Image Base + RVA;

ImageBase = 00400000 (基地址)

   
为了让程序的载入越来越灵巧-也为了在PE文件中冒出有明确的内存地址,现身了针锋相投设想地址(Relative
Vritual Address, CRUISERVA卡塔尔,当你的次序加载后,假设你的text块的CR-VVA =
0x00001000h,映射到程序中时,VA(虚构地址) =
ImagineBase(集散地址卡塔尔+奥迪Q7VA(相对虚构地址卡塔尔,你的代码区块在内部存款和储蓄器中就起来与0x00401000h。

  可见道为: 实际 = 基点 + 位移.

V奥迪Q7k = VOffset – ROffset = 00001000 – 00000400 = C00 (得出文件设想地址和文件物理址之间的VWranglerk值卡塔尔国

 

  私下认可景况下:日常PE文件的0字节
=》设想内部存款和储蓄器0x00400000任务,即所谓的装载地点。

FileOffset = VA – ImageBase – VEvoquek = 00401000 – 00400000 – C00 = 400(文件物理地址的撼动地址卡塔尔国

位图字体等,库罗德VA正是当PE文件棉被服装载到内部存款和储蓄器中后。文件偏移地址:

 

 

   
因为我们的公文是积攒在磁盘上的,有些数据相对于文件头的偏移量正是那一个数量的摇晃地址,称为文件偏移地址(File
Offset卡塔尔或许物理地址(RAW Offset),偏移地址的起初值是0。

  装载PE文件时,文件偏移地址(磁盘上)与汉兰达VA(内部存款和储蓄器上)有一点都不小学一年级致性(操作系统会尽量有限支持PE中各数据构造),那同样会有细微差距,由文件数量和内部存款和储蓄器数据的存放单位差别产生。

如VA = 00401325,则:

 

  在PE文件中,以磁盘数据规范贮存(大家领略硬盘以二个section为着力单位,即512byte),0x200字节,当四个数据节不足0x200字节时填充0x00;

FileOffset = VA – ImageBase – VRk = 00401325 – 00400000 – C00 = 725

MS-DOS头部(IMAGE_DOS_HEADER):

  而在内部存款和储蓄器中,则以0x1000字节(4byte)为基本单位进行组织,其他与前者相像。

 

   种种PE文件是以四个DOS程序开头的,还会有MZ
header之后的DOS
stub(DOS块卡塔尔国。假如那些可实施文件无法被那个种类支持,会打字与印刷意气风发串提醒符

 

>>>>>>FileOffsetToVa( 文件偏移地址转虚构地址卡塔尔(قطر‎

“This program cannot be run is MS-DOS
mode”,DOS底部中根本是WOENCORED e_公海710登录网址 ,magic和 LONG
e_lfanew那么些字段相比较关键。这几个数据构造可以在winnt.h中找到。

  在张开File
Offset和VA换算时,会由存款和储蓄单位引起节基址差称为节偏移。譬如:

如FileOffset = 435(文件偏移地址卡塔尔(قطر‎

#define IMAGE_DOS_SIGNATURE 0x5A4D
#define IMAGE_OS2_SIGNATURE 0x454E
#define IMAGE_OS2_SIGNATURE_LE 0x454C
#define IMAGE_VXD_SIGNATURE 0x454C
#define IMAGE_NT_SIGNATURE 0x00004550

#include "pshpack2.h"
//这里就是IMAGE_DOS_HEADER的结构了。
    typedef struct _IMAGE_DOS_HEADER {
      WORD e_magic; // DOS可执行文件标记“MZ”
      WORD e_cblp;
      WORD e_cp;
      WORD e_crlc;
      WORD e_cparhdr;
      WORD e_minalloc;
      WORD e_maxalloc;
      WORD e_ss;
      WORD e_sp;
      WORD e_csum;
      WORD e_ip;       //DOS代码入口IP
      WORD e_cs;      //DOS代码的入口CS
      WORD e_lfarlc;
      WORD e_ovno;
      WORD e_res[4];
      WORD e_oemid;
      WORD e_oeminfo;
      WORD e_res2[10];
      LONG e_lfanew;   // 指向PE文件头, “PE”,0,0
    } IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;

公海710登录网址 3

VA = FileOffset + ImageBase + V中华Vk = 435 + 00400000 + C00 = 00401035(设想地址卡塔尔国

 LONG
e_lfanew是指向PE文件头的四个地址,它的公文偏移地址是0x3C–也正是60字节起首,然后吞并了4个字节,指向PE文件头,具体看下图

  则有:

 

公海710登录网址 4

公海710登录网址 5

源文档 <>

我们得以看来0x000000F8在摇晃60字节的地点,见到PE文件头在0x000000F8,具体能够自个儿找二个文书来测验(加深影象卡塔尔(قطر‎

  那么就能够测算出:

 

公海710登录网址 6

  FileOffset = VA – Image Base -节偏移

 DOS文件头就到这边了,接下去继续介绍PE头,也正是IMAGE_NT_HEADETiggo,下边包车型客车代码是对此定义32依旧64的PE头,大家能够看来相应的宏语句

        = VA – Image Base – (相对虚构偏移量 – 文件偏移量)

和呼应的数据布局定义。

  按上表,比如计算设想内部存储器中0x00404141处的一条指令,要换算出该指令在文书中的偏移量:

#ifdef _WIN64             //如果采用64的架构
    typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
    typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;
#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL64_HEADER
#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC
#else  /* _WIN64 */      //如果不是采用64而是32位的架构
    typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
    typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL32_HEADER
#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC
#endif /* _WIN64 */ //上面的typedef都是改变结构体的名称

    typedef struct _IMAGE_NT_HEADERS64 {//这里是64位的PE头的结构体的定义
      DWORD Signature;
      IMAGE_FILE_HEADER FileHeader;
      IMAGE_OPTIONAL_HEADER64 OptionalHeader;
    } IMAGE_NT_HEADERS64,*PIMAGE_NT_HEADERS64;

    typedef struct _IMAGE_NT_HEADERS {//这里是32位的PE头的结构体的定义
      DWORD Signature;
      IMAGE_FILE_HEADER FileHeader;
      IMAGE_OPTIONAL_HEADER32 OptionalHeader;
    } IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32;

      文件偏移量 = 0x00404141 – 0x00400000(暗许的Image
Base)-(0x1000 – 0x400卡塔尔(قطر‎(代码存于.text文件中) = 0x3541

在PE的文本头中,第三个DWO大切诺基D Signature,
被定义为了0x00004550h,也正是”PE”那多个字符。这几个标志未有何效率。(DOS中针对的地点卡塔尔国。

 

主要是IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADESportage那四个结构体中的多少个字段重要。

  一些PE工具也提供那类地址转变:Lord PE.

作者么接下去看看PE文件头中的IMAGE FILE_HEADERAV4 FileHeader那一个构造体

 =_=..

typedef struct _IMAGE_FILE_HEADER {
      WORD Machine;                     //这里定义的是运行平台,i386= 0x014Ch这个值,还有其他平台,看书吧。。
      WORD NumberOfSections;       //这个是标识区块的数目,紧跟在PE头的后面,也就是IMAGE_NT_HEADERS的后面
      DWORD TimeDateStamp;
      DWORD PointerToSymbolTable;
      DWORD NumberOfSymbols;
      WORD SizeOfOptionalHeader;     //这里表明了IMAGE_NT_HEADERS中的大小(RAW SIZE),32位一般是0x00E0, 64位PE+一般是0x00F0
      WORD Characteristics;       //普通的EXE是0x010fh, DLL文件是0x210Eh
    } IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;

接下去大家看一下IMAGE_OPTIONAL_HEADEHighlander那一个布局体,同样下边包车型大巴是其意气风发布局体在winnt.h中的定义,下边那么些是叁十二人的,还恐怕有陆十六人的,可是相当多的,能够看winnt.htypedef
struct _IMAGE_OPTIONAL_HEADER

typedef struct _IMAGE_OPTIONAL_HEADER {

      WORD Magic;
      BYTE MajorLinkerVersion;
      BYTE MinorLinkerVersion;
      DWORD SizeOfCode;           //这里定义了包含代码区块的大小
      DWORD SizeOfInitializedData;    //这里定义了已经初始化的变量的区块的大小
      DWORD SizeOfUninitializedData;   //这里是未初始化的变量的区块的大小
      DWORD AddressOfEntryPoint;     //这里是程序入口的RVA(相对虚拟地址)
      DWORD BaseOfCode;          //这里是程序代码块的起始RVA
      DWORD BaseOfData;          //这里是数据块起始RVA
      DWORD ImageBase;           //这里是程序默认装入的基地址(ImageBase)
      DWORD SectionAlignment;       //内存中区块的对齐值,非常重要
      DWORD FileAlignment;        //文件中区块的对齐值,非常重要
      WORD MajorOperatingSystemVersion;
      WORD MinorOperatingSystemVersion;
      WORD MajorImageVersion;
      WORD MinorImageVersion;
      WORD MajorSubsystemVersion;
      WORD MinorSubsystemVersion;
      DWORD Win32VersionValue;
      DWORD SizeOfImage;
      DWORD SizeOfHeaders;
      DWORD CheckSum;
      WORD Subsystem;          //这里定义了文件的子系统,图形接口子系统,字符子系统,具体可以看具体的定义
      WORD DllCharacteristics;
      DWORD SizeOfStackReserve;
      DWORD SizeOfStackCommit;
      DWORD SizeOfHeapReserve;
      DWORD SizeOfHeapCommit;
      DWORD LoaderFlags;
      DWORD NumberOfRvaAndSizes;   //这里定义了数据目录表的项数,一直保持为16
      IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; //这个是数据目录表,指向输入、输出表、资源块等数据,很重要
    } IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;

 这个IMAGE_OPTIONAL_HEADE奥迪Q7只必要关心一些首要字段就能够了,记住。。

接下去笔者么就看生机勃勃看那一个数额目录表,数据目录表轻易题说就是三个长短为16的IMAGE_DATA_DIRECTO陆风X8Y布局体数组而已

typedef struct _IMAGE_DATA_DIRECTORY {
      DWORD VirtualAddress;            //数据块的其实RVA,很重要
      DWORD Size;             //数据块的长度
    } IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;

那是三个20个人的数组,最有一个数组元素作为保留,全体为0,其余的从开始一向到尾数第1个数据都以早就鲜明好了的,大家看一下以此数目目录表成员

#define IMAGE_DIRECTORY_ENTRY_EXPORT 0              //Export Table
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1        //Import Table              输入表这里比较重要
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
#define IMAGE_DIRECTORY_ENTRY_SECURITY 4
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
#define IMAGE_DIRECTORY_ENTRY_DEBUG 6
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8
#define IMAGE_DIRECTORY_ENTRY_TLS 9
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11
#define IMAGE_DIRECTORY_ENTRY_IAT 12          //IAT (import address table), 这里也很重要
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14

再有也得以利用LordPE的PE
editor来查阅那么些目录,今后的查看目录表的工具相当多。。。。。

PE的率先品级到此处,接下去会持续读书,扩充纯熟度。。。。。。。。。。———–勤奋好学,每一日向上!

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图