1. 程式人生 > >病毒檢測與防毒技術大揭祕9

病毒檢測與防毒技術大揭祕9

3.5.黑白名單設計方案及編碼實現

黑白名單功能做為病毒庫的輔助,主要用於病毒防護、減少誤報、阻止非病毒類的邊緣灰色檔案。

在查殺病毒時,並不使用黑白名單,而在防毒的主動防禦中我們使用它。前面我們已經講過:當程序要啟動時,會先使用病毒病毒庫以特徵碼匹配的方法對其進行掃描,如果沒有檢測到病毒,會次使用雲安全進行識別。黑白名單的引入,可以更進一步提升防毒效果,增強整體軟體的防護功能。

我們進行如此設計:黑名白名資料檔案,在本地儲存時使用ini檔案格式。ini檔案內容由節和引數組成,可以方便進行少量資料的儲存、修改、新增、刪除。

黑白名單檔案格式使用如下例:
[Count]
MaxID=0
[File]
00001=C:\WINDOWS\system32\cmd.exe
[Signature]
00001=83BA7E22BF529858A345F483D7E94C16
[Description]
00001=安全的檔案
[DefenseFlag]
00001=1

Count節中,MaxID引數指明共有多少條資料。
File節中,序號對應的是檔案。
Signature節中,序號對應的的是檔案的特徵碼。
Description節中,序號對應的是對檔案的描述。
DefenseFlag節中,序號對應的是處理規則。數字1代表安全的檔案,執行放行操作;數字0代表是惡意檔案,執行阻止操作。

程式編碼時,相關操作程式碼置於上文中介紹過的SubClassMessage函式中,當獲取到DLL專來的啟動程式資訊後,在黑白名單檔案中進行匹配校驗,如果檢測到是安全的檔案,則直接放行;如果檢測到是惡意檔案,直接阻止。且看程式碼:

獲取黑白名單檔名,假設黑白名單檔名為ActiveDefense.ini
Dim sDefenseIniFile As String
sDefenseIniFile = App.Path & "\ActiveDefense.ini"
End If
   
讀取黑白名單檔案中的記錄資料量
Dim lMaxID As Long
lMaxID = ReadIni(sDefenseIniFile, "Count", "MaxID")
    
規則對應檔案
Dim sDefenseRuleFile As String
        
規則對應檔案特徵碼
Dim sDefenseRuleFileSignature As String
        
規則標誌,1為放行,0為禁止
Dim sDefenseRuleFileFlag As String

迴圈匹配黑白名單中的所有資料
Dim i As Long
For i = 1 To lMaxID

規則檔案
sDefenseRuleFile = ReadIni(sDefenseIniFile, "File", Format(i, "00000"))

檔案特徵碼
sDefenseRuleFileSignature = ReadIni(sDefenseIniFile, "Signature", Format(i, "00000"))

處理標誌
sDefenseRuleFileFlag = ReadIni(sDefenseIniFile, "DefenseFlag", Format(i, "00000"))
            
這裡假調sFile變數中儲存的是DLL中傳來的要啟動的檔案,獲取檔案的特徵碼,然後跟名單中所有記錄進行匹配
If (sDefenseRuleFileSignature = HashFile(sFile)) And (Len(sDefenseRuleFileSignature) = 32) And (Len(HashFile(sFile)) = 32) Then
                
If CLng(sDefenseRuleFileFlag) = 1 Then

標誌為1,執行放行操作。SubClassMessage函式在上面介紹過,是用來接收DLL訊息的函式。給它賦值915,也就是令SubClassMessage函式的返回值為915。在講前面講的DLL程式設計中,DLL中使用“ret=SendMessage(hExe, WM_COPYDATA, dwProcessId, (LPARAM)&cds)”向程式發來了啟動檔案資訊,同時在等待訊息的返回。如果返回915,DLL中就會放行這個試圖啟動的檔案。

SubClassMessage = 915                                            
Exit Function
ElseIf CLng(sDefenseRuleFileFlag) = 0 Then

標誌為0,執行阻止操作。與返回915的行為剛好相反。

SubClassMessage = 0
Exit Function
End If
End If
Next

程式碼中用到的HashFile函式即是上文中進行雲安全掃描前用於獲取檔案特徵碼的函式。在黑白名單中使用的特徵碼,與雲安全使用相同的特徵碼。

3.6.軟體設定實現方案

軟體設定聽起來貌似是一個雜項,似乎並不重要。但對使用者而言,合理而便捷的設定會使軟體操作更加舒適。而且在實際的軟體應用中,各種設定功能會貫穿於編碼的各個部分。上文中介紹各種功能時,為了使程式碼邏輯條理、便於理解,才沒有考慮各種外部設定代來的影響,在編碼中也沒有引入設定功能。如果我們要完成一個功能完善的軟體,是必須要時時刻刻考慮到設定選項功能的。

比如在軟體啟動時,要判斷是正常啟動,還是由右鍵掃描選單引發的啟動,如果是後者,則要執行不同的程式碼,進接進入病毒掃描環節;

比如在啟動軟體後,要判斷設定選項中是否開啟著片我保護,以決定是否要向其它程序中注入具有防殺功能的DLL檔案;

比如在掃描檔案時,要從設定選項中判斷是否只是對可執行檔案進行掃描;

比如在軟體執行防護功能時,要從設定專案中判斷是否開啟了雲安全防護功能,以決定是否要連線雲安全伺服器;

比如在關閉軟體時,要從設定項中判斷是要直接退出程式,還是僅僅要轉為後臺執行狀態。等等。

編碼時,要在龐大的程式碼中多次重複引入這些設定選項,因此不得不說合理的設定功能的設計對於此軟體工程而言是不可輕視。

各種設定選項以數值的形式儲存在配置ini檔案中,以方便重複的讀取和寫入。Ini檔案格式的欄位和項屬性非常便於準確定位和操作。因此,在本程式中被多次使用,前面介紹的黑白名單設計中已經使用,後面會講到的右鍵掃描功能的實現中也將要使用。

假設設定檔案Settings.ini內容如下:

[Normal] SafeGuard=1 AutoRun=1

對應的讀取此檔案的編碼為:

Dim sSettingsFile As String
sSettingsFile = App.Path & "\Settings.ini"
    
寫入自我保護設定資訊,CheckSafeGuard是介面中的複選框控制元件名
Call WriteIni(sSettingsFile, "Normal", "SafeGuard", CheckSafeGuard.value)

寫入軟體開機自啟動設定資訊,CheckAutoRun介面中的複選框控制元件名
Call WriteIni(sSettingsFile, "Normal", "AutoRun", CheckAutoRun.value)

WriteIni函式是經簡單封裝便用使用的ini操作函式,如下所示:
Public Function WriteIni(ByVal sFile As String, ByVal sSection As String, ByVal sKeyName As String, ByVal sKeyValue As String) As Boolean

Dim lRet As Long

呼叫API函式WritePrivateProfileString進行寫操作:

lRet = WritePrivateProfileString(sSection, sKeyName, sKeyValue, sFile)
If lRet = 0 Then
WriteIni = False
Exit Function
Else
WriteIni = True
Exit Function
End If
End Function

進行讀取操作時:

讀取自我保護設定資訊,CheckSafeGuard是介面中的複選框控制元件名:
CheckSafeGuard.value = ReadIni(sSettingsFile, "Normal", "SafeGuard")

讀取軟體開機自啟動設定資訊,CheckAutoRun介面中的複選框控制元件名:
CheckAutoRun.value = ReadIni(sSettingsFile, "Normal", "AutoRun")

使用ReadIni函式獲取配置資訊,直接賦值給介面中的控制元件。

ReadIni函式與WriteIni類似,如下:

Public Function ReadIni(ByVal sFile As String, ByVal sSection As String, ByVal sKeyName As String) As String

 Dim lRet As Long
 Dim sTemp As String * 255
 lRet = GetPrivateProfileString(sSection, sKeyName, "", sTemp, 255, sFile)
 If lRet = 0 Then
 ReadIni = ""
 Exit Function
 Else
 ReadIni = TrimNull(sTemp)
 End If
 End Function

注:作者:wing qq:6465660 本書理論及功能、程式碼源於防毒軟體:“Ty2y防毒軟體”,作者授意,文章可自由轉載,只需註明原出處即可,特此說明。