×

关注微信公众号

免备案网站空间虚拟主机双线空间域名查询PS数码后期
photoshop互助课堂数百G视频教程下载英语培训机构初中英语如何学随时随地聆听大师开讲/课堂
酷素材!视频教程打包下手绘教程抠图教程路径专辑photoshop cs3视频教程
查看: 8686|回复: 10

[C & C++] 文件结构及原理

[复制链接]
发表于 2007-7-7 15:33:39 | 显示全部楼层 |阅读模式
要了解病毒就必须先了解文件的结构和原理,下面把COM/EXE文件的结构介绍一下:

一 .COM文件结构及原理

.COM 文件比较简单,.COM文件包含程序的一个绝对映象―――就是说,为了运行程序准确的处

理器指令和内存中的数据,MS-DOS通过直接把该映象从文件拷贝到内存而加载.COM程序,它不

作任何改变。为加载一个.COM程序,MS-DOS首先试图分配内存,因为.COM程序必须位于一个

64K的段中,所以.COM文件的大小不能超过65,024(64K减去用于PSP的256字节和用于一个起始

堆栈的至少256字节)。如果MS-DOS不能为程序、一个PSP、一个起始堆栈分配足够内存,则分

配尝试失败。否则,MS-DOS分配尽可能多的内存(直至所有保留内存),即使.COM程序本身不能

大于64K。在试图运行另一个程序或分配另外的内存之前,大部分.COM程序释放任何不需要的内

存。分配内存后,MS-DOS在该内存的头256字节建立一个PSP,如果PSP中的第一个FCB含有一个

有效驱动器标识符,则置AL为00h,否则为0FFh。MS-DOS还置AH为00h或0FFh,这依赖于第二个

FCB是否含有一个有效驱动器标识符。建造PSP后,MS-DOS在PSP后立即开始(偏移100h)加载

.COM文件,它置SS,DS和ES为PSP的段地址,接着创建一个堆栈.为创建一个堆栈,MS-DOS置

SP为0000h,若已分配了至少64K内存;否则,它置寄存器为比所分配的字节总数大2的值.最后,

它把0000h推进栈(这是为了保证与在早期MS-DOS版本上设计的程序的兼容性)。MS-DOS通过

把控制传递偏移100h处的指令而启动程序.程序设计者必须保证.COM文件的第一条指令是程序

的入口点。注意,因为程序是在偏移100h处加载,因此所有代码和数据偏移也必须相对于

100h.汇编语言程序设计者可通过置程序的初值为100h而保证这一点(例如通过在原程序的开始

使用语句org 100h).
本帖的地址:http://bbs.jcwcn.com/forum.php?mod=viewthread&tid=98452
跟着教程做一遍,做完的图要到这里评论交作业,教程有看不懂的地方,可以在贴子下面评论
 楼主| 发表于 2007-7-7 15:34:04 | 显示全部楼层
酷素材
文件结构及原理

二 EXE文件结构

 EXE 文件比较复杂,每个EXE文件都有一个文件头,结构如下:
       EXE文件头信息    
    ―――――――――――――――――――
     ├ 偏移量 ┤   意义       ┤
     ├00h-01h ┤MZ'EXE文件标记    ┤
     ├2h-03h ┤文件长度除512的余数  ┤
     ├04h-05h ┤...............商   ┤
     ├06h-07h ┤重定位项的个数     ┤
     ├08h-09h ┤文件头除16的商    ┤
     ├0ah-0bh ┤程序运行所需最小段数 ┤
     ├0ch-0dh ┤..............大.... ┤
     ├oeh-0fh ┤堆栈段的段值 (SS)  ┤
     ├10h-11h ┤........sp      ┤
     ├12h-13h ┤文件校验和      ┤
     ├14h-15h ┤IP          ┤
     ├16h-17h ┤CS          ┤
     ├18h-19h ┤............      ┤
     ├1ah-1bh ┤............      ┤
     ├1ch   ┤............      ┤ 
 ―――――――――――――――――――――――――
.EXE文件包含一个文件头和一个可重定位程序映象。文件头包含MS-DOS用于加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向一个重定位表,该表包含指向程序映象中可重定位段地址的指针链表。文件头的形式与EXEHEADER结构对应:
EXEHEADER STRUC
exSignature dw 5A4Dh ;.EXE标志
exExraBytes dw ? ;最后(部分)页中的字节数
exPages dw ? ;文件中的全部和部分页数
exRelocItems dw ? ;重定位表中的指针数
exHeaderSize dw ? ;以字节为单位的文件头大小
exMinAlloc dw ? ;最小分配大小
exMaxAlloc dw ? ;最大分配大小
exInitSS dw ? ;初始SS值
exInitSP dw ? ;初始SP值
exChechSum dw ? ;补码校验值
exInitIP dw ? ;初始IP值
exInitCS dw ? ;初始CS值
exRelocTable dw ? ;重定位表的字节偏移量
exOverlay dw ? ;覆盖号
EXEHEADER ENDS程序映象,包含处理器代码和程序的初始数据,紧接在文件头之后。它的大小以字节为单位,等于.EXE文件的大小减去文件头的大小,也等于 exHeaderSize的域的值乘以16。MS-DOS通过把该映象直接从文件拷贝到内存加载.EXE程序然后调整定位表中说明的可重定位段地址。
定 位表是一个重定位指针数组,每个指向程序映象中的可重定位段地址。文件头中的exRelocItems域说明了数组中指针的个数, exRelocTable域说明了分配表的起始文件偏移量。每个重定位指针由两个16位值组成:偏移量和段值。 为加载.EXE程序,MS-DOS首先读文件头以确定.EXE标志并计算程序映象的大小。然后它试图申请内存。首先,它计算程序映象文件的大小加上PSP 的大小再加上EXEHEADER结构中的exMinAlloc域说明的内存大小这三者之和,如果总和超过最大可用内存块的大小。则MS-DOS停止加载程 序并返回一个出错值。否则面,它计算程序映象的大小加上PSP的大小再加上EXEHEADER结构中exMaxAlloc域说明的内存大小之和,如果第二 个总和小于最大可用内存块的大小,则MS-DOS 分配计算得到的内存量。否则,它分配最大可用内存块。分配完内存后,MS-DOS确定段地址,也称为起始段地址,MS-DOS从此处加载程序映象。如果 exMinAlloc域和exMaxAlloc域中的值都为零,则MS-DOS把映象尽可能地加载到内存最高端。否则,它把映象加载到紧挨着PSP域之 上。接下来,MS-DOS读取重定位表中的项目调整所有由可重定位指针说明的段地址。对于重定位表中的每个指针,MS-DOS寻找程序映象中相应的可重定 位段地址,并把起始段地址加到它之上。一旦调整完毕,段地址便指向了内存中被加载程序的代码和数据段。 MS-DOS在所分配内存的最低部分建造256字节的PSP,把AL和AH设置为加载 .COM程序时所设置的值。MS-DOS使用文件头中的值设置SP与SS,调整SS初始值,把起始地址加到它之上。MS-DOS还把ES和DS设置为 PSP的段地址.最后,MS-DOS从程序文件头读取CS和IP的初始值,把起始段地址加到CS之 上,把控制转移到位于调整后地址处的程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-7 15:34:46 | 显示全部楼层
.EXE   -   DOS   EXE   File   Structure   
      
              Offset   Size           Description   
      
                  00       word     "MZ"   -   Link   file   .EXE   signature   (Mark   Zbikowski?)   
                  02       word     length   of   image   mod   512   
                  04       word     size   of   file   in   512   byte   pages   
                  06       word     number   of   relocation   items   following   header   
                  08       word     size   of   header   in   16   byte   paragraphs,   used   to   locate   
                            the   beginning   of   the   load   module   
                  0A       word     min   #   of   paragraphs   needed   to   run   program   
                  0C       word     max   #   of   paragraphs   the   program   would   like   
                  0E       word     offset   in   load   module   of   stack   segment   (in   paras)   
                  10       word     initial   SP   value   to   be   loaded   
                  12       word     negative   checksum   of   pgm   used   while   by   EXEC   loads   pgm   
                  14       word     program   entry   point,   (initial   IP   value)   
                  16       word     offset   in   load   module   of   the   code   segment   (in   paras)   
                  18       word     offset   in   .EXE   file   of   first   relocation   item   
                  1A       word     overlay   number   (0   for   root   program)   
      
                  -   relocation   table   and   the   program   load   module   follow   the   header   
                  -   relocation   entries   are   32   bit   values   representing   the   offset   
                      into   the   load   module   needing   patched   
                  -   once   the   relocatable   item   is   found,   the   CS   register   is   added   to   
                      the   value   found   at   the   calculated   offset   
      
    Registers   at   load   time   of   the   EXE   file   are   as   follows:   
      
                  AX: contains   number   of   characters   in   command   tail,   or   0   
                  BX:CX 32   bit   value   indicating   the   load   module   memory   size   
                  DX zero   
                  SS:SP set   to   stack   segment   if   defined   else,     SS   =   CS   and   
                  SP=FFFFh   or   top   of   memory.   
                  DS set   to   segment   address   of   EXE   header   
                  ES set   to   segment   address   of   EXE   header   
                  CS:IP far   address   of   program   entry   point,   (label   on   "END"   
                  statement   of   program)Top

2 楼wowocock(机器猫)回复于 2002-07-18 21:53:55 得分 15
Dos   exe   file   structure   
   
  offset   size         description   
   
  00   word   "mz"   -   link   file   .exe   signature   (mark   zbikowski?)   
  02   word   length   of   image   mod   512   
  04   word   size   of   file   in   512   byte   pages   
  06   word   number   of   relocation   items   following   header   
  08   word   size   of   header   in   16   byte   paragraphs,   used   to   locate   
          the   beginning   of   the   load   module   
  0a   word   min   #   of   paragraphs   needed   to   run   program   
  0c   word   max   #   of   paragraphs   the   program   would   like   
  0e   word   offset   in   load   module   of   stack   segment   (in   paras)   
  10   word   initial   sp   value   to   be   loaded   
  12   word   negative   checksum   of   pgm   used   while   by   exec   loads   pgm   
  14   word   program   entry   point,   (initial   ip   value)   
  16   word   offset   in   load   module   of   the   code   segment   (in   paras)   
  18   word   offset   in   .exe   file   of   first   relocation   item   
  1a   word   overlay   number   (0   for   root   program)   
   
  -   relocation   table   and   the   program   load   module   follow   the   header   
  -   relocation   entries   are   32   bit   values   representing   the   offset   
  into   the   load   module   needing   patched   
  -   once   the   relocatable   item   is   found,   the   cs   register   is   added   to   
  the   value   found   at   the   calculated   offset   
   
          registers   at   load   time   of   the   exe   file   are   as   follows:   
   
  ax:         contains   number   of   characters   in   command   tail,   or   0   
  bx:cx         32   bit   value   indicating   the   load   module   memory   size   
  dx         zero   
  ss:sp         set   to   stack   segment   if   defined   else,   ss   =   cs   and   
          sp=ffffh   or   top   of   memory.   
  ds         set   to   segment   address   of   exe   header   
  es         set   to   segment   address   of   exe   header   
  cs:ip         far   address   of   program   entry   point,   (label   on   "end"   
          statement   of   program).   
   
          EXE文件包含一个文件头和一个可重定位程序映象.文件头包含MS-DOS   
  用于加载程序的信息,例如程序的大小和寄存器的初始值.文件头还指向一个   
  重定位表,该表包含指向程序映象中可重定位段地址的指针链表.文件头的形   
  式与EXEHEADER结构对应:   
  EXEHEADER   STRUC   
  exSignature   dw   5A4Dh   ;.EXE标志   
  exExraBytes   dw   ?   ;最后(部分)页中的字节数   
  exPages   dw   ?   ;文件中的全部和部分页数   
  exRelocItems   dw   ?   ;重定位表中的指针数   
  exHeaderSize   dw   ?   ;以字节为单位的文件头大小   
  exMinAlloc   dw   ?   ;最小分配大小   
  exMaxAlloc   dw   ?   ;最大分配大小   
  exInitSS   dw   ?   ;初始SS值   
  exInitSP   dw   ?   ;初始SP值   
  exChechSum   dw   ?   ;补码校验值   
  exInitIP   dw   ?   ;初始IP值   
  exInitCS   dw   ?   ;初始CS值   
  exRelocTable   dw   ?   ;重定位表的字节偏移量   
  exOverlay   dw   ?   ;覆盖号   
  EXEHEADER   ENDS   
  程序映象,包含处理器代码和程序的初始数据,紧接在文件头之后.它的   
  大小,以字节为单位,等于.EXE文件的大小减去文件头的大小,也等于exHeaderSize   
  的域的值乘以16.MS-DOS通过把该映象直接从文件拷贝到内存加载.EXE程序   
  然后调整定位表中说明的可重定位段地址.   
   
  定位表是一个重定位指针数组,每个指向程序映象中的可重定位段地址.   文件头中的exRelocItems域说明了数组中指针的个数,exRelocTable域说明了   分配表的起始文件偏移量.每个重定位指针由两个16位值组成:偏移量和段值.   为加载.EXE程序,MS-DOS首先读文件头以确定.EXE标志并计算程序映象的   大小,然后它试图申请内存.首先,它计算程序映象文件的大小加上PSP的大小   再加上EXEHEADER结构中的exMinAlloc域说明的内存大小这三者之和,如果总   和超过最大可用内存块的大小,则MS-DOS停止加载程序并返回一个出错值.否   则,它计算程序映象的大小加上PSP的大小再加上EXEHEADER结构中exMaxAlloc   域说明的内存大小之和,如果第二个总和小于最大可用内存块的大小,则MS-DOS   分配计算得到的内存量.否则,它分配最大可用内存块.   分配完内存后,MS-DOS确定段地址;也称为起始段地址,MS-DOS从此处加载   程序映象.如果exMinAlloc域和exMaxAlloc域中的值都为零,则MS-DOS把映象   尽可能地加载到内存最高端.否则,它把映象加载到紧挨着PSP域之上.   接下来,MS-DOS读取重定位表中的项目调整所有由可重定位指针说明的段   地址.对于重定位表中的每个指针,MS-DOS寻找程序映象中相应的可重定位段   地址,并把起始段地址加到它之上.一旦调整完毕,段地址便指向了内存中被加   载程序的代码和数据段.   MS-DOS在所分配内存的最低部分建造256字节的PSP,把AL和AH设置为加载   .COM程序时所设置的值.MS-DOS使用文件头中的值设置SP与SS,调整SS初始值,   把起始地址加到它之上.MS-DOS还把ES和DS设置为PSP的段地址.   最后,MS-DOS从程序文件头读取CS和IP的初始值,把起始段地址加到CS之   上,把控制转移到位于调整后地址处的程序.
回复 支持 反对

使用道具 举报

发表于 2007-9-19 20:47:38 | 显示全部楼层
非常详细,谢谢苦禅!!!
回复 支持 反对

使用道具 举报

发表于 2008-6-1 17:24:53 | 显示全部楼层
酷素材
今天我是来顶贴的`
回复 支持 反对

使用道具 举报

发表于 2009-9-10 08:35:57 | 显示全部楼层
酷素材
写的很专业,很详细,对PE一直不及明白,这篇文章好像是个很好的参考,谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2018-1-13 09:46:16 | 显示全部楼层
很不错。。。
回复 支持 反对

使用道具 举报

发表于 2018-1-13 09:42:23 | 显示全部楼层
说的非常好
回复 支持 反对

使用道具 举报

发表于 2018-1-13 10:00:37 | 显示全部楼层
学习了。。。
回复 支持 反对

使用道具 举报

发表于 2018-1-13 10:31:26 | 显示全部楼层
好帖子要收藏
回复 支持 反对

使用道具 举报

发表于 2018-1-13 10:25:00 | 显示全部楼层
果断收藏了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | [立即注册]

本版积分规则

2345