深入理解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

浙公网安备 33010602011771号