EXE文件结构及原理
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文件结构及原理相关推荐
- svchost.exe启动服务原理
svchost.exe本身只是作为服务宿主,并不实现任何服务功能,需要svchost.exe启动的服务以动态链接库形式实现,在安装这些服务时,把服务的可执行程序指向svchost.exe,启动这些服务 ...
- svchost.exe启动服务原理(如何查看系统服务究竟启动了哪个文件)
引言: 本来是不想研究这些东西的,但是米老大指示要求禁用网上邻居,顺便研究一下. 其实禁用网上邻居,可以简单的从注册表禁用,不过这样太苍白无力了,既然做,就做强悍点,直接从服务入手,彻底kill网上邻 ...
- 从恶意软件获得的新姿势——通过rundll32.exe执行js原理详细分析
今年7月份,国外研究机构发现了一个比较新型的恶意软件,这个恶意软件不会在系统上安装任何文件,而是藏身在windows的注册表中通过rundll32.exe执行JavaScript代码. 听上去确实很有 ...
- 从内存中加载并启动一个exe
从内存中加载并启动一个exe 文章作者:Idle_ (阿呆) 信息来源:[url]http://cnxhacker.net/article/show/2821.html[/url] windows似乎 ...
- 从内存中加载并运行exe(两种方法)
windows似乎只提供了一种启动进程的方法:即必须从一个可执行文件中加载并启动. 而下面这段代码就是提供一种可以直接从内存中启动一个exe的变通办法. 用途嘛, 也许可以 ...
- python懒人小工具:python打包exe 小工具
不知道有没有菜鸟和我一样,经常需要把python打包成exe,但是比较懒,虽然命令行很简单,但是不太喜欢用命令行,嘿嘿,就干脆写个小工具专门用来打包exe,方便自己用. 多写代码,就当练习了.成品如下 ...
- Java实现多线程远程投屏并打包可执行文件(从代码到.exe)
Java实现多线程远程投屏并打包可执行文件(从代码到.exe) 前言 原理 成品展示 代码实现 客户端 生成询问框 询问框选择响应 截取输入字符串 与服务端建立联系 创建数据输入流 创建窗口及面板 获 ...
- 《自然语言处理实战入门》第三章 :中文分词原理及相关组件简介 ---- 工业级词法分析组件百度LAC2.0
文章大纲 简介 工具介绍 安装与使用 安装说明 功能与使用 分词 词性标注与实体识别 定制化功能 增量训练 1. 分词训练 2. 词法分析训练 文件结构 效果 原理 参考文献 简介 LAC全称Lexi ...
- exe文件 上传 服务器,exe文件
EXE File英文全名executable file ,译作可执行文件,可移植可执行 (PE) 文件格式的文件,它可以加载到内存中,并由操作系统加载程序执行,是可在操作系统存储空间中浮动定位的可执行 ...
最新文章
- Ubuntu远程控制详细步骤流程
- “毕业”式裁员的祖宗?
- itunes未能连接到iphone_FonePaw iPhone Data Recovery mac版(iphone数据恢复工具)
- ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解
- 如何删除写保护的文件_如何找回已删除或永久删除的Office Excel文件
- .NET技术之美-网络编程
- 【Android基础】Fragment 详解之Fragment介绍
- python中函数的可变参数解析
- 使C#代码现代化——第二部分:方法
- python判断图片相似度_Python比较两个图片相似度的方法
- 怎么在cmd中安装python库_cmd中安装python库时出现的错误
- lightoj 1029 最小生成树 + 最大生成树
- Codeforces 450A. Jzzhu and Children
- Matlab中tic和toc用法
- 校内校园网络技术标书(三少原创)
- Hazel引擎学习(六)
- 技术水平真的很重要!技术详细介绍
- 英语原来这么有趣之数词,月份的使用
- 10分钟部署一个别人可以访问的在线网站
- 微积分-复合函数求导
热门文章
- 分享和推广产品是成功淘宝客的技巧
- 在Abaqus中使用f90格式的子程序
- Direct3D中的绘制
- Linux - systemd 依赖
- 使用ESP8266与小爱同学通过Arduino控制舵机
- 香农费诺编码 c语言实现,对于香农编码、费诺编码和哈夫曼编码,编码方法惟一的是()。...
- 8弦金属摇滚电吉他音源 Orange Tree Samples Evolution Dracus Kontakt
- PyTorch入门(一)向量
- Microsoft office 2013找不到igx.dll解决方案
- 基于Java的开源 Carrot2 搜索结果聚合聚类引擎 2.0发布了