深入了解 DOS 头和 DOS 存根的 PE 结构
1、先自己手动写一个最简单的汇编程序,弹框MessageBox和ExitProcess,生成1个大约2kb左右的文件
2、手动把PE文件中所有的属性,手动修改一遍,观察每个属性引起的反应。
.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib c:\masm32\lib\kernel32.lib includelib c:\masm32\lib\user32.lib .data SzTitle db "test",0 .code start: invoke MessageBox,0,addr SzTitle,0,0 invoke ExitProcess,0 end start
先来看DOS头、DOS stub、NT头、可选头、节表
MZ是标志字段,不可修改,除了MZ和0x3C的文件头偏移0x00 00 00B0不能修改,其他字段都可以修改为0xCC,其他的字段是设置dos的环境下程序运行的环境,
包括寄存器信息,栈信息、堆环境信息等等,现在把这些dos时代的程序环境字段全改掉,程序照常运行,这些字段已经过时。
DOS桩是一段在dos系统下运行的程序。把生成的程序拖到IDA中,不要选择PE,选择binary,就能看出这段代码的意思。
但是拖进IDA中要选择为binary file文件和选择8086的处理器,因为不选择8086,后边的代码(BA 0E 00)会识别出问题。
如果IDA没有识别成下边的代码,因为没有识别为x86汇编(在od或者x96工具中都会识别出问题)
mov ah,9
int 21
主要是执行9号中断,输出一段字符串。
DOS stub现在也没用,都可以改掉,不影响程序运行。后边进行添加节,一种方法就是可以把整个头往上移动,把这个DOS stub位置空间占用,为新的节表腾出空间。
NT头
PE 00 00 识别标志,这个标志不能改
Machine 机器环境 0x014C 表示intel 386的机器环境,0x0200 intel 64,0x8664 ARM64(K8),0x01C0(ARM Little-Eddian,一般就这几种环境。
NumberOfSections 节表个数
TimeDateStamp 时间戳,程序生成时间,可参考,不准确,程序鉴定的时候可以参考这个字段
SizeofOptionalHeader 可选头大小,共3类,32位、64位、嵌入式。
Characteristics 文件属性,exe、dll、驱动等,0x0100是32位程序,0x1000驱动程序,0x2000dll文件,0x0001不包括重定位,0x0002可执行文件,0x0004没有行信息,0x0008没有符号信息。
因此0x010F是0x0100 + 0x0001 + 0x0002 + 0x0004 + 0x0008 不包括重定位,没有行信息,没有符号信息的是32位的可执行程序。
0x0020可以让用户内存大于2GB,有些游戏改这个值把用户空间改为3GB(大约)
上一篇: 中国 DOS 联盟-请选择:
下一篇: tty ttyS0 tty0 了解