PE文件格式分析

第一阶段:PE文件格式分析

使用UltraEdit观察PE文件例子程序hello-2.5.exe的16进制数据,在打印稿中画出该PE文件基本结构。

使用Ollydbg对该程序进行初步调试,了解该程序功能结构,在内存中观察该程序的完整结构。 熟悉各类PE文件格式查看和编辑工具(PEView、Stud_PE等)。

使用UltraEdit修改该程序,使得该程序仅弹出第二个对话框。

第二阶段:熟悉并分析PE文件的引出表

找到系统System32目录下的user32.dll文件,用UltraEdit打开并分析该文件引出表,找出函数MessageBoxA的地址,并验证该地址是否正确。

第三阶段:熟悉并修改PE文件的引入表结构,以及代码段和数据段

手工修改hello-2.5.exe程序,使得其可以弹出第三个对话框

用UltraEdit修改hello-2.5.exe程序的引入表,使该程序仅可以从kernel32.dll中引入LoadLibrary和GetProcAddress函数,而不从user32.dll导入任何函数。然后,在代码节中写入部分代码利用这两个函数获取MessageBoxA的函数地址,使hello-2.5.exe程序原有功能正常。

第四阶段:熟悉并修改PE文件的资源表

利用PEview.exe熟悉PEview.exe程序的资源表的结构。

用UltraEdit修改PEview.exe,使得该文件的图标变成csWhu.ico。

熟悉eXeScope工具的使用,并利用该工具汉化PEview.exe程序。

第五阶段:思考

如何打造最小的PE文件:修改WHU_PE-2.5.exe文件,保持该文件的功能不变,使得该文件大小尽可能小。

替换程序的图标时,如果新图标比原有图标大,应该如何解决?

如何给一个没有图标的程序(如hello-2.5.exe),添加一个图标?

1.PE文件格式分析

代码节

引入函数节

已初始化的数据节

OD观察结构

STUDYPE

PEview

2.修改使只弹出第二个窗口:

查看到第二个窗口RVA为1016

在PE文件可选映像头AddressofEntryPoint处(大小4字节,偏移10H)修改值为1016

原:

修改后:

效果图:

3.找到系统System32目录下的user32.dll文件,用UltraEdit打开并分析该文件引出表,找出函数MessageBoxA的地址,并验证该地址是否正确。

这里采用上课教授的PEview+STUD_PE方法

1.使用PEView打开user32.dll,查找MessageBoxA的RVA。

在AddressOfNames数组(Name Pointer Table)中找到MessageBoxA字符串,其数组序号为01DD

0000740C在EXPORT NAME 位置上是字符串 MessageBoxA

在Ordinal Table找到序号(Value)01DD项,Data为01DC。而由于Ordinal Table中Data从0开始,故在Address Table中找到第01DC+1 即01DD项

Data为407EA,也即MessageBoxA的RVA

2.得到其RVA为407EA后,用Stud_PE打开user32.dll,使用Raw与Rva转换功能,得其VA为77D507EA。

3.用OD打开hello-2.5.exe,查看MessageBoxA,对比,确认一致

4.手工修改hello-2.5.exe程序,使得其可以弹出第三个对话框。

OD打开hello-2.5.exe

1.修改.data  title和text之间用00隔开

2.修改其代码

这里注意先添加了五行,类似前两个弹窗的代码

然后将原来最后的六行下移

然后修改前三个CALL,因为可以看到三个JMP的位置已经改变了。比如MessageBoxA变成401056

然后修改最后一个call,这里call的是结束,0040104a

然后修改新框的title为00403059,这是我们刚刚在.data中添加内容的起始地址

Text为0040306E 这样就显示data段添加的内容,而不是原来的内容教学测试

然后保存

先保存.Text段

再保存.data段(保存时选中所有修改)

最后保存为文件

1.拓展

这里JMPmessagebox也是一个跳转,402008.

于是上面call messagebox的地方也可以直接call 402008

效果图:

就不放了。。效果是弹出了第三个框:

5.用UltraEdit修改hello-2.5.exe程序的引入表,使该程序仅可以从kernel32.dll中引入LoadLibrary和GetProcAddress函数,而不从user32.dll导入任何函数。然后,在代码节中写入部分代码利用这两个函数获取MessageBoxA的函数地址,使hello-2.5.exe程序原有功能正常。

1. 修改结构IMPORT Hints/Names&DLL Names

这里每一条记录前两项是序号,可选。如664H开始的00 00.

两条间用00隔开。如671H处的00.

2.修改INT

3.修改IAT

4.修改IDT

这里2092H是kernel32.dll的偏移

5.另存为hello_256.exe。用PEVIEW查看其引出节

6.修改PE头部和节表中的相关结构

先改节表:

由PEview可知其节表位置及VirtualSize位置为1D8H。A6H为原来从600H到6A5H共6AH个字节的大小。修改为9FH.

再改PE头部:

先查看IMPORT TABLE和IMPORT Address Table的位置

在UE中修改

7.在OD中修改代码节和数据节

修改.data段

在“初始化数据段”添加代码段中要用到的字符串“user32.dll”和“MessageBoxA”

记录这两个字符串的RVA

user32.dll:0040 3059

MessageBoxA:0040 3064

修改.text段

注意第一行汇编为:PUSH 00403059而不是PUSH hello_256.00403059

最后JMP的部分,值为VA. 比如

JMP DWORD PTR DS:[402004]即为Loadlibrary  是刚刚在PE文件IAT中修改的。

8.先保存.Text段

再保存.data段(保存时选中所有修改)

最后保存为文件 hello_2569.exe

结果如图:

6.利用PEview.exe熟悉PEview.exe程序的资源表的结构。

如图,复制了一个PEVIEW便于修改

7.用UltraEdit修改PEview.exe,使得该文件的图标变成csWhu.ico。

在section .rsrc(资源节中)存放图标资源。

icon 1 0001 0009

在DATA_ENTRY查看

大小为668H, 1640字节

而whucs.ico大小为776字节(UltraEdit打开可知。前面OD指OLLYDBG)。可以直接替换

用UE打开whucs.ico,复制内容,粘贴到PEVIEW的0000D4C0开始的位置。

注意复制的时候不要全选,否则会造成之后的文件移位。复制到D7A7

观察可知数据从16开始复制。(“(”开始)

查看GROUP ICON开始位置为F3E4

然后复制whucs.ico的前20位(基本格式),复制到peview的 F3E4位置

之后注意修改icon id 16-->01,icon项数改为3.(因为原来就有3项)(具体字段内容见mooc)

保存为pevieww

8.熟悉eXeScope工具的使用,并利用该工具汉化PEview.exe程序。

先用exescope打开peview

修改两处File和 open

保存,查看

9.思考

1.如何打造最小的PE文件:修改WHU_PE-2.5.exe文件,保持该文件的功能不变,使得该文件大小尽可能小。

参考慕课“挑战自己:手工打造最小PE文件”

将NT映像头填充到MZ文件头和DOSstub中,保留前四个字节和入口点

删除没有用的节表,DataDirectory。删除text节和rdata节中多余空间。保留IAT。

2.替换程序的图标时,如果新图标比原有图标大,应该如何解决?

首先修改目标icon的size值。之后先计算超出多少,超出的字节后移。

然后更改之后受到影响的数据的RVA,

3.如何给一个没有图标的程序(如hello-2.5.exe),添加一个图标?

1.添加资源节节表

修改映像文件头中节表数,增加一

修改可选文件头中SizeofImage,增加2000H

在DataDrictory添加资源节的RVA

2.之后在资源节节表按照成员信息填写完成。(28H字节)

3.之后复制粘贴cs.ico的内容到icon1的偏移处。

注意修改group icon

4.添加完成后计算size,返回来修改节表的size和可选映像头中的DataDrictory中的大小。

原文地址:https://www.cnblogs.com/lqerio/p/11117579.html

时间: 2024-10-29 00:42:48

PE文件格式分析的相关文章

深入理解 Win32 PE 文件格式

深入理解 Win32 PE 文件格式 Matt Pietrek 这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什么东西,那么你就是一个知识渊博的程序员.这一系列文章的第一部分,讨论最近这几年PE格式所发生的变化. 这次更新后,作者讨论了PE格式如何适应于用.NET开发的应用程序,包括PE节,RVA,数据目录,以及导入函数.附录中包含了相关的映像头结构以及它们的描述. 很早以前,我为微软系统期刊(现在叫做MSD

AVI 文件格式分析

************************************************************************ AVI 文件格式分析 --- 2014/8/23 16:40:05 ************************************************************************ avi含三部分:文件头.数据块和索引块. 1.文件头包括文件的通用信息,定义数据格式,所用的压缩算法等参数. 2.数据块包含实际数据流,即图

wav文件格式分析详解

wav文件格式分析详解 文章转载自:http://blog.csdn.net/BlueSoal/article/details/932395 一.综述    WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的.RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是"RIFF".    WAVE文件是由若干个Chunk组成的.按照在文件中的出现位置包括:RIFF WAVEChunk, Format C

OBJ文件格式分析工具: objdump, nm,ar

首先简要阐述关于gcc.glibc和 binutils模块之间的关系 一.关于gcc.glibc和binutils模块之间的关系 1.gcc(gnu collect compiler)是一组编译工具的总称.它主要完成的工作任务是"预处理"和"编译",以及提供了与编译器紧密相关的运行库的支持,如 libgcc_s.so.libstdc++.so等. 2.binutils提供了一系列用来创建.管理和维护二进制目标文件的工具程序,如汇编(as).连接(ld).静态库归档(

mpeg文件格式分析

MPEG-1流比特层次结构分析总结 1.简要介绍Mpeg 2.Mpeg-1数据流分析 2.1视频序列层(VideoStream) 2.2画面组层(GOP) 2.3画面层(Pictures) 2.4片层(Slice) 2.5宏块层(Macroblock) 2.6块层(Block) 3.加密位置的思考 附录 MPEG-1流比特层次结构分析总结 1.简要介绍Mpeg Mpeg是Motion Picture Expert Group的缩写.活动图像专家组是在1988年由ISO和IEC联合成立的专家组,负

win32下PE文件分析之节表

接上一篇的win32下PE文件分析之NT头 (一).FileBuffer与ImageBuffer (1).FileBuffer是将文件原原本本的读入申请的内存区域中,那部分区域就是FileBuffer,里面的内容与磁盘中的文件一模一样.如下图: (2).ImageBuffer是按照一定规则加载到内存中的某个区域,并且通过一定的处理,能立刻执行的区域,那部分区域叫做ImageBuffer.其大小就是可选PE头中的SizeOfImage.结构如下图: (3).二者之间的关系: ImageBuffer

多媒体(2):WAVE文件格式分析

目录 多媒体(1):MCI接口编程 多媒体(2):WAVE文件格式分析 多媒体(3):基于WindowsAPI的视频捕捉卡操作 多媒体(4):JPEG图像压缩编码 多媒体(2):WAVE文件格式分析

Linux及安全实践四——ELF文件格式分析

Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个ELF文件 以一个最简单的helloworld程序为例 1. ELF文件头 使用工具查看ELF文件头:readelf -h obj 在/usr/include/elf.h中可以找到文件头结构定义: 大小总共为64字节,换算成十六进制为0x40.在十六进制代码中找到前0x40字节,即为文件头信息部分(阅

201303-lnk文件格式分析以及木马利用-willj[4st TeAm]

前不久在卡饭爆出各种木马利用快捷方式启动绕过杀毒软件的主动防御,随分析下. 0x01. Lnk文件介绍 lnk文件是用于指向其他文件的一种文件. 这些文件通常称为快捷方式文件.通常它以快捷方式放在硬盘上.以方便使用者快速的调用,其扩展名为.lnk. 0x02. Lnk文件格式解析 Lnk文件头 Shell Item Id List段(可选) 文件本地信息段 描述字符串段(可选) 相对路径段(可选) 工作目录段(可选) 命令行段(可选) 图标文件段(可选) 附加信息段(可选) @Lnk文件头结构