Member 13242613 Ответов: 2

Что случилось с моим кодом filesystemwatcher1?


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

Однако это не так. По какой-то причине, когда я открываю файл, который я намеренно перечислил в базе данных MD5, когда я открываю его, моя программа начинает работать очень медленно, и диалог никогда не появляется. Что не так с моим кодом?


Private Sub FileSystemWatcher1_Changed(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs)
       Try
           Detect.Label3.Text = e.FullPath
           Quarantinevb.ListBox1.Items.Add(Detect.Label3.Text)
           Me.OpenFileDialog1.FileName = ""
           Dim scanbox As New TextBox
           scanbox.Text = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "viruslist.txt").ToString
           Dim md5 As New MD5CryptoServiceProvider
           Dim f As New FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read, &H2000)
           f = New FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read, &H2000)
           md5.ComputeHash(f)
           Dim hash As Byte() = md5.Hash
           Dim buff As New StringBuilder
           Dim hashByte As Byte
           For Each hashByte In hash
               buff.Append(String.Format("{0:X2}", hashByte))
           Next
           f.Close()
           If scanbox.Text.Contains(buff.ToString) Then
               Me.OpenFileDialog1.FileName = e.FullPath
               Detect.Show()
               Detect.BringToFront()


               WriteToLog("Virus detected")

           End If

       Catch exception1 As Exception
           ProjectData.SetProjectError(exception1)
           Dim ex As Exception = exception1
           ProjectData.ClearProjectError()
       End Try
   End Sub



Примечание: Если я удалю
Dim f As New FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read, &H2000)
это дает мне не объявленную ошибку.

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

Пробуем разные способы чтения файлов.


Удаление всех viruslist.txt на моем компьютере и заново создаю файл.


Перечитываю свой код и ищу, все ли правильно.

Richard Deeming

Это что, домашнее задание? Вы, кажется, задаете точно такой же вопрос, что и я. @Helpmecodeplz[^] спрашивал в августе прошлого года.

Вопросы и ответы от Helpmecodeplz - CodeProject[^]

У вас даже есть точно такие же ошибки в вашем коде, поэтому, если это не то, что вам дал ваш учитель, вы должны были скопировать код от другого ученика.

2 Ответов

Рейтинг:
1

OriginalGriff

О боже...

Цитата:
Когда открывается новая программа, Моя программа сканирует эту недавно открытую программу, и если она MD5 существует в локально размещенной базе данных, то должен появиться диалог Detect.vb с надписью "вирус обнаружен".
Это не сработает, даже немного.

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

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

И это еще до того, как вы начнете получать полиморфные вирусы, которые изменяют свой собственный код, чтобы избежать обнаружения!

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


Member 13242613

Так что бы вы посоветовали мне сделать?

Dave Kreskowiak

Пару лет исследований, чтобы узнать, как работают вирусы и вредоносные программы.

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

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

Member 13242613

Например, как современные антивирусы находят вирусы?

OriginalGriff

Современные вирусы - это ужасно сложные вещи, кроме тех, которые написаны сценаристами - детишками-они в значительной степени должны быть, чтобы пройти мимо эвристических детекторов, которые современные вирусные сканеры используют как часть (и только часть) своего арсенала.

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

Как работают современные детекторы? Вам придется спросить McAfee, Kaspersky, Microsoft - и они не скажут вам, потому что это выдаст информацию, в которую они вложили кучу времени и денег, а также облегчит жизнь вирусописателям! Если вы знаете, как работает детектор, гораздо легче обойти его, обнаружив то, на что он не смотрит.

Я бы сказал: "отбросьте всю эту идею", - но я даже не знаю, почему вы пытаетесь это написать. Если это для вас, то выбросьте это в мусорное ведро, найдите другой проект и запишите его на опыт - мы все должны делать это время от времени, и это трудно сделать. Если это не так, то зачем вы это делаете?

Member 13242613

Я думал, что это сработает, но это явно не так. Единственная причина, по которой я использую такой язык, заключается в том, что я знаком с ним лучше, чем с любым другим языком.


Могу я спросить, какой язык программирования вы рекомендуете для AV?

OriginalGriff

Дело не в языке, а в самой идее. Вы не можете использовать MD5 всего файла, чтобы сказать: "это вирус", посмотрев его в БД!

Рейтинг:
1

Jochen Arndt

Почему вы открываете файл дважды?

В результате у вас будет два дескриптора к одному и тому же файлу но только один будет закрыт потому что f удерживает внутри дескриптор второго вызова, в то время как первый дескриптор недоступен anmyore.

Пусть линия, где вы объявляете (Dim) и назначить f установите его на место и удалите следующую строку, в которой вы снова откроете файл.