CodingIsDreamy Ответов: 1

Как отредактировать мой код, чтобы он делал то, что я хочу (объяснено ниже)


So ive got some code ill put at the end. basically my program scans files and and if any of the md5 hashes match a list of md5 hashes from a text file. It works but basically what i want to do is inside the text file with md5 hashes, under earch md5 hash i want to put for example (win 32 genic) and then if my tool finds a virus i want in a label it to show the line below (so if in the database is the hash 1234 and underneath the 1234 hash is win32genic and nothing else. so if a file with the same hash is found it will show in a label win32genic. Below is the existing code without the label win 32 genic thing does anyone know how i can add the feature i was talking about?



Private Sub TimerStart()

       Dim LimitReached As Boolean = Me.InvokeIfRequired(Function() ProgressBar1.Value = ProgressBar1.Maximum)

       'Keep looping until limit is reached.
       While Not LimitReached

           'InvokeIfRequired() can take multiple lines.
           Me.InvokeIfRequired(
           Sub()
               ProgressBar1.Maximum = ListBox1.Items.Count.ToString() 'Calling ToString() is much better than Conversions.ToString().
               total.Text = ListBox1.Items.Count.ToString()
           End Sub) 'End of InvokeIfRequired().

           'Check if the limit is reached.
           LimitReached = Me.InvokeIfRequired(Function() ProgressBar1.Value = ProgressBar1.Maximum)

           If Not LimitReached Then

               Me.InvokeIfRequired(
               Sub()
                   Try
                       ListBox1.SelectedIndex = ListBox1.SelectedIndex + 1
                       Label1.Text = ListBox1.SelectedItem.ToString
                   Catch ex As Exception
                   End Try
               End Sub)

               Try

                   Dim scanbox As String 'This should be a String, NOT a TextBox.
                   Dim read As String = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "\Database\VirusList.dat")

                   Me.InvokeIfRequired(
               Sub()
                   ProgressBar1.Increment(1)
                   detected.Text = Quarantine.ListBox2.Items.Count.ToString() 'Again, use .ToString(), not Conversions.ToString().
                   Label5.Text = String.Format("{0:F2}%", ((ProgressBar1.Value / ProgressBar1.Maximum) * 100))
                   files.Text = ProgressBar1.Value.ToString()
               End Sub)

                   scanbox = read.ToString
                   Dim md5 As New MD5CryptoServiceProvider 'Shortened to "As New" instead of "As ... = New ..."

                   'IMPORTANT: Wrap all streams in "Using .../End Using". This will ensure that the stream is closed and the file handle is released.
                   Using f As New FileStream(ListBox1.SelectedItem, FileMode.Open, FileAccess.Read, FileShare.Read, 8192) 'Again, shortened to "As New".

                       'REMOVED: You were setting "f = New FileStream..." two times. Not a good thing to do.
                       md5.ComputeHash(f)
                       Dim hash As Byte() = md5.Hash
                       Dim buff As New StringBuilder '"As New".
                       'This line is irrelevant: "Dim hashByte As Byte".
                       For Each hashByte As Byte In hash
                           buff.Append(String.Format("{0:X2}", hashByte))
                       Next

                       If scanbox.Contains(buff.ToString) Then

                           Me.InvokeIfRequired(Sub() f.Dispose())
                           Me.InvokeIfRequired(Sub() EncryptFile())
                           Me.InvokeIfRequired(Sub() Quarantine.ListBox2.Items.Add(ListBox1.SelectedItem()))
                           Me.InvokeIfRequired(Sub() WriteToLog("File Quarantined:" + ListBox1.SelectedItem))
                       End If
                   End Using 'Close the FileStream.

               Catch ex As Exception
               End Try
           Else
               'REMOVED: "Timer1.Stop()" is no longer needed.

               Me.InvokeIfRequired(
               Sub()
                   If CheckBox1.Checked = True Then
                       System.Diagnostics.Process.Start("shutdown", "-s -t 00")
                   Else
                       ProgressBar1.Value = 0
                       If ListBox1.Items.Count = 0 Then
                           If Form1.CheckBox1.Checked = True Then
                               full.CancelAsync()
                               quick.CancelAsync()
                               Critical.CancelAsync()
                               cust.CancelAsync()
                           End If
                       Else
                           Form1.CheckBox1.Checked = False
                           Form1.CheckBox2.Checked = False
                           Form1.CheckBox3.Checked = False
                           Form1.CheckBox4.Checked = False
                           Quarantine.Label3.ForeColor = Color.DarkRed
                           Quarantine.Label2.ForeColor = Color.DarkRed
                           full.CancelAsync()
                           quick.CancelAsync()
                           Critical.CancelAsync()
                           cust.CancelAsync()

                       End If
                   End If
               End Sub) 'End of InvokeIfRequired().
           End If
           'Do some more background stuff...
       End While


   End Sub


Что я уже пробовал:

я ничего не пробовал, так как действительно не знаю, с чего начать. Я гуглю, но, кажется, могу найти все, что мне нужно. (кстати, мне это нужно vb.net)

Richard MacCutchan

Вы продолжаете перепечатывать этот вопрос, но на самом деле не добиваетесь прогресса из-за вашего непонимания того, что на самом деле делает вирус. Использование любой формы сравнения хэшей не даст вам ответа.

1 Ответов

Рейтинг:
1

OriginalGriff

Вы понимаете, что если вирус изменяет файл, то хэш MD5 для результирующего файла не будет соответствовать "сигнатуре" для любого конкретного вируса?
Когда вы хэшируете файл, вы генерируете значение, которое зависит от общего содержимого файла. Когда вирус изменяет файл, новое значение MD5 зависит от общего содержимого измененного файла, а не от "только измененного бита".

Например, если хэш-алгоритм (для простоты) "складывает байты и выбрасывает любое переносное значение одного байта", то если два файла начинаются так (шестнадцатеричные значения для простоты)

File 1: 01 02 03 04    Hash == 0A hex.
    File 2: 21 22 23 24    Hash == 8A hex.
Предположим, что вирус всегда изменяет второй байт на hex 14:
File 1: 01 14 03 04    Hash == 1C hex.
File 2: 21 14 23 24    Hash == 7C hex.
Значения хэшей изменились, и вы можете обнаружить это, но вы не можете сказать "это был вирус #2Is14", просто посмотрев на новые хэши.
На самом деле это может быть "вирус#3Is15":
File 1: 01 02 15 04    Hash == 1C hex.
File 2: 21 22 15 24    Hash == 7C hex.
Который генерирует те же самые хэш-значения!

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


CodingIsDreamy

Эй, оригинальный Гифф, я понимаю, что ты имеешь в виду. Как насчет SHA1, как я могу изменить код, который у меня есть, чтобы работать со списком хэшей sha1. Или как я могу использовать код abouve для использования списка вирусных сигнатур (sha1) что я могу сделать? как сделать мой код полезным lol :-)

OriginalGriff

Ты не можешь этого сделать.
Любой хэш - как тривиальный пример, который я привел - вплоть до SHA3-1024 делает то же самое: хэш-значение относится ко всему содержимому файла и ни при каких обстоятельствах не может сказать вам, какая часть или части, где произошли изменения, или какие изменения были сделаны. Вы не можете использовать хэш для прямого определения того, какие изменения были внесены (потому что это потребовало бы "реверсирования" значения хэша, а вы не можете этого сделать), поэтому вы не можете использовать текущий хэш в качестве любого указания на то, какой вирус внес изменения.

Извините, что дождь на вашем параде, но это абсолютная правда. То, что вы пытаетесь сделать, не может быть сделано; это не сработает.

CodingIsDreamy

ладно, я понимаю. Знаете ли вы, как я могу превратить свой код, чтобы он мог сканировать список хэшей sha1 вместо md5 (без имен)

OriginalGriff

Вы сами написали: это совершенно очевидно!
Вы хотите сказать, что не можете решить, как прекратить использование
https://msdn.microsoft.com/en-us/library/system.security.cryptography.md5cryptoserviceprovider(v=vs. 110).aspx
и начните использовать
https://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1cryptoserviceprovider(v=vs. 110).aspx
вместо этого? Потому что если это так, то вы настолько далеки от своей лиги, что, вероятно, играете в совершенно другую игру. :смеяться:

CodingIsDreamy

Послушайте я пробовал это но это не работает так я не получаю никакой ошибки просто не работает
/ обнаружение файла

OriginalGriff

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