PE⽂件格式启发式学习
PE ⽂件格式启发式学习(以 为例)(5.15更新)
问:1.1
我知道程序中最重要的段是text段,请告诉我text 段在哪?
答:1.1
text 段在⽂件偏移0x400处,⼤⼩0x200字节,该区可运⾏,可读取,包含代码。
该区在内存中RV A 0x1000处,⼤⼩0x1000.
问:1.2
我⽤urtraedit 打开 看了,在0x400处-0x600处,⼤部分都是0,为什么这样呢。答:1.2
pe 格式⼤部分⽂件都是这样,这是对齐所要求的,⽂件对齐为0x200, 内存对齐为0x1000 你可以在NT_Option_Header 的Section_Alignment, File_Alignment 域中看到这两个数据。//
// Optional header format.
//
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic;
BYTE MajorLinkerV ersion;
BYTE MinorLinkerV ersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
兰亭集DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT additional fields.
//
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemV ersion;
WORD MinorOperatingSystemV ersion;
WORD MajorImageV ersion;
WORD MinorImageV ersion;
WORD MajorSubsystemV ersion;
WORD MinorSubsystemV ersion;
DWORD Win32V ersionV alue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;z
DWORD NumberOfRvaAndSizes;
IMAGE_DA TA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
问:1.3
慢点,别⼀下⼦贴那么多东西,我还没有到 _IMAGE_OPTIONAL_HEADER 的位置呢,
告诉我怎样
答:1.3
贴上那个_IMAGE_OPTIONAL_HEADER结构好说话,它的位置紧跟在 MAGE_FILE_HEADER 之后
告诉你个⼩技巧,那个Magic对NT x86来讲总是010B,在头⽂件到那个010b,就是IMAGE_OPTIONAL_HEADER32 结构的地址。
问:1.4
问题越来越多了。
五行相克_IMAGE_OPTIONAL_HEADER 还没有说清呢,⼜出来⼀个IMAGE_FILE_HEADER。先不管IMAGE_FILE_HEADER
先按你的⼩技巧,在头部到010b, 因为是little endial, 在ultraedit 中要0b 01.
好,到了,离那个 50 45 00 00 (ascii PE)相距不远,在偏移D8处,按你所说SectionAlignment和FileAlignment 应该在结构第9个,第10个DWORD 处。
好,到了,在f8处有00001000, FC处为00 00 02 00 (我已经考虑了endian,以后不⽤提醒了)。
答:1.4
呀,进步不⼩吗?这样⼀下⼦你就把IMAGE_OPTIONAL_HEADER32 中所有的东西都出来了。
问:1.5
是的,我可以把Optional header中所有东西都出来,但我现在除了刚才介绍的第9个DWORD为内存对齐⼤⼩,第10个DWORD为⽂件对齐⼤⼩,其它我都不知道是⼲什么的?
答:1.5
别着急,其实还是很容易理解的,从字⾯意义就能猜⼤概。不过我们现在还不是通读Optional header的时候,还是拣我们最
关⼼的问题插⼿吧。
问:1.6
还是回到text 段上来吧,刚才你对text段⼤⼩,位置,属性分析的头头是到
你是从那看出来的?
答:1.6
是从section header 中看出来的,每⼀个section, 都有⼀个section header 描述其位置,⼤⼩,属性。
section header 的结构是这样定义的
#define IMAGE_SIZEOF_SHORT_NAME 8
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD V irtualSize;
} Misc;
DWORD V irtualAddress;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
问:1.7
呦,慢点,怎么⼜往外甩结构,我很菜!哦,不太多,还⾏吧。
不过你还是告诉我具体位置在哪吧,我好拿结构和数据对对号。
答:1.7
好,正是这种学习⽅法。你⼀定能学会的。
节表头是⼀个数组,它把所有节的位置,长度,属性放在了⼀起
云电视是什么
紧跟在option header 之后,所以你从⽂件头部往下就可以了。
看到IMAGE_SECTION_HEADER结构的第⼀个成员了吗,它是
BYTE Name【8】
这是节名称,你要的text 段名字就是 .text, 你看ultraedit
ascii 码区离⽂件开始不远的地⽅,有⼀个.text, 对应的⼆进制
数据是2E 74 65 78 74, 这就是text 端IMAGE_SECTION_HEADER处
问:1.8
原来⽞机在这⾥呀。我试试看。哦,看见了,在1B8处。前8个
字节是节名称。后⾯的00 00 00 28 到底是物理地址还是虚拟⼤⼩,
(偷偷的,虚拟⼤⼩,表⽰内存中只有0x28个字节有效,其它全是0),在后⾯00 00 10 00 是虚拟相对地址俗称RV A, 就是在内存中相对与起始地址的偏移。再后⾯00 00 02 00 为SizeOfRawData,就是⽂件中⼤⼩,再后⾯ 00 00 04 00 是
PointerToRawData,是⽂件的偏移后⾯有三个DWORD 全是0,他们
是重定位信息和⾏号,很好,EXE⽂件可以不⽤管这些。最后⼀个
60 00 00 20 代表属性可读,可写,是代码。好,我终于理解你的第⼀句话了。
不解释⼀下,我怎么能⼀下⼦听的懂呢!谢谢你。
那么我⼜有问题了。那程序针真是搜索这个.text字符串到Text 节表头吗?
答:1.8
不是。前⾯说过,节表头紧随Optional header 之后。
问:1.9
Optional header 结构变量太多,我数了⼀下都没数清,到底占多少个字节呢?
答:1.9
正等着你这⼀问呢?是啊,数都数不清,纵是现在记住了将来也容易忘。
估计微软也想到了这⼀点,他把OPTION header 的⼤⼩放到了 _IMAGE_FILE_HEADER 的⼀个变量中,
下⾯是_IMAGE_FILE_HEADER 的定义
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
SizeOfOptionalHeader ⼀般总是0xE0
问:1.10
我今天已经学了不少东西了,看样⼦后⾯还很多的样⼦。再问最后⼀个问题。
FILE_HEADER 在⽂件什么位置呢。
答:1.10
这个简单,就在PE标识符后⾯。看到了吗,在C0处,ascii 是PE. ⼆进制是50 45 00 00
代学⽣:
哦,看到了,今天10个问题已经满了,我还想学,可是有点累了。。。
代⽼师:鸡年春晚沈腾回归
今天就到这⾥吧,好好休息⼀下。
接问题1.10后的第11个问题
问:2.11
⼲脆就把位置问题先问到底吧。PE标识符 54 45 00 00 总是在⽂件偏移00c0 处吗。空调变频和定频的区别
答:2.11
基本上可以这么说,主要是因为前⾯的部分是dos 头部和dos 体
dos 头部 IMAGE_DOS_HEADER 的结构我就不贴了,因为dos 已经离我们远去,它
已经失掉了意义,dos 体也⼏乎是固定不变的了。这部分的作⽤是当你拿这个
PE程序到dos 系统上运⾏时,dos 执⾏会在控制台上打印⼀⾏提⽰信息,
"this program cannot be run in DOS mode" 然后停在哪。总⽐你⼀运⾏,DOS
就hang 机强多了。如果拿PE代码在DOS 下直接执⾏,不⽤说那肯定hang 机。
微软就是怕这个事情发⽣才⽤了这么⼀个措施。
现在你只需要记住⼀件事,⽂件头两个字母是MZ标记,在3c偏移地址,00 00 00 c0
指的是NT header 的⽂件偏移,如果这个偏移处的标识正好是PE. 可以肯定,这个⽂件
就是PE ⽂件了。如果在3c偏移地址处存其它DWORD 地址,那就到所指定的地址去
如果该处正好ASCII "PE",此处就是NT的header 。
问:2.12
怎么有这么多header, 能否概要总结⼀下:
答:2.12
好的。在⽂件开头部分是 _IMAGE_DOS_HEADER ,⼩名MZ header, 我们已经不⽤关⼼它了。
只要关⼼地址偏移0x3c 处,该处存有 _IMAGE_NT_HEADER 的偏移。在dos header 和工商银行积分兑换商城
NT header 之间是dos 体,我们也不⽤关⼼它了。
_IMAGE_NT_HEADER 到底是什么样呢?它实际是PE00标识+ NT_FILE_HEADER+NT_OPTION_HEADER 以下是它的结构声明。
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; //这⾥的标记是 PE00
IMAGE_FILE_HEADER FileHeader; //NT header 包含FILE header 和Option header
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
问: 2.13
这样对header有了⼀个总体认识,它占据着⽂件开始部分。反正它是死的,⽽且每个⽂件只有
⼀个,有上⾯各个header 的结构定义,⽆⾮是存储这⼀些数据,指针。估计详细分析⼀下,
还是回到节表上来。上次已经到了节表头,前⾯说是在OptionalHeader下⾯,现在也可以
说是在NT header下⾯。其中以.text 居⾸,根据节表头结构,从.text 偏移⼀个节表结构,
我们看到了第⼆个ascii 字符“.rdata", 不远的地⽅还要⼀个”.data", 正好也偏移⼀个节表头结构“,
还有⼀个".rsrc",再往后就是全0了,那么这是否是说,这个结构数组含有4个结构元素呢?
答: 2.13
正是如此,在_IMAGE_FILE_HEADER 中有⼀项定义了该数值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论