PE知识总结(小甲鱼教程)

2024-03-20 22:32
文章标签 总结 教程 知识 pe 甲鱼

本文主要是介绍PE知识总结(小甲鱼教程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、PE的基本概念:

   1)PE文件中的数据结构一般都有32位 和 64位 之分,一般会在名称上表现出来。

   2)PE文件使用的是一个平面地址空间,线性的,所有的代码和数据合并在一起。

   3)文件的内容被划分成区块,以 页边界 对齐

   4)每个块有自己在内存中的一套属性——是否可读 或 只读。

   5)PE文件不是作为单一内存映射文件被装入内存

   6)Windows加载器(PE加载器)遍历PE文件,决定文件的哪一部分被映射,这种映射方式是将文件较高的偏移位置映射到较高的内存地址中。

   7)当磁盘文件一旦被装入内存中,磁盘上的数据结构布局和内存中的数据结构布局是一致的。

   8)基地址、相对虚拟地址、文件偏移地址

基地址   —— 在Windows NT上是模块的句柄

虚拟地址 —— 某一虚拟地址相对基地址的偏移

偏移地址 —— 从0开始

    Ps:   分析PE,就是了解结构体的构造,成员,它们是怎么存放,怎么索引,我们就能了解什么是PE感染、PE变位、如何伪装PE、如何在PE文件里加入隐秘的东西,如何加密、解密。

 

二、MS-DOS头部

每个PE文件是以一个DOS程序开始的,为了适应在DOS下执行。

PE文件的第一个字节起始于一个传统的MS-DOS头部,被称作IMAGE_DOS_HEADER(事实上它是一个结构体)

IMAGE_DOS_HEADER有两个重要的结构体。

e_magic      ;//MZ(4Dh 5Ah) DOS可执行文件标记

e_lfanew     ;//32位指针 指向PE文件头,这个成员相对于DOS的偏移永远是3ch

 

三、PE文件头

PE文件头是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称,里面包含着许多PE装载器用到的重要字段。

程序在执行时,PE装载器将从IMAGE_DOS_HEADER结构中的e_lfanew字段里找到 PEHeader的起始偏移量,加上基地址就得到PE文件头的指针。

IMAGE_NT_HEADER结构

Signature   //在一个有效的PE文件里,Signature字段被设置位00004550h,ASCII码字符是“PE00”.标志着PE文件头的开始。

IMAGE_FILE_HEADER    FileHeader  //

     1.WORD    Machine               ;//运行平台    

     2.WORD    NumberOfSections      ;//文件的区块数目

     3.DWORD   TimeDateStamp         ;//文件创建日期和时间(以秒来算,VC的话可以用_ctime函数 或者 gmtime函数)

     4.DWORD   PointerToSymbolTable  ;//指向符号表(主要用于调试)

     5.DWORD   NumberOfSymbols       ;//符号表中符号个数(主要用于调试)

     6.WORD SizeOfOptionalHeader  ;//IMAGE_OPTIONAL_HEADER32结构大小。

     7.WORD    Characteristics       ;//文件属性

IMAGE_OPTIONAL_HEADER32    OptionalHeader

https://www.cnblogs.com/kuangke/p/5393514.html

在这个结构体中需要注意的成员,这些值是文件运行必需的,设置错误将导致文件无法正常运行。

           1.Magic  为IMAGE_OPTIONAL_HEADER32结构体是,Magic码为10B;为IMAGE_OPTIONAL_HEADER64结构体时,Magic码为20B。

            2.AddressOfEntryPoint     持有EP的RVA值。该值指出程序最先执行的代码起始地址。

            3.ImageBase     进程虚拟内存的范围是0~FFFFFFFF(32位系统)。PE文件被加载到如此大的内存中时,ImageBase指出文件的优先装入地址。

 

 

            4.SectionAlignment,FileAlignment     PE文件的Body部分划分若干节区,这些节存储着不同类别的数据。FileAlignment指定了节区在磁盘文件中的最小单位,而SectionAlignment则指定了节区在内存中的最小单位(一个文件中,FileAlignment和SectionAlignment的值可能相同,也可能不同)。磁盘文件或内存的节区大小必定位FileAlignment或SectionAlignment值的整数倍。

IMAGE_OPTIONAL_HEADER32成员1

            Ps:    DataDirectory是由IMAGE_DATA_DIRECTORY结构体组成的数组,最重要的字段之一,由16个相同的IMAGE_DATA_DIRECTORY结构体组成。其定义很简单,只有两个,仅仅指出了某种数据块的位置和,其用途是用来定义多种不同用途的数据块的位置和长度。例如导出表、导入表、资源、重定位表等数据块。

           IMAGE_DATA_DIRECTORY STRUCT

                           VirtualAddress    DWORD    ?    ;数据的起始RVA

                            isize    DWORD    ?    ;数据块的长度

           IMAGE_DATA_DIRECTORY end

图片:数据目录列表

 

 

四、块表

1.PE文件到内存的映射

①系统装载可执行文件的方法又不完全等同于内存映射文件。

②当使用内存映射文件的时候,系统对“原著”相当忠实。如果将磁盘文件和内存影响比较的话,可以发现不管是数据本身还是数据之间的相对位置都是完全相同的。

③Windows装载器在装载DOS部分、PE文件头部分和节表(区块表)部分是不进行任何特殊处理的,而在装载节(区块)的时候则会自动按节(区块)的属性做不同的处理。

一般情况下,它会处理以下几个方面的内容:

        内存页的属性

       节的偏移地址

       节的尺寸

       不进行映射的节

处理内容详解:

https://www.cnblogs.com/mayingkun/p/4200026.html

 

2.区块表(节表)和 区块(节)

https://www.cnblogs.com/kuangke/p/5406047.html

区块是可执行文件真正保存内容的东西

 

3.区块描述、对齐值以及RVA详解

https://www.cnblogs.com/kuangke/p/5410643.html

 

PE类型的病毒是在执行PE文件的时候,先执行病毒代码,再执行PE

 

4.输入表(导入表)详解

https://www.cnblogs.com/kuangke/p/5410650.html (上)

https://www.cnblogs.com/kuangke/p/5411547.html (下)

 

5.输出表(导出表)详解

https://www.cnblogs.com/kuangke/p/5419120.html

INT不可以改,IAT可以改

 

6.基址重定位

https://www.cnblogs.com/kuangke/p/5436807.html

 

7.资源

https://blog.csdn.net/dazhiliudazhi/article/details/24438623

 

当页对齐和文件对齐一样时,不需要转换找地址。

 

这篇关于PE知识总结(小甲鱼教程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830967

相关文章

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

Python使用pysmb库访问Windows共享文件夹的详细教程

《Python使用pysmb库访问Windows共享文件夹的详细教程》本教程旨在帮助您使用pysmb库,通过SMB(ServerMessageBlock)协议,轻松连接到Windows共享文件夹,并列... 目录前置条件步骤一:导入必要的模块步骤二:配置连接参数步骤三:实例化SMB连接对象并尝试连接步骤四: