|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1.什么是PE头?
PE分很多数据块, 但是任何一个PE都有一个起点就是PE头,其中包括PE的所有信息,如图
图中是PE头的大致结构, 我会跟大家一一讲解
2.DOS头
大致如图片所示, 大家不要被这么多的变量吓到, (学过C和C++应该知道WORD 代表两个字节,DWORD 代表四个字节) 但是DOS头中实际重要的变量就只有两个, e_magic 和 e_lfanew。
e_magic : MZ标志(大端存储在内存中是 5A4D), MZ貌似是发明PE格式的人名缩写
e_lfanew : PE NT头的偏移
我们知道 PE在文件中和内存中的对齐可能不一致,文件中可能是0x200, 内存中是0x1000, 但是PE数据块中,数据不一定能占用0x200或0x1000的大小,所以多余的都是用0填充,就像C中字符串以0结尾的原理一样。
接下来带大家看一看看PE在文件中的样子,如图
红圈,圈起来的地方分别是e_magic和e_lfanew
现在可能有人会疑惑了为什么DOS头和NT头不是连续在一起的,而是用e_lfanew变量标明所在的地方
那我们就来看看DOS头和NT头之间是什么吧!
从上面的图片来看e_lfanew是20 01 00 00 但不要忘记在windows中是小端存储,所以要反过来读取内容, 为 00 00 01 20,那么NT头在文件(硬盘)中开始地方就是120h,我们来找找吧。
找到了120h的地方左下角, 中间红色圈起来的数据是什么看到右上角的英文了吗?This program cannot be run in DOS mod(此程序不能在DOS mod中运行),感情这一块都是该PE在DOS系统中的说明啊, 当PE在DOS系统中运行便会弹出该串英文。
大家仔细想想, 换个角度这块数据只有在DOS系统中才会运行...代表平常系统是用不到这一块数据的, 我们可以写入一些自己的数据,嘿嘿嘿, 至于如何写入数据以后大概会和大家介绍。
|
|