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:本篇博客 ...
随机推荐
- Vue使用 空白占位符
当有时候需要在页面显示时显示空格时,可以使用 ,但是使用这个占位符时,无论写多少个,就只能显示一个空格.要想显示多个空格进行占位,这种方式显然是可行的,解决方法是使用转义字符. 先看代码: <t ...
- eclipse从接口快速跳转到实现类
1.只跳转到实现类上 按住Ctrl键,把鼠标的光标放在要跳转的接口上面,选择第二个 2.直接跳转大实现的方法上 按住Ctrl键,把鼠标的光标放在要跳转的方法上面,选择第二个 对比可以发现,操作都是一样 ...
- 后端程序员之路 37、Akka、Actor、Scala初窥
Akkahttp://akka.io/ Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用,是一个广泛运用的分布式应用框架. ...
- Django 报错 Reverse for 'content' not found. 'content' is not a valid view function or pattern name.
Django 报错 Reverse for 'content' not found. 'content' is not a valid view function or pattern name. 我 ...
- Excel技巧—开始菜单之格式刷六大功能
转: Excel技巧-开始菜单之格式刷六大功能 点赞再看,养成习惯:千里之行,始于足下. 微信搜索[亦心Excel]关注这个不一样的自媒体人. 本文 GitHub https://github.com ...
- vs2019远程调试
VS2019远程调试 这几天遇到个很是纠结的问题,同样的源代码,放在测试服务器,完美运行.但是上线正式环境就是死活显示不出来.于是想到了微软的远程调试功能,这里用VS2019举例. 下载远程访问工具 ...
- 第01章-Java SE8的流库
从迭代到流的操作 流表面上看起来和集合很类似,都可以让我们转换和获取数据,但是它们之间存在着显著的差异 流并不存储其元素,这些元素可能存储在底层的集合中,或者是按需生成的 流的操作不会修改其数据源 流 ...
- MySQL全面瓦解24:构建高性能索引(策略篇)
学习如果构建高性能的索引之前,我们先来了解下之前的知识,以下两篇是基础原理,了解之后,对面后续索引构建的原则和优化方法会有更清晰的理解: MySQL全面瓦解22:索引的介绍和原理分析 MySQL全面瓦 ...
- 如何优雅的移植JavaScript组件到Blazor
Blazor作为一个新兴的交互式 Web UI 的框架,有其自身的优缺点,如果现有的 JavaScript 组件能移植到 Blazor,无疑让 Blazor 如虎添翼,本文就介绍一下自己在开发 Bul ...
- 【翻译】内部API的价值
内部api的设计,主要是为了简化软件的开发,简化系统和操作过程.目前绝大多数用例是这样的. 内部api经常被忽略,因为它们是针对内部开发人员的.这种类型的api通常使用于特定公司及其部门的专用数据.尽 ...