查看: 2078|回复: 2

[原创图文] PE图文教程-1.PE的介绍与手写DOS头

[复制链接]
发表于 2019-3-4 21:13:40 | 显示全部楼层 |阅读模式
由于论坛字体格式排版和字数限制的原因,这系列教程我主要以图来解释(有的内容会引用书上的原文)

在讲PE之前首先介绍一下WinNT.h这个库文件
这个头文件包含了所有PE相关的结构
778885c7d20db92b11.png
首先创建一个小的可执行程序
532845c7d20e52f282.png
选择一个小的应用程序
106185c7d20ed91bf4.png
编译好之后,我们看一下他的区段(text是放代码的,rdata段是放导入表的,data用来放全局函数的)
606795c7d20f70b613.png
把头文件放到编译的目录下可以精简我们的程序
334945c7d2100e010f.png
只要在源码中包含一下这个头文件即可
352525c7d210b4565e.png
右键查看头文件
236265c7d21140319c.png
合并区段的部分被注释掉了
164305c7d211d699e6.png
加上合并区段的代码
479785c7d21263283d.png
编译出来会发现应用程序更小了,查看一下区段,会发现区段被合并了
304365c7d213077dbd.png
这个库文件的部分功能(非常有用)就介绍到这里


下面进入正题
443055c7d214041915.png
这是PE的整体架构
854145c7d214dba1ce.png
我们一个一个分开看
686915c7d21596223f.png
为什么要将MZ当做DOS签名呢?
396635c7d21696ae72.png
这个是我手写PE程序的DOS头,有64字节(PE只是个参考,有些结构体成员可有可无)
635935c7d21760b9ac.png
计算一下大小,验证一下
742095c7d218d965c1.png
DOS存根的概念
698785c7d219c2f0cf.png
404D16位的汇编指令,在DOS环境下才会执行这些代码,32为的Windows中不会运行。
772865c7d21a7b4da2.png
这是手写PEDOS存根,总共112字节 我将它的位置留出来方便讲解,也可以不留(DOS存根大小一般为112字节,大小不固定)
96485c7d21b4be37b.png
NT头(包含了文件头和可选头)
486645c7d21c12e41c.png
340485c7d21c857003.png
NT头有4个字节的标识,前面空出的8字节是为了内存对其需要,必须得填充NULL
704225c7d21d34eb65.png
文件头
文件头是表现文件大致属性的结构体
107925c7d21ddd5488.png
653135c7d21e440427.png
512495c7d21e901703.png
823785c7d21ede9cb7.png
635485c7d21fb49bd1.png
999375c7d22032ab18.png
510625c7d220a1e361.png
注意一个特殊的例子:.objresource DLLcharacteristics值不是0002h,他们都不可执行
886815c7d2216a6fc2.png
930895c7d221c58278.png
116255c7d2223ab855.png
手写PENT
94215c7d222dc2f26.png
可选头(PE头中最大的结构体)
598695c7d223ea7d86.png
必须有的成员:否则可执行文件会出错

899385c7d2248a1e1d.png

351095c7d2250bd2bb.png
1295c7d22592e5f6.png
手写PE的可选头
904955c7d2261d9d8a.png
节区头的概念:
482945c7d22758099b.png
节区头结构体:
104175c7d227fe306a.png
重要成员:
591355c7d228c9562a.png
224915c7d229144b1d.png
Characterisitics是由下面这些值组合起来的(相加)
572465c7d229a49107.png
364715c7d22a095cb5.png
手写PE的节区头(区段头)
583045c7d22aa962f7.png
RVARAW之间的转换:
320805c7d22b63b02e.png
文件偏移-文件中节区的起始位置=内存偏移-内存中节区的起始位置
文件偏移=内存偏移-内存中节区的起始位置+文件中节区的起始位置


创建一个文件,用C32打开
483175c7d22c88241a.png
330625c7d22cc3303a.png
认识数据的存储方式:
262925c7d22d91f7d9.png
113045c7d22e35eaa3.png
782915c7d22ea1f77c.png
写好PE签名,然后剩下成员用5800填充
455435c7d22f661bda.png 907725c7d2305acc2c.png
写好了
303505c7d2310a62d5.png
564315c7d2316b37fa.png
208305c7d231cdd8e3.png
参考编译器生成的程序
438565c7d2326d5214.png
把存根的位置留出来
292545c7d233216377.png
671225c7d233d6dd2a.png
NT头的PE标识写在后面
39535c7d234801537.png
先写到这里,要不然文章太长了,未完待续····下节课见~
源码和工具.zip (2.53 MB, 下载次数: 2)

评分

参与人数 1学币 +2 收起 理由
user + 2 学到了!

查看全部评分

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

0

主题

1

帖子

0

精华

初级会员

Rank: 4

学币
3
荣耀
0
rank
0
违规
0

    发表于 2019-5-20 14:52:24 | 显示全部楼层
    跟着帖子重新梳理了一遍PE头部的知识 比较详细 感谢 在非winxp里观察dos代码 可以使用dosbox ,建议刚入门的朋友可以尝试建立多平台对比概念 比如386和64对比 各种CPU类型下的对比 很多细节方面是不一样的 二进制编辑工具推荐使用有模板加载的 比如010Editor等
     楼主| 发表于 2019-5-20 20:24:43 | 显示全部楼层

    感谢您的评价!这段时间我还会更新的。
    论坛交流群:672619046
    微信公众号
    快速回复 返回顶部 返回列表