Сканер двоичных файлов - PullRequest
       7

Сканер двоичных файлов

0 голосов
/ 11 октября 2018

Я делаю шестнадцатеричный сканер для файлов, и у меня есть база данных с шестнадцатеричными строками вирусов.

У меня есть база данных в виде XML и сканер в VB.NET.

Цель: выполнить простой антивирус (без сканера MD5).

Что ж, я хочу перечислить несколько файлов в списке, просмотреть его и просканировать шестигранный забор, сканируя каждый из них, совпадающиеперешел на listbox2.

Imports System.IO
Imports System.Text

Public Class HexEngine

    Dim ArrayHold() As Byte
    Dim Index As Integer = 0
    Dim Str As New StringBuilder
    Dim tStr As String = ""
    Dim tempStr As String = ""
    Dim IndexEnd As Integer = 0
    Dim InputString As String = ""
    Dim a As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        listv.Items.Clear()
        For abc = 0 To ListBox1.Items.Count - 1


            Scan(ListBox1.Items(a).ToString)

        Next abc
    End Sub

    Private Sub Scan(ByVal dir As String)


        Dim myStreamReader As StreamReader = Nothing
        myStreamReader = File.OpenText(dir)
        InputString = myStreamReader.ReadToEnd()
        ArrayHold = Encoding.Default.GetBytes(InputString)

        Do
            IndexEnd = Index + 9

            For x As Integer = Index To IndexEnd

                If x > UBound(ArrayHold) Then
                    tempStr = tempStr
                Else
                    tStr = UCase(Convert.ToString(ArrayHold(x), 16))

                    If tStr.Length < 2 Then tStr = "0" & tStr

                    Str.Append(tStr)
                    tempStr = tempStr & Chr(ArrayHold(x))

                End If
            Next

            Index = Index + 10
        Loop While IndexEnd < UBound(ArrayHold)
        For Each signature As XElement In xml.Root.Elements
            If InStr(1, Str.ToString, signature.<hex>.Value, vbTextCompare) Then
                listv.Items.Add(signature.<name>.Value)
                If listv.Items.Count > 0 Then
                    Label1.Text = "Virus"
                Else
                    Label1.Text = "No Virus"
                End If
            End If
        Next

    End Sub

    Dim xml = <?xml version="1.0"?>
              <signatures>
                  <signature>
                      <name>Eicar-Test-Signatur (AntiVir)</name>
                      <hex>58354f2150254041505b345c505a58353428505e2937434329377d2445494341522d5354414e4441</hex>
                  </signature>
                  <signature>
                      <name>Hybris.Gen (AntiVir)</name>
                      <hex>f649e7cc1e00d37e7f3bc85fff3486ac6de91433aa3a39ef1b114d37b534b8323f6ff67132638a3fe2f2afb4aaf9b7e3b4669bb3cab028298aab533c5d73546cdd396fd58c2c7734c50bca68eb709b889a086fb3db5f8ae533a4d5816e8c5f560983695efa14e291c204b1316e657773</hex>
                  </signature>
              </signatures>

    'Dim files As List(Of FileInfo) = FileDirSearcher.GetFiles("C:\Windows\System32", SearchOption.AllDirectories).ToList
    ' Dim dirs As List(Of DirectoryInfo) = FileDirSearcher.GetDirs("C:\Windows\System32", SearchOption.AllDirectories).ToList

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim startPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Startup)
        Dim filess As IEnumerable(Of FileInfo) = FileDirSearcher.GetFiles(dirPath:=startPath,
                                                                 searchOption:=SearchOption.TopDirectoryOnly,
                                                                 fileNamePatterns:={"*"},
                                                                 fileExtPatterns:={"*.vbs", "*.exe"},
                                                                 ignoreCase:=True,
                                                                  throwOnError:=True)

        For Each File In Get_All_Files(startPath, False)
            ListBox1.Items.Add(File)
        Next

    End Sub
End Class

#Region " Get All Files Function "

' [ Get All Files Function ]
'
' // By Elektro H@cker
'
' Examples:
'
' Dim Files As Array = Get_All_Files("C:\Test", True)
' For Each File In Get_All_Files("C:\Test", False) : MsgBox(File) : Next

Private Function Get_All_Files(ByVal Directory As String, Optional ByVal Recursive As Boolean = False) As Array
    If System.IO.Directory.Exists(Directory) Then
        If Not Recursive Then : Return System.IO.Directory.GetFiles(Directory, "*", IO.SearchOption.TopDirectoryOnly)
        Else : Return IO.Directory.GetFiles(Directory, "*", IO.SearchOption.AllDirectories)
        End If
    Else
        Return Nothing
    End If
End Function

#End Region

Ну, как вы видите, я уже все сделал, но все же он очень медленный и не сканирует файлы списка.

Я простоВам нужен шестнадцатеричный сканер, который сканирует все файлы, которые находятся в списке, и который работает быстро.

1 Ответ

0 голосов
/ 11 октября 2018

Ваш цикл не использует правильную переменную.abc - это переменная в цикле, а затем вы используете внутри цикла.Переименуйте вашу переменную во что-то значимое, и это не произойдет.

    For abc = 0 To ListBox1.Items.Count - 1
        Scan(ListBox1.Items(a).ToString)
    Next abc

Ваше сканирование выполняется медленно из-за преобразования строк.Строка медленная, особенно с конкатенацией.Используйте StringBuilder или даже лучше, сравнивайте байты вместо строки.Когда XML-файл загружен, преобразуйте его в байты, а затем просто сравните байты из файла.Гораздо быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...