程式段前缀
program segment prefix ,简称PSP(程式段的前缀)
当输入一个外部命令或通过EXEC子功能(系统功能调用INT 21h的子功能号为4BH)载入一子程式时,COMMAND确定当时记忆体可用空间的最低端作为程式段起点。在程式所占记忆体空间的前256个位元组中,系统会为程式创建程式的前缀(PSP)的数据区,DOS要利用PSP来和被载入程式进行通信;PSP内有程式返回、程式档案名称等信息,可以通过研究psp定位档案名称信息,进而获取档案名称。
从这段记忆体区的256位元组处开始(在PSP的后面),将程式装入,程式的地址被设为SA+10H:0 (其中SA为系统为程式分配记忆体的起始位置的段地址即当前暂存器DS的内容);
基本介绍
- 中文名:程式段前缀
- 外文名:program segment prefix
- 简称:PSP
- 性质:编程
介绍
program segment prefix ,简称PSP(程式段的前缀)
当输入一个外部命令或通过EXEC子功能(系统功能调用INT 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中保存的值恢复各中断的值。