bat 判断文件名字含有某些字段_PE文件头及其简单逆向运用
零、了解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文件头及其简单逆向运用相关推荐
- jquery数组去重:纯数字数组去重,forEach判断数组是否含有该字段,单个数组通过某个字段名去重value值,多个数组合并同时根据某个字段进行去重
纯数字数组去重 const numbers = [1, 1, 20, 3, 3, 3, 9, 9]; const uniqueNumbers = [...new Set(numbers)] //输出u ...
- wps怎么将字体嵌入文件_WPS文字怎么将字体嵌入文件让含有特殊字体的文档正常显示...
WPS文字怎么将字体嵌入文件让含有特殊字体的文档正常显示 时间:2014-11-13 作者:snow 来源:互联网 含有特殊字体的文档默认情况下在其他的电脑中是无法正常显示的,这是因为,此电脑 ...
- 【CTF杂项】常见文件文件头文件尾格式总结及各类文件头
文件头文件尾总结 JPEG (jpg), 文件头:FFD8FF 文件尾:FF D9 PNG (png), ...
- php读取某类型文件代码,php代码实现读取文件头判断文件类型
php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀. 案例: //为图片的路径可以用d:/upload/11.jpg等绝对路径 $file = fopen($filename, &q ...
- java file 获取文件类型_Android中Java根据文件头获取文件类型
前面贴过Android系统内部的MediaFile类来获取文件类型的办法,这个类主要是根据文件的扩展名来判断,其准确性不是很好.具体可查看Android系统使用MediaFile类判断音频文件类型.其 ...
- sublime 设置新建文件自动添加author(作者)等文件头信息
很多时候, sublime 自带自动添加文件头信息, 但是并不是我们想要比如下面这样的: 新建一个python文件 自动添加的author 信息 == 上面并不是我想要的, 我想要下面这样的效果: = ...
- web服务器响应头文件,response.setHeader()步骤设置http文件头的值
当前位置:我的异常网» Web前端 » response.setHeader()步骤设置http文件头的值 response.setHeader()步骤设置http文件头的值 www.myexcept ...
- php判断文件名字包含秘密,sublime text--你所不知道的12个秘密
转自:http://blog.csdn.net/laokdidiao/article/details/51429404 package control安装: 第一种方法是在控制台中复制粘贴代码按回车, ...
- bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...
JVM系列: 面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判 ...
- linux md文件 编辑,用Vim写md文档的简单姿势
对于重度Vim使用者来说,编辑md文档用Vim是顺理成章的事,在此记录下来. 近期开始带学生接触Openstack开发.在8G内存的笔记本上跑个Devstack开发环境,至少要分掉4G,否则虚拟机卡成 ...
最新文章
- 怎么使图表居中显示_文字怎么排版又精美又好看?
- 执行计划--为查询指定查询计划
- Android开发UI之Fragment-Tabbed Activity的使用
- (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节4:I/O软件层次结构
- SharePoint 2013中修改windows 活动目录(AD)域用户密码的WebPart(免费下载)
- ICML2021 | ALIGN:大力出奇迹,谷歌用18亿的图像-文本对训练了一个这样的模型
- 帝国cms怎么搭建python环境_用python 发 帝国cms 文章
- 题目1544:数字序列区间最小值
- 推荐:年度巨献:《Ubuntu桌面生存指南》(作者:ghosert)
- ARCore之路-环境准备
- Word自动目录字体修改和行间距的问题
- IARPA启动“奥丁”项目,发展生物特征识别技术
- JAVA入门Hwork,HBase Java编程入门教程
- 历年茅台计算机招聘考试真题,2020贵州茅台招聘考试试题及答案(7)
- 因计算机丢失d3dx9-30,Win10玩仙剑5提示d3dx9_30.dll文件丢失的解决方法
- 手机浏览器呼出QQ聊天窗口
- rgb格式颜色与#000000十六进制格式颜色的转换原理
- 以岭药业:连花清瘟火爆背后,数字化重塑人力资源管理
- 深入理解CRM的概念
- leelen可视对讲怎么接线_楼宇可视对讲系统工程施工