标 题: 【原创】PE 文件格式启发式学习(以hello.exe 为例)
作 者: hjjdebug
时 间: 2008-5-11 21:07
问:1.1
我知道程序中最重要的段是text段,请告诉我text 段在哪?
答:1.1
text 段在文件偏移0x400处,大小0x200字节,该区可运行,可读取,包含代码。
该区在内存中RVA 0x1000处,大小0x1000.
问:1.2
我用urtraedit 打开hello.exe 看了,在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 MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT additional fields.
//
DWORD 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;z
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_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 VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
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 是虚拟相对地址 俗称RVA, 就是在内存中相对与起始地址的偏移。再后面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;
DWORD NumberOfSymbols;
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个问题已经满了,我还想学,可是有点累了。。。
代老师:
今天就到这里吧,好好休息一下。
更新记录:
第二部分: 9楼
第三部分: 13楼
第四部分: 20楼
- 标 题:PE 文件格式启发式学习(以hello.exe 为例)(5.15更新)
- 作 者:hjjdebug
- 时 间:2008-05-11 21:16
- 链 接:http://bbs.pediy.com/showthread.php?t=64701