EXE文件结构及原理

转自: http://blog.163.com/ma_youzhong/blog/static/42459154200831835636136/

EXE文件分为两个部分:   EXE头部(包括一些标识信息和重定位表)和 程序 本体(程序本身).   EXE头部的大小由EXE文件的+08处的字表示,   以节(10h字节)为单位.   EXE的14h处的双字是初始的CS:IP,   它是相对于EXE文件的程序本体的.   即程序初始入口在文件中的偏移地址:   (word08h+word16h)*10h+word14h

-------------------------------------------------------------------------------------------------------------------------------------------

这是一本叫做《计算机病毒及其防治技术》的书上的一个段落,程胜利等编著,清华大学出版社。

感觉有用,摘抄下来

com和exe文件结构
1、com文件结构及原理
     com文件结构比较简单,它包含程序的一个绝对映像,即为了运行程序准确的处理器指令和内存中的数据,MS-DOS通过直接把该映像从文件直接复制到内存,从而加载com程序,而不做任何改变。
     为加载一个com程序,MS-DOS首先试图分配内存,因为com程序必须位于一个64KB的段中,所以com文件的大小不能超过65024(64KB减去用于PSP的256B和用于一个起始堆栈的至少256B)。如果MS-DOS不能为程序、一个PSP、一个起始堆栈分配足够的内存,则分配尝试失败。否则,MS-DOS分配尽可能多的内存(直至所有保留内存),即使com程序本身不能大于64KB。在试图运行另一个程序或分配另外的内存之前,大部分com程序释放任何不需要的内存。
     分配内存后,MS-DOS在该内存的前256B建立一个PSP,如果PSP中的第一个FCB含有一个有效驱动器标识符,则置AL为00H,否则置位0FFH。MS-DOS还置AH为00或0FFH,这依赖于第二个FCB是否含有一个有效驱动器标识符。建造PSP后,MS-DOS在PSP后立即开始(偏移100H)加载com文件,它置SS、DS和ES为PSP的段地址,接着创建一个堆栈。为创建这个堆栈,在已分配了至少64KB内存的情况下,MS-DOS置SP为0000H;否则它置寄存器比所分配的自己总数大2的值。最后,将0000H进栈(这是为了保证与在早期MS-DOS版本上设计的程序的兼容性)。
     MS-DOS通过把控制传递给偏移100H处的指令而启动程序。程序设计者必须保证COM文件的第一条指令是程序的入口点。
     注意:因为程序是在偏移100H处加载,因此所有代码和数据偏移也必须相对于100H。汇编语言程序设计者可通过设置程序的初值为100H而保证这一点(例如通过在源程序的开始使用语句org 100h)。

2、exe文件结构及原理
     exe文件比较复杂,属于一种多段的结构,是DOS最成功和复杂的设计之一。要了解exe文件,首先需要了解exe文件的文件头结构。
     每个exe文件包含一个文件头和一个可重定位程序的映像。文件头包含MS-DOS用于加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向一个重定位表,该表包含指向程序映像中可重定位段地址的指针链表。exe文件的文件头结构如表所示:
偏移量 含义 
00h~01h MZ,exe文件标记 
02h~03h 文件长度除以512的余数 
04h~05h 文件长度除以512的商 
06h~07h 重定位项的个数 
08h~09h 文件头除以16的商 
0ah~0bh 程序运行所需最小段数 
0ch~0dh 程序运行所需最大段数 
0eh~0fh 堆栈段的段值(SS) 
10h~11h 堆栈段的段值(SP) 
12h~13h 文件校验和 
14h~15h 装入模块入口时的IP值 
16h~17h 装入模块代码相对段值(CS) 
18h~19h 重定位表,开始位置,以位移地址表示 
1ah~1bh 覆盖号(程序驻留为零) 
1ch 重定位表,起点由偏移18h~19h给出,项数由06h~07h标明

程序映像包含处理代码和程序的初始数据,紧接在文件头之后。它的大小以字节为单位,等于exe文件的大小减去文件头的大小,也等于exHeaderSize的域的值乘以16。MS-DOS通过把该映像直接从文件复制到内存加载exe程序,然后调整定位表中说明的可重定位段地址。
     定位表是一个重定位指针数组,每个指向程序映像中的可重定位段地址。文件头中的exRelocItems域说明了数组中指针的个数,exRelocTable域说明了分配表的起始文件偏移量。每个重定位指针由两个16位值组成:偏移量和段值。为加载exe程序,MS-DOS首先读文件头以确定exe标志并计算程序映像的大小,然后它试图申请内存。首先,它计算程序映像文件的大小加上PSP的大小,再加上EXEHEADER结构中的exMinAlloc域说明的内存大小这3者之和。如果总和超过最大可用内存块的大小,则MS-DOS停止加载程序并返回一个出错值。否则,它计算程序映像的大小加上PSP的大小再加上EXEHEADER结构中exMaxAlloc域说明的内存大小之和,如果第二个总和小于最大可用内存块的大小,则MS-DOS分配计算得到的内存量。否则,它分配最大可用内存块。
     分配完内存后,MS-DOS确定段地址,也称为起始段地址,MS-DOS从此处加载程序映像。如果exMinAlloc域和exMaxAlloc域中的值都为零,则MS-DOS把映像尽可能地加载到内存最高端。否则,它把映像加载到紧挨着PSP域之上。
     接下来,MS-DOS读取重定位表中的项目调整所有由重定位指针说明的段地址。对于重定位表的每个指针,MS-DOS寻找指针映像中相应的可重定位段地址,并把起始段地址加到它之上。一旦调整完毕,段地址便指向了内存中被加载程序的代码和数据段。MS-DOS在所分配内存的最低部分建造256B的PSP,把AL和AH设置为加载com程序时所设置的值。MS-DOS使用文件头中的值设置SP与SS,调整SS初始值,把起始地址加载到它之上。MS-DOS还把EX和DS设置为PSP的段地址。最后,MS-DOS从程序文件头读取CS和IP的初始值,把起始段地址加到CS之上,把控制转移到位于调整后的地址处的程序。

exe文件:

EXE文件结构及原理相关推荐

  1. svchost.exe启动服务原理

    svchost.exe本身只是作为服务宿主,并不实现任何服务功能,需要svchost.exe启动的服务以动态链接库形式实现,在安装这些服务时,把服务的可执行程序指向svchost.exe,启动这些服务 ...

  2. svchost.exe启动服务原理(如何查看系统服务究竟启动了哪个文件)

    引言: 本来是不想研究这些东西的,但是米老大指示要求禁用网上邻居,顺便研究一下. 其实禁用网上邻居,可以简单的从注册表禁用,不过这样太苍白无力了,既然做,就做强悍点,直接从服务入手,彻底kill网上邻 ...

  3. 从恶意软件获得的新姿势——通过rundll32.exe执行js原理详细分析

    今年7月份,国外研究机构发现了一个比较新型的恶意软件,这个恶意软件不会在系统上安装任何文件,而是藏身在windows的注册表中通过rundll32.exe执行JavaScript代码. 听上去确实很有 ...

  4. 从内存中加载并启动一个exe

    从内存中加载并启动一个exe 文章作者:Idle_ (阿呆) 信息来源:[url]http://cnxhacker.net/article/show/2821.html[/url] windows似乎 ...

  5. 从内存中加载并运行exe(两种方法)

    windows似乎只提供了一种启动进程的方法:即必须从一个可执行文件中加载并启动.      而下面这段代码就是提供一种可以直接从内存中启动一个exe的变通办法.      用途嘛,     也许可以 ...

  6. python懒人小工具:python打包exe 小工具

    不知道有没有菜鸟和我一样,经常需要把python打包成exe,但是比较懒,虽然命令行很简单,但是不太喜欢用命令行,嘿嘿,就干脆写个小工具专门用来打包exe,方便自己用. 多写代码,就当练习了.成品如下 ...

  7. Java实现多线程远程投屏并打包可执行文件(从代码到.exe)

    Java实现多线程远程投屏并打包可执行文件(从代码到.exe) 前言 原理 成品展示 代码实现 客户端 生成询问框 询问框选择响应 截取输入字符串 与服务端建立联系 创建数据输入流 创建窗口及面板 获 ...

  8. 《自然语言处理实战入门》第三章 :中文分词原理及相关组件简介 ---- 工业级词法分析组件百度LAC2.0

    文章大纲 简介 工具介绍 安装与使用 安装说明 功能与使用 分词 词性标注与实体识别 定制化功能 增量训练 1. 分词训练 2. 词法分析训练 文件结构 效果 原理 参考文献 简介 LAC全称Lexi ...

  9. exe文件 上传 服务器,exe文件

    EXE File英文全名executable file ,译作可执行文件,可移植可执行 (PE) 文件格式的文件,它可以加载到内存中,并由操作系统加载程序执行,是可在操作系统存储空间中浮动定位的可执行 ...

最新文章

  1. Ubuntu远程控制详细步骤流程
  2. “毕业”式裁员的祖宗?
  3. itunes未能连接到iphone_FonePaw iPhone Data Recovery mac版(iphone数据恢复工具)
  4. ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解
  5. 如何删除写保护的文件_如何找回已删除或永久删除的Office Excel文件
  6. .NET技术之美-网络编程
  7. 【Android基础】Fragment 详解之Fragment介绍
  8. python中函数的可变参数解析
  9. 使C#代码现代化——第二部分:方法
  10. python判断图片相似度_Python比较两个图片相似度的方法
  11. 怎么在cmd中安装python库_cmd中安装python库时出现的错误
  12. lightoj 1029 最小生成树 + 最大生成树
  13. Codeforces 450A. Jzzhu and Children
  14. Matlab中tic和toc用法
  15. 校内校园网络技术标书(三少原创)
  16. Hazel引擎学习(六)
  17. 技术水平真的很重要!技术详细介绍
  18. 英语原来这么有趣之数词,月份的使用
  19. 10分钟部署一个别人可以访问的在线网站
  20. 微积分-复合函数求导

热门文章

  1. 分享和推广产品是成功淘宝客的技巧
  2. 在Abaqus中使用f90格式的子程序
  3. Direct3D中的绘制
  4. Linux - systemd 依赖
  5. 使用ESP8266与小爱同学通过Arduino控制舵机
  6. 香农费诺编码 c语言实现,对于香农编码、费诺编码和哈夫曼编码,编码方法惟一的是()。...
  7. 8弦金属摇滚电吉他音源 Orange Tree Samples Evolution Dracus Kontakt
  8. PyTorch入门(一)向量
  9. Microsoft office 2013找不到igx.dll解决方案
  10. 基于Java的开源 Carrot2 搜索结果聚合聚类引擎 2.0发布了