逆向之Windows PE结构

news2024/11/19 15:38:18

写在前面

对于Windows
PE文件结构,个人认为还是非常有必要掌握和了解的,不管是在做逆向分析、免杀、病毒分析,脱壳加壳都是有着非常重要的技能。但是PE文件的学习又是一个非常枯燥过程,希望本文可以帮你有一个了解。

PE文件结构的基本介绍

先来大概说说什么是PE文件格式,PE(Portable
Executable),也就是我们说的可执行文件,在Windows中exe,dll,sys,ocx文件都是PE文件格式。而PE文件结构就是所有的PE文件按照结构的方式组织是有规律的排列组成。
从整个PE件结构大概来分成2部分,PE头和PE体。PE头又存在MS-
DOS头和NT头(PE头),PE体主要就是一些表结构构成,存放代码,数据,资源等。后面我们开始对这些信息进行逐一分析和讲解。

MS-DOS头

首先来看DOS头,DOS头位于整个PE文件的首位部分,是PE文件结构的第一个头,对于现在的系统来说,作用就是用来定位真正的PE头。在peview中可以看到对应IMAGE_DOS_HEADER和MS-
DOS Stub Program,IMAGE_DEBUG_TYPE这里可以忽略,是调试类型,对应debug和relese。
图片.png
在二进制中查看,以4D 5A开头,十六进制转ASCII码就是MZ,是MS-DOS设计者名字缩写
image
在010
editor或者peview中,可以看到header占位在00000000-0000003C,而整个大小是64字节,额外需要注意的字节顺序,以小尾方式存在。
image
来看具体的IMAGE_DOS_HEADER是在winnt.h中定义,对于我们来说,我们只关心两个参数,e_magic是程序的头指纹和e_lfanew是指向真正PE头偏移地址。
image
这里我们可以尝试修改上面程序,将除了e_magic和e_lfanew对应的地址全部修改成0,可以看到程序还是可以正常运行。所以有用的数据只占6个字节(e_magic为WORD型占2个字节,e_lfanew为DWORD型占4个字节)
image
image
MS-DOS stub Program是DOS头的代码块,告诉用户程序不能在DOS下运行。
image

NT头(PE头)

PE头以50 45 00 00 开头,也就是PE…
image
来看下PE头结构IMAGE_NT_HEADERS,包括3个部分,Signature,IMAGE_FILE_HEADER,IMAGE_OPTIONAL_HEADER32(或64),而PE…就是Signature字段,这个字段是PE文件标准特征,是不能进行修改的,强行修改后程序无法正常运行。
image
IMAGE_FILE_HEADER共20字节,其中重要有4个部分,从010editor中可以看到Machine,NumberOfSections,TimeDateStamp,Characteristics这4个部分是最重要的。
image
image

Machine

共4个字节头两个字节表示机器类型,用于标识CPU的类型,后两个字节表示CPU为Intel
386或后继处理器及其兼容处理器。具体机器类型的值可以在010中自行查看。
image

NumberOfSections

表示节的数目,这里的节的数目指的就是区段表的数量,这里我们显示5,说明有个区段表数。
image

也可以利用lordpe查看区段表。
image

TimeDateStamp

为时间戳,也就是PE文件创建的时间。

Characteristics

文件属性的标志,共15个常用属性标志,每个bit都有不同含义,如下在010中可以看到:
我们从上往下进行看:
IMAGE_FILE_RELOCS_STRIPPED:为1表示文件中没有重定向信息
IMAGE_FILE_EXECUTABLE_IMAGE:为1表示该文件是可执行文件
IMAGE_FILE_LINE_NUMS_STRIPPED:为1表示文件中不存在行信息
IMAGE_FILE_LOCAL_SYMS_STRIPPED:为1表示没有局部符号信息
IMAGE_FILE_AGGRESIVE_WS_TRIM:表示调整工作集
IMAGE_FILE_LARGE_ADDRESS_AWARE:为1表示程序能处理大于2G的地址
IMAGE_FILE_BYTES_REVERSED_LO:小尾方式
IMAGE_FILE_32BIT_MACHINE:为1只在32位平台上运行
IMAGE_FILE_DEBUG_STRIPPED:为1不包含调试信息
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP:为1不能从可移动盘运行
IMAGE_FILE_NET_RUN_FROM_SWAP:为1不能从网络运行
IMAGE_FILE_SYSTEM:为1表示文件为系统文件而不是程序
IMAGE_FILE_DLL:为1表示是一个dll文件
IMAGE_FILE_UP_SYSTEM_ONLY:为1表示文件只能运行于单处理器机器上
IMAGE_FILE_BYTES_REVERSED_HI:大尾方式
image

再来看看PE头下的可选头IMAGE_OPTIONAL_HEADER,它是PE头部重要的部分,之所以被称为可选头是指该结构体的部分数据在不同文件中是不同的。
image

同样,对照010中对不同的PE文件可进行分析查看修改。
image

节表

PE文件所有的节属性都定义节表中,节表是由IMAGE_SECTION_HEADER结构排列而组成的,且节表的位置在MS-DOS+PE头下面。
image

IMAGE_SECTION_HEADER结构
image

对于上面的字段来说,我们来说一说重要的的字段。在说字段前,再把三个地址概念复习下,后面会具体说地址转换计算。
1.VA:VirtualAddress虚拟内存地址,范围00000000h - 0fffffffh,就是进程的基地址 + RVA相对虚拟内存地址。 2.RVA:相对虚拟内存地址。 是PE文件中的数据、模块等运行在内存中的实际地址相对PE文件装载到内存的基址之间的距离。如果PE文件装入虚拟地址(VA)空间的400000h处,且进程从虚址401000h开始执行,我们可以说进程执行起始地址在RVA 1000h。 3.FOA:文件偏移地址,文件头的偏移地址。

NAME

8个字节ASCII的名称,必须要8个字节,不够可以用null值来填充,这里的名称可以自己起也可以编译器来定义。
image

VirtualSize

对应表的区块的大小,这是区块的数据在没有进行对齐处理前的实际大小,通俗的来说就是节的数据真实大小。

VirtualAddress

该区块装载到内存中的RVA 地址。

SizeOfRawData

文件偏移量(文件大小)

PointerToRawData

指出节在磁盘文件中所处的位置。这个数值是从文件头开始算起的偏移量。

Characteristics

节的属性,可读写等。

地址转换

前面说到三个地址,学习地址转化可以对程序的一些功能修改或添加,地址转化非常重要,后面的加密,对壳的操作,对感染性病毒修复都非常关键。
还是以前面的程序节表来看。
image

我们来计算hello world!字符串偏移地址。
image

首先可以看到字符串起始位置是983006,结束在983011。
image

计算过程:

1.通过VA转RVA
用起始位置-程序入口地址,程序入口地址980000,也就是
983006-980000 = 3006 RVA地址
这里说明一点,计算是十六进制计算,后面都一样。

2.找RVA所在的节
可以看到3006是在.data0983000到0098400之间,所以所属的节是.data
image
3.计算.data节起始的RVA和起始的FOA的差值
3000-A00=2600

4.通过RVA减去差值
3006-2600 = A06
用010打开exe程序,可以看到字段起始和我们计算出来的一致
image

在lordpe中直接算偏移量,可以看到和我们算出的一致。
image

添加节,给程序做入口弹框

对于加壳保护,病毒来说,一般情况下都会添加节,会将可执行程序保护的代码或者将病毒代码写在新添加的节中。
步骤:1.增加节表项;2.修正文件的映像程度;3.修正一个节的数量;4.增加文件的节数据。

以PEview程序为例,添加一个弹框。
用lordpe打开程序,首先看到区段表数量是5
image
选择一个表名称,右键-添加区段
image

将所有的地址记下来
00015000 00000000 00010A00 00000000 E00000E0
对于不清楚含义的可以再回头看看
image

先将映射入内存后的长度(虚拟大小)改为1000,将磁盘文件中的长度(物理大小)改为200
image

在区段标志(节属性)中,将可写和初始化去掉,节属性变成60000020。
image

字节大小转换:
前面我们插入200长度大小,为16进制,转换成10进制为512个字节
将程序使用010打开,在文件末尾添加512个字节,可以看到最末一个是109FF,109FF+1刚好是10A00
image

所以添加数据从最后一位插入512个字节数据
image

修正大小,前面将虚拟内存的大小修改为1000,镜像大小还是15000,发现程序是无法运行的
image

将镜像大小修正为16000
image

再次打开可以运行
image

接下来添加我们需要的程序。
反编译进行调试,发现程序入口的位置是00401000,再往下走程序就运行了。
image

前面我们说过程序的入口是imagebase(基地址)+entrypoint(入口点)组成,我们回头再验证一下,加起来为00401000一致。
image

所以需要程序从我们给添加的节开始执行,我们添加的节是00015000,所以需要让入口点修改为我们的节地址。新的入口点00415000。
image

选定00415020,右键转储跟随选定的地址。
image

编辑内容,同样在00415030出编辑内容。
image

在程序入口处00415000写入弹框
image

然后再入口处F8单步调试,发现成功弹框。
image

然后还没有成功,这里只是弹框,没有打开我们PEview主程序,还需要进行跳转,跳转的位置就是最开始的00401000这个位置,jmp
00401000,然后步入,可以发现主程序打开。
image

接着保存数据,修改的数据全部选中,右键复制到可执行文件
image

右键保存文件
image
就完成了通过添加节,添加一个弹框案例。

后记

WindosPE文件结构还有几个节表本次没有涉及到,后面可以自行了解。对于逆向来说,PE文件结构是基础中的基础,不仅要对汇编熟悉,还要懂得调试程序,后面我会讲讲脱壳加壳的内容。大家一起努力吧!

后记

WindosPE文件结构还有几个节表本次没有涉及到,后面可以自行了解。对于逆向来说,PE文件结构是基础中的基础,不仅要对汇编熟悉,还要懂得调试程序,后面我会讲讲脱壳加壳的内容。大家一起努力吧!

##最后
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【扫下方二维码】免费领取:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

buu [NCTF2019]babyRSA 1

题目描述: 题目分析: 首先明确两个公式: e*d 1 mod (p-1)(q-1) ed1 e*d - 1 k(p-1)(q-1)想要解出此题,我们必须知道n,而要知道n,我们要知道p和q的值通过 e*d 的计算,我们知道其长度为2066位,而生成p的…

《分布式技术原理与算法解析》学习笔记Day22

哈希与一致性哈希 在分布式系统中,哈希和一致性哈希是数据索引或者数据分布的常见实现方式。 数据分布设计原则 在分布式数据存储系统中,做存储方案选型时,一般会考虑以下因素: 数据均匀数据稳定节点异构性隔离故障域性能稳定…

Delphi Http Https 最好的解决方法(三) LoadLibrary扩展

开发环境: Delphi XE 10.1 Berlin 前提文章: Delphi Http Https 最好的解决方法(二) 目录 1. 项目描述 2. 问题描述 3. 解决方案 3.1 主程序在导入dll方法单元处理(不推荐) 3.2 在dll的工程文件处加入(不推荐) 3.3 在dll的工程文件获取dll(HelpTool.dll)的当前路径(推荐方…

gitlab 安装到项目上传一篇解决

文章目录1.安装1.1创建挂载目录1.2启动1.3 配置gitlab查看docker admin 账户初始密码注册普通用户2.1进入注册2.2创建后通过登录admin审批3.2 步骤13.2 步骤23.3步骤33.4 项目添加成员4 使用成员用户,上传到新建的项目中4.1 复制项目地址4.2使用 git here 克隆项目4.3进入下载目…

读懂分布式事务

一、概述 1.1 什么是分布式事务 事务我们都很熟悉,事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成这组操作的各个单元,要么全部成功,要么全部失败。 事务有四大特性: Atomic&#xf…

rabbitmq安装和thinkphp6简单操作思路

1、安装rabbitmq 2、crontab定时检测rabbtimq状态 2、使用thinphp6.0框架rabbitmq示例,supervisor守护消费者 3、RabbitMQ有四种交换机类型 rabbitmq组成部分如下: Broker:消息队列服务进程,此进程包括两个部分:Exchange和Que…

代码随想录算法训练营day42 |动态规划之背包问题 11.分割等和子集 1049. 最后一块石头的重量 II 494. 目标和

day4211.分割等和子集1.dp数组的含义2.确定递推公式3.dp数组初始化4.确定遍历顺序5.打印dp数组1049. 最后一块石头的重量 II1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组494. 目标和1.确定dp数组以及下标的含义2.确定递推公式3.…

Bootstrap系列之Flex布局

文章目录Bootstrap中的Flexd-flex与d-inline-flex也存在响应式变化flex水平布局flex垂直布局flex水平与垂直也存在响应式变化内容排列(justify-content响应式变化也存在于这里sm,md,lg,xl)子元素对齐方式Align items&a…

Oracle-00-卸载篇

这里给出企业级的Oracle 10g的卸教程,新安装的19c并没有正经去做卸载的操作,为了后面教程的进度,这里就先借用下10g,如果有需要会重新更新19c的卸载教程 windows服务中将Oracle所有服务全部停掉 选中Oracle - OraDb10g_home2->Oracle Installation Products->Univers…

文化:你所在的团队,有多少人敢讲真话?

你好,我是叶芊。 今天我们要讨论的话题是文化,说“文化”这个词你可能会觉得很虚,那我们换个词——“做事风格”,这就和你们团队平时的协作习惯密切相关了。 做事风格,往小了讲,会影响团队成员对开会的认知…

CV——day78 读论文:通过静态背景构建扩展低通道路边雷达的探测距离(目标是规避风险)

Extending the Detection Range for Low-Channel Roadside LiDAR by Static Background Construction 通过静态背景构建扩展低通道路边雷达的探测距离I. INTRODUCTIONII. RELATED WORKA. LiDAR-Based 3-D Vehicle and Road User DetectionB. LiDAR Data Background FilteringC.…

数据结构与算法之打家劫舍(一)动态规划思想

动态规划里面一部题目打家劫舍是一类经典的算法题目之一,他有各种各样的变式,这一篇文章和大家分享一下打家劫舍最基础的一道题目,掌握这一道题目,为下一道题目打下基础。我们直接进入正题。一.题目大家如果刚接触这样的题目&…

Linux小黑板(9):共享内存

"My poor lost soul"上章花了不少的篇幅讲了讲基于管道((匿名、命名))技术实现的进程间通信。进程为什么需要通信?目的是为了完成进程间的"协同",提高处理数据的能力、优化业务逻辑的实现等等,在linux中我们已经谈过了一个通信的大类…

数据库的基本查询

注意:LIMIT的两个参数,第一个是起始位置,第二个是一次查询到多少页。注意:什么类型的数字都是可以排序的。日期的降序是从现在到以前,MySQL ENUM值如何排序?在MYSQL中,我们知道每个ENUM值都与一…

安装MySQL数据库

安装MySQL数据库 获取软件:https://dev.mysql.com/downloads/mysql/ 下载完成后进行解压操作 若安装目录里没有my.ini配置文件,则需要新建一个my.ini的配置文件。 编辑my.ini配置文件,将配置文件中的内容修改成下面内容 [client] # 设置…

基于企业微信应用消息的每日早安推送

基于企业微信应用消息的每日早安推送 第一步:注册企业微信 企业微信注册地址:https://work.weixin.qq.com/wework_admin/register_wx 按照正常流程填写信息即可,个人也可以注册企业微信,不需要公司 注册完成后,登录…

户籍管理系统测试用例

目录 一、根据页面的不同分别设计测试用例 登录页面 用户信息列表 用户编辑页面 用户更新页面 二、根据目的不同分别设计测试用例 一、根据页面的不同分别设计测试用例 上图是针对一个网站的测试,按照页面的不同分别来设计对应的测试用例。 登录页面 用户信息列…

[MySQL]MySQL数据类型

文章目录数据类型分类数值类型tinyint类型bit类型float类型decimal类型字符串类型char类型varchar类型char和varchar对比日期和时间类型enum和set类型数据类型分类 MySQL中,支持各种各样的类型,比如表示数值的整型浮点型,文本、二进制类型、…

【密码学】 一篇文章讲透数字签名

【密码学】 一篇文章讲透数字签名 数字签名介绍 数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名…

问题解决:Excel中依据某一列数据进行匹配

问题描述Excel处理时,常常需要从一个大表里,按照条件提取子集。需要我们按照某一序列为标准,匹配筛选出有效信息,案例如下:依据名称匹配销售额。解决方法使用函数:VLOOKUP(lookup_value,table_array,col_in…