如何做好网站建设的关键重点,网页视频下载插件手机版,wordpress 最强主题,物流系统规划课程建设网站写在前面
对于Windows PE文件结构#xff0c;个人认为还是非常有必要掌握和了解的#xff0c;不管是在做逆向分析、免杀、病毒分析#xff0c;脱壳加壳都是有着非常重要的技能。但是PE文件的学习又是一个非常枯燥过程#xff0c;希望本文可以帮你有一个了解。
PE文件结构…写在前面
对于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 ProgramIMAGE_DEBUG_TYPE这里可以忽略是调试类型对应debug和relese。 在二进制中查看以4D 5A开头,十六进制转ASCII码就是MZ是MS-DOS设计者名字缩写 在010 editor或者peview中可以看到header占位在00000000-0000003C,而整个大小是64字节额外需要注意的字节顺序以小尾方式存在。 来看具体的IMAGE_DOS_HEADER是在winnt.h中定义对于我们来说我们只关心两个参数e_magic是程序的头指纹和e_lfanew是指向真正PE头偏移地址。 这里我们可以尝试修改上面程序将除了e_magic和e_lfanew对应的地址全部修改成0,可以看到程序还是可以正常运行。所以有用的数据只占6个字节e_magic为WORD型占2个字节e_lfanew为DWORD型占4个字节 MS-DOS stub Program是DOS头的代码块告诉用户程序不能在DOS下运行。
NT头(PE头)
PE头以50 45 00 00 开头,也就是PE… 来看下PE头结构IMAGE_NT_HEADERS包括3个部分Signature,IMAGE_FILE_HEADER,IMAGE_OPTIONAL_HEADER32(或64)而PE…就是Signature字段这个字段是PE文件标准特征是不能进行修改的强行修改后程序无法正常运行。 IMAGE_FILE_HEADER共20字节其中重要有4个部分从010editor中可以看到Machine,NumberOfSections,TimeDateStamp,Characteristics这4个部分是最重要的。
Machine
共4个字节头两个字节表示机器类型用于标识CPU的类型后两个字节表示CPU为Intel 386或后继处理器及其兼容处理器。具体机器类型的值可以在010中自行查看。
NumberOfSections
表示节的数目,这里的节的数目指的就是区段表的数量这里我们显示5说明有个区段表数。
也可以利用lordpe查看区段表。
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:大尾方式
再来看看PE头下的可选头IMAGE_OPTIONAL_HEADER,它是PE头部重要的部分之所以被称为可选头是指该结构体的部分数据在不同文件中是不同的。
同样对照010中对不同的PE文件可进行分析查看修改。
节表
PE文件所有的节属性都定义节表中节表是由IMAGE_SECTION_HEADER结构排列而组成的且节表的位置在MS-DOSPE头下面。
IMAGE_SECTION_HEADER结构
对于上面的字段来说我们来说一说重要的的字段。在说字段前再把三个地址概念复习下,后面会具体说地址转换计算。 1.VAVirtualAddress虚拟内存地址范围00000000h - 0fffffffh就是进程的基地址 RVA相对虚拟内存地址。 2.RVA相对虚拟内存地址。 是PE文件中的数据、模块等运行在内存中的实际地址相对PE文件装载到内存的基址之间的距离。如果PE文件装入虚拟地址(VA)空间的400000h处且进程从虚址401000h开始执行我们可以说进程执行起始地址在RVA 1000h。 3.FOA文件偏移地址文件头的偏移地址。
NAME
8个字节ASCII的名称必须要8个字节不够可以用null值来填充这里的名称可以自己起也可以编译器来定义。
VirtualSize
对应表的区块的大小这是区块的数据在没有进行对齐处理前的实际大小通俗的来说就是节的数据真实大小。
VirtualAddress
该区块装载到内存中的RVA 地址。
SizeOfRawData
文件偏移量文件大小
PointerToRawData
指出节在磁盘文件中所处的位置。这个数值是从文件头开始算起的偏移量。
Characteristics
节的属性可读写等。
地址转换
前面说到三个地址学习地址转化可以对程序的一些功能修改或添加地址转化非常重要后面的加密对壳的操作对感染性病毒修复都非常关键。 还是以前面的程序节表来看。
我们来计算hello world!字符串偏移地址。
首先可以看到字符串起始位置是983006结束在983011。
计算过程
1.通过VA转RVA 用起始位置-程序入口地址程序入口地址980000,也就是 983006-980000 3006 RVA地址 这里说明一点计算是十六进制计算后面都一样。
2.找RVA所在的节 可以看到3006是在.data0983000到0098400之间所以所属的节是.data 3.计算.data节起始的RVA和起始的FOA的差值 3000-A002600
4.通过RVA减去差值 3006-2600 A06 用010打开exe程序可以看到字段起始和我们计算出来的一致
在lordpe中直接算偏移量,可以看到和我们算出的一致。
添加节给程序做入口弹框
对于加壳保护病毒来说一般情况下都会添加节会将可执行程序保护的代码或者将病毒代码写在新添加的节中。 步骤1.增加节表项2.修正文件的映像程度3.修正一个节的数量4.增加文件的节数据。
以PEview程序为例添加一个弹框。 用lordpe打开程序首先看到区段表数量是5 选择一个表名称右键-添加区段
将所有的地址记下来 00015000 00000000 00010A00 00000000 E00000E0 对于不清楚含义的可以再回头看看
先将映射入内存后的长度虚拟大小改为1000将磁盘文件中的长度物理大小改为200
在区段标志节属性中将可写和初始化去掉节属性变成60000020。
字节大小转换 前面我们插入200长度大小为16进制转换成10进制为512个字节 将程序使用010打开在文件末尾添加512个字节可以看到最末一个是109FF,109FF1刚好是10A00
所以添加数据从最后一位插入512个字节数据
修正大小前面将虚拟内存的大小修改为1000镜像大小还是15000发现程序是无法运行的
将镜像大小修正为16000
再次打开可以运行
接下来添加我们需要的程序。 反编译进行调试发现程序入口的位置是00401000再往下走程序就运行了。
前面我们说过程序的入口是imagebase基地址entrypoint入口点组成我们回头再验证一下加起来为00401000一致。
所以需要程序从我们给添加的节开始执行我们添加的节是00015000所以需要让入口点修改为我们的节地址。新的入口点00415000。
选定00415020右键转储跟随选定的地址。
编辑内容同样在00415030出编辑内容。
在程序入口处00415000写入弹框
然后再入口处F8单步调试发现成功弹框。
然后还没有成功这里只是弹框没有打开我们PEview主程序还需要进行跳转跳转的位置就是最开始的00401000这个位置jmp 00401000,然后步入可以发现主程序打开。
接着保存数据修改的数据全部选中右键复制到可执行文件
右键保存文件 就完成了通过添加节添加一个弹框案例。
后记
WindosPE文件结构还有几个节表本次没有涉及到后面可以自行了解。对于逆向来说PE文件结构是基础中的基础不仅要对汇编熟悉还要懂得调试程序后面我会讲讲脱壳加壳的内容。大家一起努力吧
后记
WindosPE文件结构还有几个节表本次没有涉及到后面可以自行了解。对于逆向来说PE文件结构是基础中的基础不仅要对汇编熟悉还要懂得调试程序后面我会讲讲脱壳加壳的内容。大家一起努力吧
##最后 对于从来没有接触过网络安全的同学我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线大家跟着这个大的方向学习准没问题。 同时每个成长路线对应的板块都有配套的视频提供 当然除了有配套的视频同时也为大家整理了各种文档和书籍资料工具并且已经帮大家分好类了。 因篇幅有限仅展示部分资料有需要的小伙伴可以【扫下方二维码】免费领取