欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深入了解 DOS 头和 DOS 存根的 PE 结构

最编程 2024-04-18 13:58:36
...

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(大约)