-
-
[分享]#30天写作挑战#PE小知识之SizeOfImage和文件大小
-
发表于: 2020-9-13 17:46 13940
-
感谢狗迪群里,一位叫做黄莫傲的金主霸霸
的大佬
楼主在练习文件拉伸的内容时,发现这样一个现象,SizeOfImage竟然比文件大小还小,如果按照常理分析,SizeOfImage是文件进行了拉伸后的大小,那么按理说,SizeOfImage应该不小于文件大小.
这个问题对于一个刚刚接触PE的入门者来说,一定会折磨到怀疑人生
对于这个问题楼主在群里疯狂艾特大佬寻求答案.终于有个大佬这样解释了:
(以下结论完全取自大佬的文档)
这是一个普通的exe能代表绝大部分PE文件(百分之98以上的PE文件),它的文件大小为40,856字节。
用PE工具查看它的SizeOfImage(内存大小) 为0x8000=32,768。
在<PE权威指南><逆向工程核心原理中>都有提到过:一个PE文件,它有两种状态,在硬盘里和在内存中。PE文件在这两种状态中的字节大小不一样。
当PE文件从硬盘映射到内存中,会进行拉伸,字节大小会变大。
也就是上面的SizeOfImage应该大于40,856(在硬盘中的大小)。
但是在这里SizeofImage=32,768小于40856,这违背了我们知道的常理。
在提点下,发现了原因。
这个INSTDRV.EXE 有 “数字签名”(这个签名是编译后加上的)。数字签名作为节的一部分,它并不参与映射到内存中,这也是为什么上面大于的原因。
我们对这个原因进行验证,利用PEloader豪华版进行重建PE文件。
重建后的PE文件:
此时的SizeofImage=0x7D58=32,088 > 21,315(重建后的大小) 符合文件的映射
结论:一个PE文件的文件大小可能大于它在内存映射后的大小,是因为其在编译完成后添加了数字签名,数字签名以一串十六进制数的形式添加到了节中。
这个问题在YY.exe和QQ.exe 这些双签名 (SHA1 SHA256)文件中存在。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- 利用OLLVM编译windows驱动 30404
- [求助]SetWindowLong、SetWindowLongPtr无效问题 6915
- [求助]大佬们求一份21H2镜像,最好是VM镜像,原版也可以 6970
- [原创]X86内核笔记_6_APC相关 22425
- [原创]X86内核笔记_5_句柄 15487