深入理解PE结构之可选头

PE32如下:

 word Magic 0x010B   这个字段有3个值,0x010B 是32位程序,0x020B是64位程序,0x0107是ROM嵌入式设备选项头

byte  MajorLinkerVersion 0x05和byte ManorLinkerVersion 0x0C是链接器的版本,可参考,不信任一些鉴定软件、PEID识别exe就是使用这个字段识别程序

 修改为0xCC之后,PEID识别这个链接器信息就会出错。

dword  SizeOfCode 0x00000200   代码总大小,文件对齐后的总大小。可参考不可靠;但是这个字段在某些情况可以作为反调试用。

dword   SizeOfIntiaizeData  0x00000200  已初始化数据总大小,可参考不可靠:对应汇编中的.data  .const;对应C语言中已初始化全局变量,例如全局变量int a=3;对于已初始化数据,文件中不仅要预留位置,还要记录其初始值。

dword   SizeOfUninitalizedData 0x00000000 未初始化数据总大小    ,可参考不可靠  对应汇编中的.data?;对应C语言中未初始化全局变量,例如全局变量int b;对于未初始化数据,文件中只预留其位置

对于命令行程序,我们可以每次读取固定的字节数进行展示,这样不存在这个问题。对于窗口界面的调试器,要对一个问题要对代码进行展示,这个时候就有个问题,展示多少代码呢?

OD就是参考这个字段SizeOfCode,那么如果把这个字段修改为0xCC CC CC CC,扔到od中就会出现类似反调试的功能。

 另一种是卡顿调试器:是把 SizeOfCode不改为0xCCCCCCCC这种无法分配的内存,这种容易被查出来原因,改为0x10 00 00 00 ,这种分配大内存,这样调试器就会卡顿,很慢。

 AddressOfEntryPoint  0x00001000       EP当前入口点,

BaseOfCode   0x00001000                   代码基地址 RVA,可参考,不可靠

BaseOfData    0x00002000                   数据基地址  RVA,可参考,不可靠 ,修改之后,OD根据这个字段显示内存窗口的数据,修改之后,内存窗口显示不出来数据。

ImageBase     0x00400000                   建议装载地址

SectionAlignment        0x00001000        内存对齐,一般0x1000

FileAlignment              0x00000200 文件对齐,0x200或0x1000,VC对齐是0x1000,因此生成的exe比汇编程序大

word  MajorOperationSystemVersion      0x0004

word MinorOperationSystemVersion       0x0000   操作系统的高低版本号

word MajorImageVersion                      0x0000

word MinorImageVersion                      0x0000 应用程序的高低版本号        

word MajorSubSystemVersion   0x0004   子系统版本最高版号不能改,其他都能改,这个os要检查,根据os决定的。

word MinorSubSystemVersion           0x0000  子系统的高低版本号

dword Win32VersionVaue                  0x00000000  win32版本                有时候OD会依赖以上版本号的信息。

dword SizeOfImage         0x00003000  映射到内存的大小,内存对齐后的大小

dword SizeOfHeaders        0x00000200 所有头部,文件对齐后的大小

dword CheckSum          0x00000000 检验和,3环不检查,0环驱动程序会检测这个东西,检测不对会拒绝加载。

word SubSystem                                0x0002  程序link链接时候指定的值,一般为01是驱动程序,02是GUI程序,03是CUI控制台程序,实验改成03,这个程序就变成控制台程序了

word DllCharacteristics                      0x0000  只有一个值0x2000是基于WDM的驱动,0x0001、0x0002、0x0004、0x0008都是保留未使用状态,ASLR动态基址基于这个值

dword SizeOfStackReverse    0x100000          栈保留,应用程序为栈准备的最大空间;应用程序为栈准备的内存空间为0x100000,现在已使用0x1000。可以修改,但必须靠谱

dword SizeOfStackCommit  0x1000            栈提交,应用程序已经为栈分配的空间大小。应用程序为栈准备的内存空间为0x100000,现在已使用0x1000,可以修改,但必须靠谱。保留就是银行有多少钱,提交就是出门带多少钱

dword SIzeOfHeapReverse 0x100000   堆保留,应用程序为堆准备的最大空间;应用程序为堆准备的内存空间为0x100000,现在已使用0x1000可以修改,但必须靠谱

dword SizeOfHeapCommit  0x1000   堆提交,应用程序已经为堆分配的空间大小;应用程序为堆准备的内存空间为0x100000,现在已使用0x1000可以修改;可以修改,但必须靠谱

dword LoaderFlags                 0x00000000                  这个字段没有用,可以在磁盘文件状态存一个值,运行状态读取这个值。

dword NumberOfRvaAndSizes     0x00000010     数据目录项的个数

IMAGE_DATA_DICECTORY [16]      数据目录项

 主要学:

    导入表

    导出表

    重定位表

    绑定导入表

    IAT表  

    资源表  

    TLS

posted @ 2023-08-16 09:27  一日学一日功  阅读(136)  评论(0)    收藏  举报