3

私はいくつかの16進スキャナソースを試していました。

次のコードは動作しますが、非常に遅いです:

Public Class frmMain

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoadFile.Click

        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 = ""

        OpenDia.Filter = "All Files|*.*"

        If OpenDia.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim myStreamReader As StreamReader = Nothing
            myStreamReader = File.OpenText(OpenDia.FileName)
            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)

            If InStr(1, Str.ToString, "58354f2150254041505b345c505a58353428505e2937434329377d2445494341522d5354414e4441", vbTextCompare) Then
                Label1.Text = "Eicar-test-signature virus Detected!"
            End If
        End If
    End Sub
End Class

高速化するために、XML ファイルで次の形式を使用できます。

?xml version="1.0"?>
<signatures>
  <signature>
    <name>Eicar-Test-Signature</name>
      <hex>58354f2150254041505b345c505a58353428505e2937434329377d2445494341522d5354414e4441</hex>
  </signature>
  <signature>
    <name>Mid/Kakworm-Z</name>
      <hex>66732e4372656174655465787446696c652877642b276b616b2e72656727293b74322e77726974652827524547454449</hex>
  </signature>
</signatures>

しかし、VB.NET で XML ファイルを読み込んで実装する方法がわかりません。それは難しいです、そして誰かが助けることができますか?

4

2 に答える 2

2

Neolisk は LINQ to XML の部分をうまくカバーしました。Step を使用して、ループを 1 つの For ループに単純化する方法を次に示します。また、ブロック内で を使用してStreamReaderいるUsingため、StreamReaderが適切に閉じられて破棄されます。

If OpenDia.ShowDialog = Windows.Forms.DialogResult.OK Then

    Using myStreamReader As StreamReader = File.OpenText(openDia.FileName)

        ArrayHold = Encoding.Default.GetBytes(myStreamReader.ReadToEnd())
    End Using

    Dim arrayLength As Integer = ArrayHold.Length - 1

    For i As Integer = 0 To arrayLength Step 10
        Str.Append(UCase(Convert.ToString(ArrayHold(i), 16).PadLeft(2, "0"c)))
    Next

    If dict.ContainsKey(Str.ToString()) Then
        Label1.Text = dict(str.ToString())
    End If 
End If

これはStringBuilder余分な文字列なしで使用され、パフォーマンスもわずかに向上するはずですが、最大のヒットは、一度に1文字ずつ構築する文字列をループして各文字をチェックすることだったと思います.

編集

辞書をチェックするためのコードを追加しました (XML を辞書に解析するための Neolisk の回答に基づく)。

于 2013-09-21T17:13:04.553 に答える