EXE文件结构及读取方法

简介: 出自 “晓风残月xj” 博客由于各种原因,可能存在诸多不足,欢迎斧正!一、EXE文件概念     EXE File英文全名executable file ,译作可执行文件,可移植可执行 (PE) 文件格式的文件,它可以加载到内存中,并由操作系统加载程序执行,是可在操作系统存储空间中浮动定位的可执行程序。

出自 “晓风残月xj” 博客

由于各种原因,可能存在诸多不足,欢迎斧正!

一、EXE文件概念

     EXE File英文全名executable file ,译作可执行文件,可移植可执行 (PE) 文件格式的文件,它可以加载到内存中,并由操作系统加载程序执行,是可在操作系统存储空间中浮动定位的可执行程序。如记事本程序notepad.exe ,可以用来编辑文档,如:测试.txt双击打开notepad.exe记事本程序来进行编辑处理。

二、EXE文件结构

      EXE文件分为两个部分: EXE文件头和程序本体。exe文件比较复杂,属于一种多段的结构,是DOS最成功和复杂的设计之一。每个exe文件包含一个文件头和一个可重定位程序的映像。文件头包含MS-DOS用于加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向一个重定位表,该表包含指向程序映像中可重定位段地址的指针链表。MS-DOS通过把该映像直接从文件复制到内存加载exe程序,然后调整定位表中说明的可重定位段地址。定位表是一个重定位指针数组,每个指向程序映像中的可重定位段地址。  预知详细原理与结构,请点击EXE文件结构及原理

                                 

                                                           上表是EXE文件头

三、EXE文件打开方法

    由于EXE文件比较特殊,打开方式也有点特殊,需指定格式,见下面代码:

  1. #include<iostream>  
  2. #include<string>  
  3. #include<fstream>  
  4. #include<ios>  
  5. using namespace std;  
  6.   
  7. const int BUFFER_SIZE=1024;  
  8.   
  9. void update(ifstream& in)   
  10. {  
  11.     if (!in)   
  12.     {  
  13.         return;  
  14.     }  
  15.     std::streamsize length;  
  16.     char buffer[BUFFER_SIZE];  
  17.     while (!in.eof())  
  18.     {  
  19.         in.read(buffer, BUFFER_SIZE);  
  20.         length = in.gcount();  
  21.         if (length > 0)   
  22.         {  
  23.             printf(”%s”,buffer);  
  24.         }  
  25.     }  
  26.     in.close();  
  27. }  
  28.   
  29.   
  30. int main()  
  31. {  
  32.     update(ifstream(”1.exe”, ios_base::binary));  
  33.     return 0;  
  34. }  
#include<iostream>

include<string>

include<fstream>

include<ios>

using namespace std;

const int BUFFER_SIZE=1024;

void update(ifstream& in)
{
if (!in)
{
return;
}
std::streamsize length;
char buffer[BUFFER_SIZE];
while (!in.eof())
{
in.read(buffer, BUFFER_SIZE);
length = in.gcount();
if (length > 0)
{
printf("%s",buffer);
}
}
in.close();
}

int main()
{
update(ifstream("1.exe", ios_base::binary));
return 0;
}

       其中,ios_base 是C++标准程序库中的一个类,定义于<ios>头文件中。ios_base类封装了C++标准中的流输入输出中不依赖于读写的数据的类型的基本信息,如格式化信息、异常状态、事件回调函数等。

  

     关于PE文件的头,可以参考PE文件说明




目录
相关文章
|
Python
python文件的打开、读取、关闭、写入与二进制文件的读写操作
python文件的打开、读取、关闭、写入与二进制文件的读写操作
2109 0
python文件的打开、读取、关闭、写入与二进制文件的读写操作
|
5月前
|
Java
Java【代码 15】文件操作相关方法(获取文件、复制文件、创建文件夹、获取图片文件、写出数据到文件、清理文件夹)
Java【代码 15】文件操作相关方法(获取文件、复制文件、创建文件夹、获取图片文件、写出数据到文件、清理文件夹)
30 0
|
5月前
|
存储 C#
【Untiy 3D】C#中文件夹与读写文件操作详解(附测试代码 超详细)
【Untiy 3D】C#中文件夹与读写文件操作详解(附测试代码 超详细)
41 0
|
10月前
|
存储
ENVI_IDL: 创建HDF5文件并写入数据(以将Geotiff文件写入HDF文件为例) + 详细解析
ENVI_IDL: 创建HDF5文件并写入数据(以将Geotiff文件写入HDF文件为例) + 详细解析
120 0
文件和文件夹的操作——文件操作
文件和文件夹的操作——文件操作
96 0
修改注册表打开PDF内嵌的zip等文件
今天在打开一个 PDF 文件的时候,发现文件里面嵌入的 .zip 文件无法打开。当然 .png 之类的文件还是可以打开的。 网上的各种“信任管理器”白名单方法都是无效的。 后来查了官网说明,得知是因为这类文件不安全,所以不允许打开。
713 0