F8LEFT 发表于 2014-9-16 19:49:22

菜鸟的PE结构学习之路(一) 认识DOS头

本帖最后由 F8LEFT 于 2014-9-16 21:42 编辑

      菜鸟在此,大牛飞过~~~~~~~
   以上仅为个人的一点小小的心得,有什么不对的地方还请各位指出。


      大家好,我是F8。这次我机智的来水贴了,顺便骗分骗经验。啦啦啦,求别打我。
       这次参考的书籍主要为《Windows PE权威指南》,写得挺有趣的一本书,有兴趣的也请去看看。
       那么,下面正式开始:

----------------------------------请叫我分割线-------------------------------------分割线-----------------------------------
      
      首先,请大家看一下下面一组数据:

      张三 1992 22 清华大学计算机系
      你会怎么解读?
①张三,1992年生,现年22岁,就读于清华大学计算机。
②张三,1992年22岁时毕业于清华大学计算机系。

   看,不同的人会有不同的解析对吧。更加要命的是观众无法判断到底哪一种理解才是正确的,真正的意思只有写出这几个数据的人才会理解。于是,如果写数据的人同时给出了这么一个结构

结构 学生 {
    字符串 名字
    数字    出生日期
    数字    先有年龄
    字符串 就读专业
}
    嘎嘎,这不就是第一种情况嘛~~~
    这就是数据结构的概。以某种方法对数据进行排列,解析的概念。

   紧接着,我再给出一组数据
4D 5A 90 00 03 00 00 0004 00 00 00 FF FF 00 00
B8 00 00 00 00 00 00 0040 00 00 00 00 00 00 00
00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00
00 00 00 00 00 00 00 0000 00 00 00 C8 00 00 00   
    这更加难看懂了!(⊙v⊙)嗯,乍看之下还可能会以为是一堆乱码!!
    不过,一旦尝试按照一定的方法去解析它的话,就会发现这看起来无规律的东西瞬间被赋予了意义
    比如说,4D 5A 对应于ASCII码"MZ",众所周知,这是微软的一个幻数,用来标识PE文件的。
    实际上,上面的数据就是DOS头的第一部分,IMAGE_DOS_HEADER,而那个4D 5A,就对应于一个成员e_magic。
    废话说多了,下面我就直接给出IMAGE_DOS_HEADER的定义吧。

IMAGE_DOS_HEADER STRUCT
e_magic      WORD?   ;0000h - EXE标志,"MZ"
e_cblp         WORD?   ;0002h - 最后(部分)页中的字节数
e_cp             WORD?   ;0004h - 文件中的全部和部分页数
e_crlc            WORD?   ;0006h - 重定位表中的指针数
e_cparhdr   WORD?   ;0008h - 头部尺寸,以段落为单位
e_minalloc   WORD?   ;000ah - 所需的最小附加段
e_maxalloc    WORD?   ;000ch - 所需的最大附加段
e_ss            WORD?   ;000eh - 初始的SS值(相对偏移量)
e_sp             WORD?   ;0010h - 初始的SP值
e_csum         WORD?   ;0012h - 补码校验值
e_ip               WORD?   ;0014h - 初始的IP值
e_cs            WORD?   ;0016h - 初始的CS值
e_lfarlc         WORD?   ;0018h - 重定位表的字节偏移量
e_ovno         WORD?   ;001ah - 覆盖号

e_res            WORD 4dup(?);001ch - 保留字
e_oemid       WORD?   ;0024h - OEM标识符(相对e_oeminfo)
e_oeminfo    WORD?   ;0026h - OEM信息
e_res2          WORD 10dup(?);0028h - 保留字
e_lfanew       DWORD ?   ;003ch - PE头相对于文件的偏移地址
IMAGE_DOS_HEADER ENDS
      作为一个过来人,我可以很负责的告诉你,对于这个结构,我们一般只关心它的两个成员

e_magic:标识该文件是否为PE文件,应当为4D 5A (MZ)
e_lfanew: 标识出PE头的相对偏移地址。
   恰好是一头一尾,除了最后一个成员为4字节以外,都是占用2字节,非常的好记。
   于是,对IMAGE_DOS_HEADER结构的介绍就到此为止了。这个结果的长度在32位系统下,恰好是40h,WinHex中恰好占头用4行,应该是很容易辨别的。
   紧接着IMAGE_DOS_HEADER,排在PE头前面的,是一个叫做DOS Stub的结构,大小不固定,随着编译器的不同而发生改变。实际上是一个小型的DOS程序,运行在16位系统上,来提示该程序是32位程序的。这里来简单介绍一下。
   DOS Stub数据
0E 1F BA 0E 00 B4 09 CD21.........
反汇编一下就是:
0E      PUSH CS                           ;将CS段地址给DS
1F      POPDS
BA0E00MOVDX,000E            ;DS:DX指向要显示的字符串数据处
B409    MOVAH,09                  ;调用9号中断,屏幕显示字符串
CD21    INT21
B8044CMOVAX,4C01            ;调用4号中断,正常退出程序
CD21    INT21
...........字符串数据

   很简单的内容,有兴趣的话也可以自行修改。只要不要忘记了,如果改动了PE头的位置,必须把IMAGE_DOS_HEADER.lfanew的指向重新改一下,指回PE头。

      有了这样的一些基本的内容,就可以着手写一个自己的PE查看器了,为了加深记忆嘛。

      有兴趣的也可以自行写一份,代码我也会给出。。。不过技术含量不高,只求大牛们不要喷了。
      那么DOS头也就介绍到这里了。恩恩,这才是一个开始啊,我会继续努力更新的。










lixihong10 发表于 2014-9-18 15:29:12

写的这么好为啥没人顶?前排支持~

一梦千年缘 发表于 2014-9-21 21:52:47

支持,下来学习学习

湘灵鼓瑟 发表于 2014-9-23 20:50:44

学习了~~

fzzy200 发表于 2014-9-24 23:29:05


支持,下来学习学习

落叶枫林 发表于 2014-11-6 18:28:53

代码我也会给出

落叶枫林 发表于 2014-11-6 18:29:14


代码我也会给出

lhj2008 发表于 2014-12-17 17:20:29

终于找到pe方面的通俗教程了

慕子风子 发表于 2014-12-26 11:48:51

{:soso_e136:}看晕了,看来要好好练习了

jay454865 发表于 2015-1-5 09:58:14

学习学习感谢大神
页: [1] 2 3
查看完整版本: 菜鸟的PE结构学习之路(一) 认识DOS头