PE结构分析(二)
在表中,我们知道了0x01 4c对应的平台结构是i386;
我们接着分析下一个字段,给出PE结构图
向后推移2个字节,现在来到(图片高亮部分):
高亮部分对应IMAGE_NT_HEADERS结构的NumberofSections字段;
图中高亮部分是PE_HEADER部分的TimeDateStamp字段,这个字段的功能是记录文件的创建时间(姑且就叫时间戳字段)
对应下图中的:
我们接着分析下一个字段(PE_HEADER结构中的PointertoSymbolTable),这个字段的指向“符号表”(Coff符号表的偏移地址):
对应下图中的:
符号表是什么?
首先我们先来解释下COFF文件格式:
1.文件头(File Header)
现在接着来转到PE_HEADER部分的NumberofSymbols(这个字段表示Coff表中符号的个数);
我们定位到具体文件中的16进制代码中去:
我们接着转到PE_HEADER部分(结构体_IMAGE_FILE_HEADER)中的字段SizeOfOptionalHeader中去;
看到代码中高亮的部分显示0xE0h,说明这是一个32位文件。
我们接着转到PE_HEADER部分(结构_IMAGE_FILE_HEADER)中的Characteristics字段中去;
可以看到是0x0102h。
说明我们的这个软件是可执行文件(也就是EXE可执行程序)。
我们接着转出PE_HEADER部分,重新转到_IMAGE_NT_HEADERS结构体当中的_IMAGE_OPTIONAL_HEADER OptionalHeader中去;
接着按照OPTIONAL_PE_HEADER部分(_IMAGE_OPTIONAL_HEADER)的代码结构去看对应的16进制代码
可以看到是0x010bh。
从01到42就是_IMAGE_OPTIONAL_HEADER结构体中各部分所对应的注释。
01.
typedef
struct
_IMAGE_OPTIONAL_HEADER {
02.
//
03.
// Standard fields.
04.
//
05.
06.
00h
WORD
Magic;
//幻数,32位pe文件总为010bh
07.
02h
BYTE
MajorLinkerVersion;
//连接器主版本号
08.
03h
BYTE
MinorLinkerVersion;
//连接器副版本号
09.
04h
DWORD
SizeOfCode;
//代码段总大小
10.
08h
DWORD
SizeOfInitializedData;
//已初始化数据段总大小
11.
0ch
DWORD
SizeOfUninitializedData;
//未初始化数据段总大小
12.
10h
DWORD
AddressOfEntryPoint;
//程序执行入口地址(RVA)
13.
14h
DWORD
BaseOfCode;
//代码段起始地址(RVA)
14.
18h
DWORD
BaseOfData;
//数据段起始地址(RVA)
15.
16.
//
17.
// NT additional fields.
18.
//
19.
20.
1ch
DWORD
ImageBase;
//程序默认的装入起始地址
21.
20h
DWORD
SectionAlignment;
//内存中区块的对齐单位
22.
24h
DWORD
FileAlignment;
//文件中区块的对齐单位
23.
28h
WORD
MajorOperatingSystemVersion;
//所需操作系统主版本号
24.
2ah
WORD
MinorOperatingSystemVersion;
//所需操作系统副版本号
25.
2ch
WORD
MajorImageVersion;
//自定义主版本号
26.
2eh
WORD
MinorImageVersion;
//自定义副版本号
27.
30h
WORD
MajorSubsystemVersion;
//所需子系统主版本号
28.
32h
WORD
MinorSubsystemVersion;
//所需子系统副版本号
29.
34h
DWORD
Win32VersionValue;
//总是0
30.
38h
DWORD
SizeOfImage;
//pe文件在内存中的映像总大小
31.
3ch
DWORD
SizeOfHeaders;
//从pe文件开始到节表(包含节表)的总大小
32.
40h
DWORD
CheckSum;
//pe文件CRC校验和
33.
44h
WORD
Subsystem;
//用户界面使用的子系统类型
34.
46h
WORD
DllCharacteristics;
//为0
35.
48h
DWORD
SizeOfStackReserve;
//为线程的栈初始保留的虚拟内存的默认值
36.
4ch
DWORD
SizeOfStackCommit;
//为线程的栈初始提交的虚拟内存的大小
37.
50h
DWORD
SizeOfHeapReserve;
//为进程的堆保留的虚拟内存的大小
38.
54h
DWORD
SizeOfHeapCommit;
//为进程的堆初始提交的虚拟内存的大小
39.
58h
DWORD
LoaderFlags;
//为0
40.
5ch
DWORD
NumberOfRvaAndSizes;
//数据目录结构数组的项数,总为 00000010h
41.
60h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
//数据目录结构数组
42.
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
我们接着来看MajorLinkerVersion字段部分对应的16进制代码:
接着看第二个字段MaionrLinkerVersion;
所对应的16进制代码是:
接着看下一个字段SizeOfCode(代码总大小):
所对应的十六进制代码是:
接着看下一个字段SizeOfInitializedData(已初始化代码总大小):
所对应的16进制代码为:
接着看下一个字段SizeofUninitlizedData:
所对应的16进制代码为:
我们转到下一个字段AddressOfEntryPoint(这个字段表示的是程序执行入口的地址,相对于C语言的main函数的地址)接着分析:
所对应的16进制代码为0x00001869h:
这个地址对应的是程序对应的默认装入的起始地址为0x00001869h;
接着分析下一个字段BaseOfCode(这个字段指向的是程序的代码段起始地址):
可以看到所对应的16进制代码为0x00001000h
接着转到SizeOfData字段(这一字段指向的是程序代码的数据段起始地址)分析:
下面的这一个是SizeOfData字段对应的16进制代码:
这一个字段(ImageBase字段)所对应的是内存映像的基址:
什么是内存映像?
https://baike.baidu.com/item/%E5%86%85%E5%AD%98%E6%98%A0%E5%83%8F/9046372?fr=aladdin
PE结构分析(二)的更多相关文章
- [PE结构分析] 7.相对虚拟地址(RVA)和文件偏移间的转换
RVA是相对虚拟地址(Relative Virtual Address)的缩写.RVA是当PE 文件被装载到内存中后,某个数据位置相对于文件头的偏移量. 例如:导入表的位置和大小可以从PE文件头中IM ...
- [PE结构分析] 10.基址重定位
源代码如下: typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD Type ...
- [PE结构分析] 9.导出表 IMAGE_EXPORT_DIRECTORY
typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // 未使用,总为0 DWORD TimeDateStamp; // 文 ...
- [PE结构分析] 8.输入表结构和输入地址表(IAT)
在 PE文件头的 IMAGE_OPTIONAL_HEADER 结构中的 DataDirectory(数据目录表) 的第二个成员就是指向输入表的.每个被链接进来的 DLL文件都分别对应一个 IMAGE_ ...
- [PE结构分析] 6.IMAGE_SECTION_HEADER
IMAGE_SECTION_HEADER 的源代码如下: typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAM ...
- [PE结构分析] 5.IMAGE_OPTIONAL_HEADER
结构体源代码如下: typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // +18h WORD Magic; // 标志字, ...
- [PE]结构分析与代码实现
PE结构浅析 知识导向: 程序最开始是存放在磁盘上的,运行程序首先需要申请4GB的内存,将程序从磁盘copy到内存,但不是直接复制,而是进行拉伸处理. 这也就是为什么会有一个文件中地址和一个Virtu ...
- [PE结构分析] 11.资源表结构
资源表是一个树形结构,可以设置成2的31次方的层数,Windows 使用了3级: 类型->名称->语言 其中涉及到四个结构: Data Description Resource Direc ...
- PE文件格式详解,第二讲,NT头文件格式,以及文件头格式
PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...
随机推荐
- 安装并运行Nacos
方式一:源码或者安装包 一.下载源码或者安装包 git clone https://github.com/alibaba/nacos.git 二.安装 cd nacos/ mvn -Prelease- ...
- SpringBoot整合MyBatis-Plus框架(代码生成器)
MyBatis-Plus的简介 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 代码生成器 通用的CU ...
- Windows开发常用快捷键
毕业后一直在从事Windows开发工作,掌握些常用的Windows快捷键可以大大的提升工作效率,同时还能秀一波操作.本文记录在工作中常用的Windows快捷键,以及VS常用快捷键.掌握了这些键盘操作, ...
- .NET Core Generic Host项目使用Topshelf部署为Windows服务
1..NET Core Generic Host是什么? 在.NET Core 2.1版本加入了一种新的Host,即Generic Host(通用主机). 现在在2.1版本的Asp.Net Core中 ...
- HDOJ-3001(TSP+三进制状态压缩)
Traving HDOJ-3001 这题考察的是状态压缩dp和tsp问题的改编 需要和传统tsp问题区分的事,这题每个点最多可以经过两次故状态有3种:0,1,2 这里可以模仿tsp问题的二进制压缩方法 ...
- POJ-1797(最短路变形-dijkstra)
Heavy Transportation POJ-1797 这题是最短路题型的变形,该题不是求起点到终点的最短路,而是求路径中的最小边的最大值. 这题的求解思路是:将原来dijkstra中的松弛方程改 ...
- STL中常用容器及操作 学习笔记1
@[TOC](下面介绍STL中常见的容器及操作)## 不定长数组 vector> vetcor:其实就是一个数组或者说是容器 其操作不同于之前直接定义的数组 > 而且可以直接赋值也可以直接 ...
- drf给上传图片重命名
1.先在你项目中添加一个文件夹如:system 在文件夹下添加__init__.py 和storage.py文件,并在storage.py中添加如下代码: #复制代码 -- coding: UTF-8 ...
- JVM 中的垃圾回收
说到JVM,总是绕不开垃圾回收,因为其是JVM的核心之一,因为对象的创建是非常频繁的,想要提高程序的执行效率,拥有一个高效的垃圾回收机制是必不可少的. 首先要明确,因为对象的创建只在堆中,所以垃圾回收 ...
- I - Tetrahedron HDU - 6814
题目链接:https://vjudge.net/problem/HDU-6814 题意:在[1,n]中随机取三个数a,b,c作为直角四面体的三条直角棱,求顶点d到ABC面的高的倒数平方的数学期望. 思 ...