学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1157

主题
发表于 2019-3-16 22:29:28 | 查看: 6094| 回复: 2
写入_IMAGE_FILE_HEADER全部成员 _IMAGE_OPTIONAL_HEADER部分成员
375575c8d0736f24e8.png
上一节我们已经学习了这些结构,再复习一下
795325c8d074337c23.png
写入_IMAGE_FILE_HEADER数据: 成员1,占2个字节,表示该文件运行所要求的CPU。对于Intel平台,该值是“4C01”。
175855c8d074f8040e.png
成员2,占2个字节,表示该文件中段的总数,我这里计划写3个段(Pelorder查看参考程序)。(.text(代码段)、.rdata(只读数据段)、  .data(全局变量数据段))。所以此处值是“0300”。
56715c8d075b739c8.png
成员3,占4个字节,表示文件创建日期和时间,从1970.1.1 00:00:00以来的秒数,我们这里填“0000”即可。 成员4,占4个字节,表示符号表的指针,主要用于调试,在这里填“0000”。成员5,占4个字节,表示符号的数目,主要用于调试,在这里填“0000
593555c8d0764b094d.png
成员6,占2个字节,表示后面的“PE文件可选头 ”部分所占空间大小。我们来再复习一下这个结构。
204195c8d076eecb16.png
我们已经知道PE文件可选头 ”的大小是 224 byte,转换成十六进制就是E0,所以这里的值为“E000(这在PE中是不会变的,一定要记住,就像4D5A5045一样)
307955c8d0779cab84.png
成员7,占2个字节,表示关于文件信息的标记,比如文件是exe还是dll。这个值实际上是二进制位进行或运算得到的值。各二进制位表示的意义如下:
772235c8d0787060ec.png
177625c8d079118d05.png
10585c8d0796d85bd.png
442195c8d079a9c382.png
我从头文件中复制出来一份可选头结构体,并加了相关解释
705375c8d07a47b2e6.png
成员1,占2个字节,表示文件的格式,值为0x010B表示32位的可选头
795305c8d07c35b462.png
235445c8d07cf1de05.png
成员2,占1个字节,表示链接器的主版本号,此值不会影响程序的执行,我们这里填充零, 此值为“00”。
         成员3,占1个字节,表示链接器的幅版本号,此值不会影响程序的执行,我们这里填充零,此值为“00”。
         成员4,占4个字节,表示可执行代码的长度,此值不会影响程序的执行,我们这里填充零,此值为“00000000”。
         成员5,占4个字节,表示初始化数据的长度(数据段)。此值不会影响程序的执行,我们这里填充零,此值为“00000000”。
         成员6,占4个字节,表示未初始化数据的长度(bss段)。此值不会影响程序的执行,我们这里填充零,此值为“00000000”。
成员2到成员6总共占用14个字节 插入14个字节
378015c8d07da8fa5d.png
645625c8d07dfd2a29.png
成员7 4个字节,表示代码的入口RVA(文件映射到内存的偏移地址)地址,程序从这儿开始执行。PE装载器准备运行的PE文件的第一个指令的RVA。若您要改变整个执行的流程,可以将该值指定到新的RVA,这样新RVA处的指令首先被执行。       那么这个值我们怎么得到呢?我们知道在文件中有个.text段,他包含了所有的代码,我们可以从中找到我们的入口地址,在这里就是.text段里的第一行代码,也就是.text段的首地址,而在.text段头部就给出了他映射到内存后的首地址的偏移,我们查看已经做好的demo找到他取出添到此处,这里为“00100000”。(此处不理解没关系,我们讲完段结构后自能迎刃而解)
399315c8d07e949dce.png
成员84个字节,表示可执行代码起始位置。当然就是.text段的首地址,此值不会影响程序的执行,我们这里填充零,此值为“00000000”。
成员94个字节,表示初始化数据的起始位置,此值不会影响程序的执行,我们这里填充零,此值为“00000000”。
323065c8d07f7555bf.png
337055c8d07fb14f4c.png
成员104个字节,就是文件映射到内存是的基地址。PE文件的优先装载地址。通常设为“00400000”,PE装载器将尝试把文件装到虚拟地址空间的00400000h处。“优先”表示若该地址区域已被其他模块占用,那PE装载器会选用其他空闲地址。我们这里的值设为“00400000”。
443725c8d0805ad36a.png

源码课件.zip (10.29 KB, 下载次数: 2, 售价: 5 学币)

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046
发表于 2019-8-7 11:25:57
有一个小错误,在最后一张图片中,PE文件的优先装载地址通常确实是设为“00400000h”,但在偏移地址为0ECh-0EFh处的值并不是“00  40  00  00”,而是“00 00  40  00”。
发表于 2019-8-7 12:06:59 来自手机
Herbage 发表于 2019-8-7 11:25
有一个小错误,在最后一张图片中,PE文件的优先装载地址通常确实是设为“00400000h”,但在偏移地址为0ECh-0E ...

感谢纠正!

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-4-19 18:53 , Processed in 0.107603 second(s), 52 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表