您的位置:首页 > 运维架构

流水账笔记:PE文件格式(OptionalHeader 上)

2017-10-12 01:34 597 查看
主要介绍 可选头 的结构体成员



OptionalHeader

先贴上 IMAGE_OPTIONAL_HEADER 的部分结构体成员



Magic

Magic,系统在此判断该程序是 32 位的程序还是 64 位程序。如果是 32 位程序,则机器码将是 0x10b;如果为 64 位,则机器码将会是 0x20b,该字段不能随意修改

0x107一般指的是其他电子设备(如xBox)




MajorLinkerVersion & MinorLinkerVersion

链接器的主版本号和副版本号 ,从上图中我们可以知道扫雷程序的版本号是 7。该字段仅供参考,可以随意修改

VS2013 的连接器版本号为 12.00



一个程序经VS2013 编译后,这个字段的主版本号即为 12。通过这个字段,我们可以推断该程序是通过什么版本的编译器编译。再根据连接器的特性,判断该程序是否会有 随机基址,以及 局部变量定义顺序



SizeOfCode

表示 代码大小,这里的值为 0x3C00,对齐值为 5121 字节。该字段为参考字段,可以随意修改,但是修改后或许会让 OD [^2] 等反汇编工具尴尬 :-)

OD 会根据这个字段的值,new 出一段空间,来存放反汇编代码。如果这个值过大,OD 的解析速度会非常慢。

  如,我们将这个值修改为 0x7FFFFFFF,那么用 OD 调试会出现如下提醒:



这是由于 OD 利用该字段,乘以一个数,来决定需要分配多少空间。由于这个字段的数值太大,需要 new 出来的数值便成了负数。申请空间失败后,OD 会申请一段默认大小的空间,但是这依然会产生影响,可能会造成反反汇编代码的缺失

如果我们将这个字段的数值降低,修改为 0x15FFFFFF,那么分析速度会变得非常得慢。



SizeOfInitializedData & SizeOfUninitializedData

表示初始化和未初始化的全局变量的字节数,系统不使用这两个字节,可以随意修改

AddressOfEntryPoint

函数的入口点, 也称为 OEP,相当重要,该值是一个地址的 偏移。可以利用该字段进行代码的注入[^3],早期的 CIH 病毒即使用了修改入口地址这一方法。

如把该段字节修改为 0x00000002,那么执行入口将从 Dos 头开始执行代码。再对文件头的二进制进行修改,可以在程序运行前将弹出一个Hello, World对话框。(对于 Win10 系统,似乎这样修改入口地址并不能使程序运行)



例子:仅 Win7 系统有效…( ̄∀ ̄)

另外,如果我们将该字段的值修改为 0,然后再在 Dos 文件头修正代码,jmp 到真正的函数入口点。如果此时 OD 的选项设置为 主模块入口点,那么OD将无法正常调试。(程序是否能够正常运行,与系统版本有关)

BaseOfCode & BaseOfData

代码区和数据区在主模块偏移的地址,该字段仅供系统参考,可以随意修改

这里的对齐值为文件中的对齐值,磁盘中一个扇区也为512个字节

[^2]:反汇编工具OllyDbg

[^3]:虽然可利用的空间小,但是可以不断 jmp 到空置区域执行代码,选择在空置区域内调用 Loadlibrary 加载DLL,但是这种方法容易被察觉。另一种方法是向服务器发包,将收到的包作为代码执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: