目录

  • 预备知识
    • 一、C32Asm
    • 二、PEiD
    • 三、StudPE
    • 四、LordPE
  • 实验目的
  • 实验环境
  • 实验步骤一
  • 实验步骤二
  • 实验步骤三
    • 1.e_magic字段
    • 2.e_lfanew字段

预备知识

一、C32Asm

C32Asm是一款国产的16进制编辑器,可以十分方便的对二进制文件进行各种编辑操作,同时支持反汇编操作。
本系列实验主要使用C32Asm作为编辑器,同类的编辑工具还有WinHex、010Editor等。

二、PEiD

PEiD是一款查壳工具,可以查看PE文件的加壳信息,如果文件没有被加壳,则可以识别PE文件的编译器信息。此外,PEiD还可以用于查看PE文件的基本结构信息。

三、StudPE

StudPE可以查看PE文件的基本信息,同时支持对PE文件结构中相关字段的定位,即通过字段的选择,可以自动在16进制数据窗口中选择相关的数据。

四、LordPE

LordPE除了可以查看PE文件的基本信息之外,还支持对PE文件的编辑操作,可以修改PE文件中各个字段或者结构的数据然后进行保存。

实验目的

1)掌握C32Asm、PEiD、StudPE、LordPE等工具的基本使用方法;
2)了解PE文件相关的帮助文档;
3)了解PE文件的IMAGE_DOS_HEADER结构。

实验环境


服务器:Windows XP,IP地址:随机分配
辅助工具:C32Asm、PEiD、StudPE、LordPE

实验步骤一

环境配置以及C32Asm工具的使用。
PE文件学习相关的工具主要有C32Asm、PEiD、StudPE以及LordPE,这些工具全部存放于实验机器的C:\Tools目录下,同时在桌面存放有快捷方式。同时,为了方便快速启动这几个工具,可以把他们的快捷方式放到右键菜单的“发送到”菜单项下,具体的操作方法为:
1.点击“开始”菜单,点击“运行”并输入SendTo后点击“确定”按钮,即可在资源管理器中打开SendTo文件夹;
2.将桌面上的C32Asm、PEiD、StudPE、LordPE这四个工具的快捷方式复制到SendTo文件夹之下;
3.现在选中任意一个文件,通过右键菜单的“发送到(N)”选项,即可选择使用C32Asm、PEiD、StudPE或者LordPE这几种工具中的一种打开文件了。
在学习PE文件的结构时,记事本将会是我们经常操作的一个对象,这里复制了一个副本到C:\PE\notepad.exe。在资源管理器中打开C:\PE目录,将notepad.exe通过右键菜单发送到C32Asm,即可在C32Asm中打开notepad.exe文件了,操作步骤如下:
1.打开C:\PE,使用鼠标选中notepad.exe,单击鼠标右键,在弹出的右键菜单中选择“发送到(N)”、“C32Asm”,如下图所示:

2.发送之后,C32Asm将打开notepad.exe文件,如下图所示:

C32Asm是一款16进制编辑器,也是在本系列实验中需要经常使用到的工具。现在来熟悉一下它的操作界面,主要分为四部分,如下图所示:

1.地址栏,以16进制形式显示当前行的起始地址,如0x00000000、0x00000010等,可以看出每一行的大小为0x10,也就是16个字节;
2.数据栏,以16进制形式显示文件的数据,如字符M的ASCII值为77,转换为16进制就是0x4d,那么在C32Asm中显示的内容便是4D;
3.状态栏,当使用鼠标在数据栏中选中一定长度的数据时,在状态栏中会提示选中的内容有多长,即选中的字节数有多少。在上图中,选中了4行数据,长度为0x40,转换为十进制就是64字节;
4.ASCII文本栏,在该栏中显示文件数据对应的ASCII字符,如第一个字节的内容是4D,也就是0x4d,转换为十进制便是77,对应的ASCII字符为M,因此在这一栏中便会在对应的位置显示字符M;注意ASCII表中只有值为32~126的字符才是可以显示的,其他ASCII值的字符不可显示,对于不可显示的字符,C32Asm会以点号“.”来代替。

实验步骤二

PE文件格式文档以及PEiD的使用。
Windows下的大多数恶意软件都属于PE文件,熟悉PE文件格式是进行恶意软件分析的必备技能,但是PE文件那么复杂,能够完全记住其中各个字段的意义吗?不排除部分同学具有这样的能力,但是事实上很难也没有必要,只要学会查阅PE文件格式的相关文档,就可以快速了解各个字段的含义了。在实验机器的C:\PE\docs目录下保存了PE文件格式相关的文档,分别是:
1.pe.jpg,PE文件中相关结构体的定义以及结构之间的基本关系图;
2.pecoff_v8.doc,微软官方提供PE文件格式文档,对PE文件做了十分详细的介绍;
3.pecoff_v8_chs.pdf,第三方人员对微软官方文档翻译形成的中文版文档;
4.WinNT.h,Windows SDK中提供的头文件,给出了PE文件中相关结构体的详细定义。
PE(Portable Executable)文件格式是Windows平台下可执行文件的统一格式规范,扩展名为*.exe、*.dll、*.ocx、*.sys等的文件都属于PE文件。PE文件由DOS头部、DOS Stub模块、PE文件头、节区表、节区数据块以及尾部附加的调试信息几个部分组成,PE文件的总体结构图如下图所示:

从上图中可以看出,从文件头部到文件尾部的内容依次为:DOS头部、PE文件头、块表、块、调试信息等。其中Section又称为“节”、“节区”,采用比较常规的叫法,也叫“节区”。
现在使用PEiD来查看PE文件的节表以及对应的节区数据。打开C:\PE,选中notepad.exe后通过右键菜单发送到PEiD,即可在PEiD中打开notepad.exe,对应的界面以及介绍如下图所示:

这里关心的是节区头部信息,因此需要点击PEiD主界面中最右侧一列的第一个“>”按钮,点击后即可看到如下的界面:

可以看到notepad.exe包含了三个节区,分别为:
1…text节区,对应代码段,里面保存的是汇编指令对应的机器码;
2…data节区,对应数据段,里面保存的是数据相关的信息;
3…rsrc节区,对应资源段,里面保存的是资源相关的数据。
如果要查看对应节区的具体数据,可以在“节查看器”中选中对应的节所在的行,然后单击右键,在弹出的右键菜单中选择“Hex查看器”即可,如下图所示:

实验步骤三

IMAGE_DOS_HEADER结构学习以及StudPE的使用。
现在开始具体的学习PE文件相关的结构,首先是PE文件头部的DOS头,对应WinNT.h中的结构体为IMAGE_DOS_HEADER。那么如何在WinNT.h这个头文件中找到它的定义呢?这个比较简单,直接使用Notepad++打开后搜索IMAGE_DOS_HEADER即可。该结构的具体定义如下:

typedef struct _IMAGE_DOS_HEADER {WORD   e_magic;         // MZ标志WORD   e_cblp;WORD   e_cp;WORD   e_crlc;WORD   e_cparhdr;WORD   e_minalloc;WORD   e_maxalloc;WORD   e_ss;WORD   e_sp;WORD   e_csum;WORD   e_ip;WORD   e_cs;WORD   e_lfarlc;WORD   e_ovno;WORD   e_res[4];WORD   e_oemid;WORD   e_oeminfo;WORD   e_res2[10];LONG   e_lfanew;        // PE文件头偏移
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

可以看出结构体IMAGE_DOS_HEADER拥有很多的成员,为了方便对PE文件格式的学习,只讲解其中最重要的字段,后面的实验同样遵循这样的原则。在IMAGE_DOS_HEADER结构中,只关心e_magic以及e_lfanew,分别是第一个字段以及最后一个字段。在讲解这两个字段的含义之前,我们先介绍一下BYTE、WORD、DWORD、LONG这几个类型的含义,这几个类型将经常出现在PE文件相关的结构体中,这几个类型的定义如下图所示:

此外,还有必要了解一下数据的表示方法,即大端模式和小端模式。对于文件中相邻的四个字节0x12,0x34,0x56,0x78,其中0x12存放于文件的头部,0x78存放于文件的尾部,如果把这四个字节表示为一个DWORD类型的数据,如果是小端模式,则值为0x78563412,而如果是大端模式,则值为0x12345678。对小端模式而言,文件低地址处的数据表示DWORD中低字节的数据,而文件高地址处的数据表示DWORD中高字节的数据,关系如图所示:

小端模式表示法即高地址的数据存放于类型的高位字节、低地址的数据存放于类型的低位字节,简称“高存高,低存低”;大端模式表示法则相反。Intel机器采用小端模式表示法,在学习PE文件时也使用小端模式表示法。
现在回到IMAGE_DOS_HEADER结构,我们介绍其中最重要的两个字段:

1.e_magic字段

e_magic字段类型为WORD,占用两个字节,表示PE文件的一个Magic标志,它的值固定为4D 5A,即PE文件的e_magic值一定就是4D 5A,如果不是4D 5A则表示不是PE文件,因此e_magic通常作为识别一个文件是否是PE文件的标准之一。在小端模式下,4D 5A表示为WORD类型的数据为0x5A4D,在WinNT.h头文件中定义了一个名为IMAGE_DOS_SIGNATURE的宏,它的值就是0x5A4D,如下所示:

#define IMAGE_DOS_SIGNATURE    0x5A4D  // MZ

2.e_lfanew字段

e_lfanew用于指定PE文件头的偏移,因为在IMAGE_DOS_HEADER头和PE头之间隔了一段DosStub数据,而DosStub的大小是可变的,所以需要通过e_lfanew才能找到PE文件头的位置。IMAGE_DOS_HEADER结构体的大小为64字节,而e_lfanew位于该结构的最后四字节,所以e_lfanew对应第61~64四个字节的数据(下标索引为60~63)。
现在我们使用StudPE来查看IMAGE_DOS_HEADER结构并学会如何定位PE文件头的位置。打开C:\PE,选中notepad.exe后通过右键菜单发送到StudPE,就可以在StudPE中打开notepad.exe文件了。现在在StudPE主界面中点击“在16进制编辑器中视图文件头树”这个按钮,如下图所示:

之后即可看到左侧窗口的树形文件头以及右侧窗口的十六进制数据,可以看到右侧的十六进制数据显示窗口与我们之前介绍的工具C32Asm非常类似。选择左侧树形列表中“DOS文件头”的最后一个字段“新的exe文件头地址”(e_lfanew指向PE头),即可在右侧窗口中自动选中E0 00 00 00,小端模式下表示为0x000000E0,这就是IMAGE_DOS_HEADER结构中e_lfanew成员的值,它表示PE头的文件偏移值为0x000000E0,在右侧十六进制数据窗口的0xE0位置即可找到PE文件头,如下图所示:

在右侧十六进制数据窗口的000000E0位置就是PE头的位置了,这里的数据为50 45,对应的ASCII字符是P和E,将在下一个实验中对此来进行介绍。

IMAGE_DOS_HEADER解析相关推荐

  1. 图解VC++版PE文件解析器源码分析

    该源码下载自 http://download.csdn.net/download/witch_soya/4979587 1 Understand 分析的图表 2 PE结构解析的主要代码简要分析 首先看 ...

  2. PE知识复习之PE的各种头属性解析

    PE知识复习之PE的各种头属性解析 一丶DOS头结构体 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // M ...

  3. .idata数据的解析

    每类Section代表不同的数据,不同的数据存储组织方式一定是有非常大区别的.代码段与资源段一定区别巨大,这意味着我需要一个一个的学习每个段的解析. idata段解析 这个段主要存储的是导入符号信息. ...

  4. PE文件解析(1):Dos头与NT头

    文章目录 DOS头 NT头 标准NT头 可选NT头 什么是PE文件? PE文件是在windows平台可执行的文件. 包括:.exe(可执行程序),dll(动态链接库).sys(驱动程序) 这是PE文件 ...

  5. Win32汇编:PE结构解析器

    PE格式是Windows系统下最常用的可执行文件格式,有些应用必须建立在了解PE文件格式的基础之上,如可执行文件的加密与解密,文件型病毒的查杀等,熟练掌握PE文件结构,有助于软件的分析. 在PE文件中 ...

  6. 毕业时候写的一个PE解析小工具(MFC源码)

    这么快就成了前年毕业的老家伙了.在整理硬盘里的代码和文档的时候翻出刚毕业时候写的一个小东西,想起来那时候在武汉的小河西村,暗无天日的租房里屌丝的写着程序的日子.一晃这么久了.还是混的这鸟样.悲伤逆流成 ...

  7. 15.windbg-dds、dps、dqs、PE文件解析

    以下默认windbg加载calc程序 d*s dds.dps和dqs命令显示给定范围内存的内容,它们是把内存区域转储出来,并把内存中每个元素都视为一个符号对其进行解析,dds是四字节视为一个符号,dq ...

  8. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  9. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  10. 条形码?二维码?生成、解析都在这里!

    二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...

最新文章

  1. AudioStreamer电话打进时崩溃
  2. SAP HR信息类型
  3. windows 操作系统里 git bash 和 git cmd 的区别
  4. c语言指针索引数组,C语言数组指针表示法
  5. java基本类型与引用数据类型_java基本数据类型与引用数据类型总结
  6. javascript 文件的同步加载与异步加载
  7. HTML嵌入php已经过时,**PHP, 这段嵌入html的php代码为何第15、16、17行报错?**
  8. 【idea设置】java maven项目,如何打包
  9. oracle/PL/SQL编程(4)
  10. Eclipse 使用
  11. word文件批量转换为txt文档
  12. Apktool反编译
  13. 学计算机物理去戴维斯还是伦斯勒理工学院好,为什么伦斯勒理工学院评价那么高?...
  14. PHP实现的7组经纬度与距离的计算函数
  15. Android studio2.0在app中设置背景图片及添加图片资源
  16. 国外有哪些类似Wooyun(乌云)的网站平台?
  17. HUB, 交换机,路由器,区别
  18. python签到脚本_基于Python实现签到脚本过程解析
  19. (转!)利用Keras实现图像分类与颜色分类
  20. Matlab中计算传递函数表示控制系统的框图

热门文章

  1. Java单词首字母小写转大写
  2. java fact函数_Fact 定义一个类Fact表示无符号有理数(分数) 联合开发网 - pudn.com...
  3. 如何防止别人偷窥我给宝贝儿娜娜的信
  4. @TableLogic注解
  5. Spring Boot - 开启 HttpBasic 认证方式
  6. html基础教学ppt,HTML5基础培训ppt课件
  7. 豫科技版计算机七年级上册,一上册 信息技术
  8. C#设置WebBrowser默认浏览器
  9. matlab读取文件xlsfinfo,Matlab读写excel文件函数
  10. linux bond 网卡带宽,Linux网卡绑定实现带宽翻倍