程序段前缀
program segment prefix ,简称PSP(程序段的前缀)
当输入一个外部命令或通过EXEC子功能(系统功能调用INF 21h的子功能号为4BH)加载一子程序时,COMMAND确定当时内存可用空间的最低端作为程序段起点。在程序所占内存空间的前256个字节中,系统会为程序创建程序的前缀(PSP)的数据区,DOS要利用PSP来和被加载程序进行通信;PSP内有程序返回、程序文件名等信息,可以通过研究psp定位文件名信息,进而获取文件名。
从这段内存区的256字节处开始(在PSP的后面),将程序装入,程序的地址被设为SA+10H:0 (其中SA为系统为程序分配内存的起始位置的段地址即当前寄存器DS的内容);
(注意:PSP区和程序区虽然物理地址连续,却有不同的段地址。)
该PSP中包含以下三部分信息:
(1)供被加载程序使用的DOS入口,如PSP+0、+2、+5和+2CH字段;
(2)供DOS本身使用的DOS入口,如PSP+0AH、+0EH、+12H和+2CH字段;
(3)供被加载程序使用传递参数,如PSP+5CH,+6CH和80H字段。
PSP结构与CP/M中的“控制区域”是十分相近的。这是因为,DOS本身便是从CP/M演变而来的。!
程序段前缀PSP格式:
偏移
字节数
说 明
0000
02
中断20H
0002
02
以节计算的内存大小(利用这个可看出是否感染引导型病毒)
0004
01
保留
0005
05
至DOS的长调用
000A
02
INT 22H 入口 IP
000C
02
INT 22H 入口 CS
000E
02
INT 23H 入口 IP
0010
02
INT 23H 入口 CS
0012
02
INT 24H 入口 IP
0014
02
INT 24H 入口 CS
0016
02
父进程的PSP段值(可测知是否被跟踪)
0018
14
存放20个SOFT号
002C
02
环境块段地址(从中可获知执行的程序名)
002E
04
存放用户栈地址指针
0032
1E
保留
0050
03
DOS调用 ( INT 21H / RETF )
0053
02
保留
0055
07
扩展的FCB头
005C
10
格式化的FCB1
006C
10
格式化的FCB2
007C
04
保留
0080
80
命令行参数长度(不包含总为最后的0D)及参数也是程序运行期间缺省的DTA
另外:保存INT 22/INT 23/INT 24H的值使得用户在程序中可修改这些中断的值,病毒就曾利用这种技术防止不能传染时引起出错信息。在程序退出时根据PSP中保存的值恢复各中断的值。