在表中,我们知道了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结构分析(二)的更多相关文章

  1. [PE结构分析] 7.相对虚拟地址(RVA)和文件偏移间的转换

    RVA是相对虚拟地址(Relative Virtual Address)的缩写.RVA是当PE 文件被装载到内存中后,某个数据位置相对于文件头的偏移量. 例如:导入表的位置和大小可以从PE文件头中IM ...

  2. [PE结构分析] 10.基址重定位

    源代码如下: typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD Type ...

  3. [PE结构分析] 9.导出表 IMAGE_EXPORT_DIRECTORY

    typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // 未使用,总为0 DWORD TimeDateStamp; // 文 ...

  4. [PE结构分析] 8.输入表结构和输入地址表(IAT)

    在 PE文件头的 IMAGE_OPTIONAL_HEADER 结构中的 DataDirectory(数据目录表) 的第二个成员就是指向输入表的.每个被链接进来的 DLL文件都分别对应一个 IMAGE_ ...

  5. [PE结构分析] 6.IMAGE_SECTION_HEADER

    IMAGE_SECTION_HEADER 的源代码如下: typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAM ...

  6. [PE结构分析] 5.IMAGE_OPTIONAL_HEADER

    结构体源代码如下: typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // +18h WORD Magic; // 标志字, ...

  7. [PE]结构分析与代码实现

    PE结构浅析 知识导向: 程序最开始是存放在磁盘上的,运行程序首先需要申请4GB的内存,将程序从磁盘copy到内存,但不是直接复制,而是进行拉伸处理. 这也就是为什么会有一个文件中地址和一个Virtu ...

  8. [PE结构分析] 11.资源表结构

    资源表是一个树形结构,可以设置成2的31次方的层数,Windows 使用了3级: 类型->名称->语言 其中涉及到四个结构: Data Description Resource Direc ...

  9. PE文件格式详解,第二讲,NT头文件格式,以及文件头格式

    PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...

随机推荐

  1. MySQL如何搭建主库从库(Docker)

    目录 MySQL主从搭建 一.主从配置原理 二.操作步骤 1.创建主库和从库容器 2.启动主从库容器 3.远程连接并操作主从库 4.测试主从同步 MySQL主从搭建 一.主从配置原理 mysql主从配 ...

  2. go mod包管理 加代理下载

    原始go.mod文件 module xxx go 1.14 报错 i/o timeout go mod init workorder go mod init: go.mod already exist ...

  3. CentOS rpm常用功能记录

    CentOS7主要有rpm和yum这两种包软件的管理.两者有功能上的区别,其中主要区别是:yum使用简单但需要联网,yum会去网上包源去获取所需要的软件包.而rpm的需要做的事情就更细一些,比如我们需 ...

  4. 如何在 ASP.NET Core 中写出更干净的 Controller

    你可以遵循一些最佳实践来写出更干净的 Controller,一般我们称这种方法写出来的 Controller 为瘦Controller,瘦 Controller 的好处在于拥有更少的代码,更加单一的职 ...

  5. Picgo + Gitee +Typora(自动上传)搭建markdown免费图库

    Picgo + Gitee +Typora(自动上传)搭建markdown免费图库 前言: ​ 在写博客的是时候,之前那都是直接在博客网站上面写好了,再一一插入图片,当要在同时2个以上的博客上面发表的 ...

  6. python3+tkinter实现的黑白棋,代码完整 100%能运行

    今天分享给大家的是采用Python3+tkinter制作而成的小项目--黑白棋 tkinter是Python内置的图形化模块,简单易用,一般的小型UI程序可以快速用它实现,具体的tkinter相关知识 ...

  7. for遍历是如何判断数据是不是list的最后一位

    //listUser 是User的实体的集合for(User user : listUser){ if(listUser.size - 1 == listUser.indexOf(user)){ // ...

  8. vscode配置golang开发环境手把手描述篇

    1.下载安装Golang https://golang.google.cn/dl/ 一路下一步即可 2.下载安装Vscode https://visualstudio.microsoft.com/zh ...

  9. reverseLinkedList(翻转链表)

    ReverseLinkedList(翻转链表) 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.非连续.非顺序指的是,通过指针把一组零散的内存块串 ...

  10. python类属性

    类属性 类属性分为共有属性和私有属性. 私有属性的定义方法eg:__age(若无次定义则默认为公有属性) 类属性举例: class people: name = "china" _ ...