查看: 977|回复: 3

[原创图文] PE图文教程-4.继续完善可选头

[复制链接]
发表于 2019-8-17 22:16:46 | 显示全部楼层 |阅读模式
打开IMAGE_OPTIONAL_HEADER结构.txt文件
717295d580bcabca97.png
成员13,2个字节,表示操作系统主版本号,此值不会影响程序的执行,我们这里填充零,此值为“0000”。
        成员14,2个字节,表示操作系统副版本号,此值不会影响程序的执行,我们这里填充零,此值为“0000”。
        成员15,2个字节,表示程序主版本号,此值不会影响程序的执行,我们这里填充零,此值为“0000”。
        成员16,2个字节,表示程序副版本号,此值不会影响程序的执行,我们这里填充零,此值为“0000”。
填充800

819155d580bdd0cd77.png
成员172个字节,表示子系统主版本号。win32子系统版本。PE文件是专门为Win32设计的,该子系统版本必定是4.0那么此处值为“04 00”。
741775d580bed4fc5e.png
      成员18,2个字节,表示子系统副版本号,此值应为“00 00”。
      成员19,4个字节,此值一般为“00 00 00 00”。
293015d580bf87336b.png
插入6null字节
864355d580c03d9849.png
成员204个字节,表示程序调入后占用内存大小(字节),等于所有段的长度之和。所有头和节经过节对齐处理后 的大小。我们知道,我们文件PE结构总长小于1000h,但是内存中的对齐粒度是1000h,所以PE结构被映射后要占1000h,尽管很多空间没有使用,另外我们有3个段,每个段的长度小于1000h,但是被映射后同样要占1000h,所以总共占用内存的大小为1000hPE头的大小) + 3 * 1000h3个区段的大小) = 4000h(总内存大小),因此此值为“00400000。(符合内存对其)
978425d580c0eb05e9.png
成员214个字节,表示所有文件头的长度之和,这里指的是文件大小非映射到内存的大小(即从文件开始到第一个段之间的大小)。也就是所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸。那么我们怎么得到这个值呢?我们的可以以此值作为PE文件第一节的文件偏移量。PE文件结构总大小为:

  64dos头) + 112 + 4NT头) + 20(文件头) + 224(可选头) + 3 * 40(节表) = 544 byte 转化成十六进制为220h,那么此值就是220h吗?
       不是的,因为我们文件中的对齐粒度是200h,那么220h实际上要占用400h的空间,所以此值为“00040000
110945d580c1b29786.png
成员224个字节,表示校验和。它仅用在驱动程序中,在可执行文件中可能为0。它的计算方法Microsoft不公开,在imagehelp.dll中的CheckSumMappedFile()函数可以计算它,此处我们设为填充零,此值为“00000000

841895d580c2548e67.png
成员23,2个字节,表示NT子系统,可能是以下的值:

      IMAGE_SUBSYSTEM_NATIVE (1) 不需要子系统。用在驱动程序中。
      IMAGE_SUBSYSTEM_WINDOWS_GUI(2) WIN32 graphical程序(它可用AllocConsole()来打开一个控制台,但是不能在一开始自动得到)。
      IMAGE_SUBSYSTEM_WINDOWS_CUI(3) WIN32 console程序(它可以一开始自动建立)。
      IMAGE_SUBSYSTEM_OS2_CUI(5) OS/2 console程序(因为程序是OS/2格式,所以它很少用在PE)。
      IMAGE_SUBSYSTEM_POSIX_CUI(7) POSIX console程序。
      Windows程序总是用WIN32子系统,所以只有2和3是合法的值。也就是说此值必须为2或3,如果是3,那么程序运行后会自动打开一个控制台,我们这里设为2,此值为“0200“。

811825d580c2fd7d38.png
成员242个字节,表示Dll状态,我们这里填充零,此值为“0000”。

        成员254个字节,保留堆栈大小,我们这里填充零,此值为“00000000”。

        成员264个字节,启动后实际申请的堆栈数,可随实际情况变大,我们这里填充零,此值为“00000000”。

        成员274个字节,保留堆大小,我们这里填充零,此值为“00000000”。

        成员284个字节,实际堆大小,我们这里填充零,此值为“00000000”。

        成员294个字节,装载标志,我们这里填充零,此值为“00000000”。
386965d580c3c13702.png
成员304个字节,在讲这个成员之前,我们应该先了解成员31,成员31实际上是一个IMAGE_DATA_DIRECTORY结构的数组,成员30的值就是表示该数组的大小。通常有16个元素,所以此值为:“10000000”。
45325d580c47767c0.png

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

0

主题

5

帖子

0

精华

初级会员

Rank: 4

学币
8
荣耀
0
rank
0
违规
0

    发表于 2019-8-18 14:37:23 | 显示全部楼层
    感谢分享
    回复 打印

    使用道具 举报

    0

    主题

    26

    帖子

    0

    精华

    初级会员

    Rank: 4

    学币
    17
    荣耀
    0
    rank
    0
    违规
    0

      发表于 2019-8-24 16:26:04 | 显示全部楼层

      感谢分享
      回复 打印

      使用道具 举报

       楼主| 发表于 2019-8-24 17:30:24 来自手机 | 显示全部楼层
      大麦煮小米 发表于 2019-8-24 16:26
      感谢分享

      蟹蟹支持
      微信公众号
      快速回复 返回顶部 返回列表