零、了解PE头

PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名。那Windows是怎么区分可执行文件和非可执行文件的呢?我们调用LoadLibrary传递了一个文件名,系统是如何判断这个文件是一个合法的动态库呢?这就涉及到PE文件结构了。

PE文件的结构一般来说如右图所示:从起始位置开始依次是DOS头,NT头,节表以及具体的节。

一、DOS头及实例

上述为IMAGE_DOS_HEADER结构结构体,最重要的参数只有两个—— e_magic, e_lfanew。 e_magic是MZ标志位,为0x5A4D, e_lfanew放着PE文件开头的位置0x000000E8(0x3c-0x3f),根据e_lfanew可以跳过IMAGE_DOS_HEADER来到PE头部

二、PE头及实例

顺着DOS头中的e_lfanew,我们很容易可以找到NT头,这个才是32位PE文件中最有用的头,定义如下:

typedef struct _IMAGE_NT_HEADERS {

DWORD Signature;// MZ 头(0x00004550)

IMAGE_FILE_HEADER FileHeader;// PE文件头

IMAGE_OPTIONAL_HEADER32 OptionalHeader;// PE可选头

} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

Signature:类似于DOS头中的e_magic,其高16位是0,低16是0x4550,用字符表示是'PE‘。

IMAGE_NT_HEADERS中第二个元素为IMAGE_FILE_HEADER FileHeader,标明PE文件的一些属性

IMAGE_NT_HEADERS中第三个元素为 IMAGE_OPTIONAL_HEADER32 OptionalHeader,用于为加载器提供加载信息,注意OptionalHeader的大小并不固定,位置在0xE8(e_lfanew)+0x4(size(Signature))+0x14(size(IMAGE_FILE_HEADER))=0xd0处,其大小由FileHeader中的SizeOfOptionalHeader字段来决定。

typedef struct _IMAGE_FILE_HEADER {

WORD Machine;

WORD NumberOfSections;

DWORD TimeDateStamp;

DWORD PointerToSymbolTable;

DWORD NumberOfSymbols;

WORD SizeOfOptionalHeader;

WORD Characteristics;

} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

Machine指明PE文件支持的CPU类型,0x014c表明是Intel i386的CPU

NumberOfSections指明PE文件包含的节区数量,0x0004表明有4块

TimeDateStamp字段指明文件的创建时间,为1970年1月1日以来用格林威治时间计算的秒数

SizeOfOptionalHeader字段,指明在IMAGE_NT_HEADERS中紧跟在FileHeader后的OptionalHeader的大小,对于32位的PE文件而言,这个值的大小通常为0x00E0;

Characteristics字段,表明文件的属性。如果Characteristics & 0x2000 = 0x2000,那么表明这是一个DLL文件

IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 The file is executable

IMAGE_NT_HEADERS中第三个元素为 IMAGE_OPTIONAL_HEADER32 OptionalHeader,用于为加载器提供加载信息,注意OptionalHeader的大小并不固定,位置在0x000000E8(e_lfanew)+0x4(size(Signature))+0x14(size(IMAGE_FILE_HEADER))=0xd0处,其大小由FileHeader中的SizeOfOptionalHeader字段来决定。

Magic:表示可选头的类型。

MajorLinkerVersion和MinorLinkerVersion:链接器的版本号。

SizeOfCode:代码段的长度,如果有多个代码段,则是代码段长度的总和。

SizeOfInitializedData:初始化的数据长度。

SizeOfUninitializedData:未初始化的数据长度。

AddressOfEntryPoint:程序入口的RVA,对于exe这个地址可以理解为WinMain的RVA。对于DLL,这个地址可以理解为DllMain的RVA,如果是驱动程序,可以理解为DriverEntry的RVA。当然,实际上入口点并非是WinMain,DllMain和DriverEntry,在这些函数之前还有一系列初始化要完成,当然,这些不是本文的重点。

BaseOfCode:代码段起始地址的RVA。

BaseOfData:数据段起始地址的RVA。

ImageBase:映象(加载到内存中的PE文件)的基地址,这个基地址是建议,对于DLL来说,如果无法加载到这个地址,系统会自动为其选择地址。

SectionAlignment:节对齐,PE中的节被加载到内存时会按照这个域指定的值来对齐,比如这个值是0x1000,那么每个节的起始地址的低12位都为0。

FileAlignment:节在文件中按此值对齐,SectionAlignment必须大于或等于FileAlignment。

MajorOperatingSystemVersion、MinorOperatingSystemVersion:所需操作系统的版本号,随着操作系统版本越来越多,这个好像不是那么重要了。

MajorImageVersion、MinorImageVersion:映象的版本号,这个是开发者自己指定的,由连接器填写。

MajorSubsystemVersion、MinorSubsystemVersion:所需子系统版本号。

Win32VersionValue:保留,必须为0。

SizeOfImage:映象的大小,PE文件加载到内存中空间是连续的,这个值指定占用虚拟空间的大小。

SizeOfHeaders:所有文件头(包括节表)的大小,这个值是以FileAlignment对齐的。

CheckSum:映象文件的校验和。

Subsystem:运行该PE文件所需的子系统

DllCharacteristics:DLL的文件属性,只对DLL文件有效,可以是下面定义中某些的组合:

SizeOfStackReserve:运行时为每个线程栈保留内存的大小。

SizeOfStackCommit:运行时每个线程栈初始占用内存大小。

SizeOfHeapReserve:运行时为进程堆保留内存大小。

SizeOfHeapCommit:运行时进程堆初始占用内存大小。

LoaderFlags:保留,必须为0。

NumberOfRvaAndSizes:数据目录的项数,即下面这个数组的项数。

DataDirectory:数据目录,这是一个数组,数组的项定义如下:

三、其他PE信息

IMAGE_OPTIONAL_HEADER32

其中VirtualAddress为数据块的起始RVA地址,Size为数据块的长度。数据目录表中比较重要的表项有输出表、输入表、资源表以及重定位表等。

四、简单逆向运用

OD附加调试软件exe,找到PE文件头的位置。再次偏移到AdressOfEntryPoint位置。

修改0x4000E8位置的00001000 为00001024就跳转过了第一个MessageBox弹窗

bat 判断文件名字含有某些字段_PE文件头及其简单逆向运用相关推荐

  1. jquery数组去重:纯数字数组去重,forEach判断数组是否含有该字段,单个数组通过某个字段名去重value值,多个数组合并同时根据某个字段进行去重

    纯数字数组去重 const numbers = [1, 1, 20, 3, 3, 3, 9, 9]; const uniqueNumbers = [...new Set(numbers)] //输出u ...

  2. wps怎么将字体嵌入文件_WPS文字怎么将字体嵌入文件让含有特殊字体的文档正常显示...

    WPS文字怎么将字体嵌入文件让含有特殊字体的文档正常显示 时间:2014-11-13   作者:snow   来源:互联网 含有特殊字体的文档默认情况下在其他的电脑中是无法正常显示的,这是因为,此电脑 ...

  3. 【CTF杂项】常见文件文件头文件尾格式总结及各类文件头

    文件头文件尾总结 JPEG (jpg),                         文件头:FFD8FF 文件尾:FF D9 PNG (png),                         ...

  4. php读取某类型文件代码,php代码实现读取文件头判断文件类型

    php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀. 案例: //为图片的路径可以用d:/upload/11.jpg等绝对路径 $file = fopen($filename, &q ...

  5. java file 获取文件类型_Android中Java根据文件头获取文件类型

    前面贴过Android系统内部的MediaFile类来获取文件类型的办法,这个类主要是根据文件的扩展名来判断,其准确性不是很好.具体可查看Android系统使用MediaFile类判断音频文件类型.其 ...

  6. sublime 设置新建文件自动添加author(作者)等文件头信息

    很多时候, sublime 自带自动添加文件头信息, 但是并不是我们想要比如下面这样的: 新建一个python文件 自动添加的author 信息 == 上面并不是我想要的, 我想要下面这样的效果: = ...

  7. web服务器响应头文件,response.setHeader()步骤设置http文件头的值

    当前位置:我的异常网» Web前端 » response.setHeader()步骤设置http文件头的值 response.setHeader()步骤设置http文件头的值 www.myexcept ...

  8. php判断文件名字包含秘密,sublime text--你所不知道的12个秘密

    转自:http://blog.csdn.net/laokdidiao/article/details/51429404 package control安装: 第一种方法是在控制台中复制粘贴代码按回车, ...

  9. bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...

    JVM系列: 面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判 ...

  10. linux md文件 编辑,用Vim写md文档的简单姿势

    对于重度Vim使用者来说,编辑md文档用Vim是顺理成章的事,在此记录下来. 近期开始带学生接触Openstack开发.在8G内存的笔记本上跑个Devstack开发环境,至少要分掉4G,否则虚拟机卡成 ...

最新文章

  1. 怎么使图表居中显示_文字怎么排版又精美又好看?
  2. 执行计划--为查询指定查询计划
  3. Android开发UI之Fragment-Tabbed Activity的使用
  4. (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节4:I/O软件层次结构
  5. SharePoint 2013中修改windows 活动目录(AD)域用户密码的WebPart(免费下载)
  6. ICML2021 | ALIGN:大力出奇迹,谷歌用18亿的图像-文本对训练了一个这样的模型
  7. 帝国cms怎么搭建python环境_用python 发 帝国cms 文章
  8. 题目1544:数字序列区间最小值
  9. 推荐:年度巨献:《Ubuntu桌面生存指南》(作者:ghosert)
  10. ARCore之路-环境准备
  11. Word自动目录字体修改和行间距的问题
  12. IARPA启动“奥丁”项目,发展生物特征识别技术
  13. JAVA入门Hwork,HBase Java编程入门教程
  14. 历年茅台计算机招聘考试真题,2020贵州茅台招聘考试试题及答案(7)
  15. 因计算机丢失d3dx9-30,Win10玩仙剑5提示d3dx9_30.dll文件丢失的解决方法
  16. 手机浏览器呼出QQ聊天窗口
  17. rgb格式颜色与#000000十六进制格式颜色的转换原理
  18. 以岭药业:连花清瘟火爆背后,数字化重塑人力资源管理
  19. 深入理解CRM的概念
  20. leelen可视对讲怎么接线_楼宇可视对讲系统工程施工

热门文章

  1. 高斯过程和高斯过程回归
  2. ubuntu 安装多个CUDA版本并可以随时切换
  3. ROS中记录数据与回放
  4. 2019最新论文阅读-BlazeFace:面向移动设备的实时人脸检测
  5. 数值分析(7)-正交多项式
  6. 从XML文件制作VOC数据集ImageSets下的txt文件
  7. 把router-link标签渲染成指定的标签
  8. nodejs 模板引擎ejs的使用
  9. Python04,变量与赋值
  10. OrzFAng系列–树 解题报告