PE结构分析

PE结构图(很清楚)可以访问此链接:https://img-blog.csdnimg.cn/20201211144938733.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4ODExOTE5,size_16,color_FFFFFF,t_70

首先分析PE结构的 DOS HEADER 部分(如图):

 

 首先拿一个简单的示例程序开始分析,这是程序的16进制表示内容(如图):

 

 对应PE结构当中的0x00出,找到对应位置的16进制表示,如图所示:

 

 行号和列号对应的0x00与0x01处的代码表示为 4D 5A。

先不着急,我们再来用16进制编辑器打开另一个EXE程序(如图所示):

 

 发现这里依然是4D 5A。

可以看出这是属于PE结构中 DOS HEADER部分特有的文件标识是固定的(并且图中也注明了e_magic【0x00-0x01】是“MZ标记”,用于判断是否为可执行文件)

 

 中间的部分是用来使代码能与16位的系统进行兼容的,如图(上下图片分别对应):

 

上面的这些图片表示的就是PE结构DOS HEADER部分中用来兼容16位操作系统的代码。

下面接着分析(如图):

 

 

 0x3c部分是PE头相对于文件的偏移,可以用来定位PE文件(看具体的图片):

 

 可以看到,文件中显示关于PE文件定位显示在0xf8处,我们现在来找到具体的PE文件头(如图):

 

 

 我们找到PE文件结构图对应的部分(如图):

 

 可以看到,结构图两处标记,第一处竖直文字_IMAGE_DOS_HEADER.Ifanew是指向结构IMAGE_NT_HEADERS的 Signature 部分的;

也就是说,这也是一个标志(确切的说,这才是PE文件的真实标志)。

好,我们接着分析。

现在我们根着PE结构图的指引,来到了第二个结构,也就是IMAGE_NT_HEADERS结构处,那我们接着分析IMAGE_NT_HEADERS结构部分的代码。

 

我们跟着PE结构图的指引,来到0x04处(偏移地址,想对于我们刚刚查到的0x50 45来说的,向后偏移4个字节),可以看到(如图):

 

 这个对应的是_IMAGE_NT_HEADERS结构中的_IMAGE_FILE_HEADER Fileheader二进制代码块处(如图):

 

说明高亮区域中的0x014c(注意,数据在计算机里是反着读的):

 

 

1. #define IMAGE_FILE_MACHINE_UNKNOWN 0
2. #define IMAGE_FILE_MACHINE_I386 0x014c // Intel 386.
3. #define IMAGE_FILE_MACHINE_R3000 0x0162 // MIPS little-endian, 0x160 big-endian
4. #define IMAGE_FILE_MACHINE_R4000 0x0166 // MIPS little-endian
5. #define IMAGE_FILE_MACHINE_R10000 0x0168 // MIPS little-endian
6. #define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 // MIPS little-endian WCE v2
7. #define IMAGE_FILE_MACHINE_ALPHA 0x0184 // Alpha_AXP
8. #define IMAGE_FILE_MACHINE_SH3 0x01a2 // SH3 little-endian
9. #define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
10. #define IMAGE_FILE_MACHINE_SH3E 0x01a4 // SH3E little-endian
11. #define IMAGE_FILE_MACHINE_SH4 0x01a6 // SH4 little-endian
12. #define IMAGE_FILE_MACHINE_SH5 0x01a8 // SH5
13. #define IMAGE_FILE_MACHINE_ARM 0x01c0 // ARM Little-Endian
14. #define IMAGE_FILE_MACHINE_THUMB 0x01c2
15. #define IMAGE_FILE_MACHINE_AM33 0x01d3
16. #define IMAGE_FILE_MACHINE_POWERPC 0x01F0 // IBM PowerPC Little-Endian
17. #define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
18. #define IMAGE_FILE_MACHINE_IA64 0x0200 // Intel 64
19. #define IMAGE_FILE_MACHINE_MIPS16 0x0266 // MIPS
20. #define IMAGE_FILE_MACHINE_ALPHA64 0x0284 // ALPHA64
21. #define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 // MIPS
21. #define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 // MIPS
22. #define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
23. #define IMAGE_FILE_MACHINE_TRICORE 0x0520 // Infineon
24. #define IMAGE_FILE_MACHINE_CEF 0x0CEF
25. #define IMAGE_FILE_MACHINE_EBC 0x0EBC // EFI Byte Code
26. #define IMAGE_FILE_MACHINE_AMD64 0x8664 // AMD64 (K8)
27. #define IMAGE_FILE_MACHINE_M32R 0x9041 // M32R little-endian
28. #define IMAGE_FILE_MACHINE_CEE 0xC0EE

这里可以看出PE文件是可移植文件。

posted @ 2021-04-22 23:01  Profs  阅读(383)  评论(0)    收藏  举报