PE图文教程-1.PE的介绍与手写DOS头
由于论坛字体格式排版和字数限制的原因,这系列教程我主要以图来解释(有的内容会引用书上的原文)在讲PE之前首先介绍一下WinNT.h这个库文件这个头文件包含了所有PE相关的结构首先创建一个小的可执行程序选择一个小的应用程序编译好之后,我们看一下他的区段(text是放代码的,rdata段是放导入表的,data用来放全局函数的)把头文件放到编译的目录下可以精简我们的程序只要在源码中包含一下这个头文件即可右键查看头文件合并区段的部分被注释掉了加上合并区段的代码编译出来会发现应用程序更小了,查看一下区段,会发现区段被合并了这个库文件的部分功能(非常有用)就介绍到这里
下面进入正题这是PE的整体架构我们一个一个分开看为什么要将MZ当做DOS签名呢?这个是我手写PE程序的DOS头,有64字节(PE只是个参考,有些结构体成员可有可无)计算一下大小,验证一下DOS存根的概念40到4D是16位的汇编指令,在DOS环境下才会执行这些代码,32为的Windows中不会运行。这是手写PE的DOS存根,总共112字节 我将它的位置留出来方便讲解,也可以不留(DOS存根大小一般为112字节,大小不固定)NT头(包含了文件头和可选头)NT头有4个字节的标识,前面空出的8字节是为了内存对其需要,必须得填充NULL文件头文件头是表现文件大致属性的结构体注意一个特殊的例子:.obj和resource DLL的characteristics值不是0002h,他们都不可执行手写PE的NT头可选头(PE头中最大的结构体)必须有的成员:否则可执行文件会出错
手写PE的可选头节区头的概念:节区头结构体:重要成员:Characterisitics是由下面这些值组合起来的(相加)手写PE的节区头(区段头)RVA和RAW之间的转换:文件偏移-文件中节区的起始位置=内存偏移-内存中节区的起始位置文件偏移=内存偏移-内存中节区的起始位置+文件中节区的起始位置
创建一个文件,用C32打开认识数据的存储方式:写好PE签名,然后剩下成员用58个00填充写好了参考编译器生成的程序把存根的位置留出来把NT头的PE标识写在后面先写到这里,要不然文章太长了,未完待续····下节课见~ 跟着帖子重新梳理了一遍PE头部的知识 比较详细 感谢 在非winxp里观察dos代码 可以使用dosbox ,建议刚入门的朋友可以尝试建立多平台对比概念 比如386和64对比 各种CPU类型下的对比 很多细节方面是不一样的 二进制编辑工具推荐使用有模板加载的 比如010Editor等 user 发表于 2019-5-20 14:52
感谢您的评价!这段时间我还会更新的。
页:
[1]