// Собственно, сама проверка public virtual bool check(ref Parser p) { bool ans = false; List<SegmentCode> dangerSegments = new List<SegmentCode>(); if (p.doneRenamed) { dangerSegments = p.AllSegments; } // Теперь, собственно, проверка на вхождение foreach (SegmentCode virusSegment in allVirus)// Берем каждый вирус { foreach (SegmentCode dangerSegment in dangerSegments)// Берем сегмент кода { // Передаем в сегмент кода нашего файла сигнатуру вируса if (dangerSegment.Find(virusSegment))// Если сегмент кода содержит в себе "вирус" - возвращаем true { ans = true; } } } return ans; }
public void ScanFile(FileInfo f) { i++; if (numberofFile != 0) { procent = (i * 100) / numberofFile; } //// Вывод процентов progressBar.Value = (int) procent; //// Вывод названия сканируемого файла richTextBoxResult.Text += '\n'+f.Name; try { // Парсер - получаем сегменты кода проверяемого файла Parser p = new Parser(f.FullName); if (p.doIt() != 1) { if (virusLibrary.check(ref p)) { virusFiles.Add(f); numberofVirusFile++; } numberofPEFile++; } } catch (FileNotFoundException exception) { numberofNotOpenedFile++; richTextBoxResult.Text += '\n' + exception.Message+ '\n'; } catch (IOException exception) { numberofNotOpenedFile++; richTextBoxResult.Text += '\n' + exception.Message + '\n'; } }
// Генерируем простую сигнуру типа // Console.WriteLine("Virus!"); // Thread.Sleep(1000); private void GeneratSignatureButton_Click(object sender, EventArgs e) { // Прочитаем "зараженные" файлы(сегменты кода) и найдем их общую часть Parser p1 = new Parser("Virus1.exe"); p1.doIt(); Parser p2 = new Parser("Virus2.exe"); p2.doIt(); Parser p3 = new Parser("MiniVirus.exe"); p3.doIt(); Parser p4 = new Parser("NotVirus.exe"); p4.doIt(); var segm1 = p1.AllSegments.First().CodeBytes; var segm2 = p2.AllSegments.First().CodeBytes; var segm3 = p3.AllSegments.First().CodeBytes; // Найдем пересечение общих участков кода - это и будет сигнатура! ищем данный участок: он отсутствует у p4 // Console.Writeline("VIRUS!"; // Thread.Sleep(1000); var a7 = LCS(Encoding.Default.GetString(segm1), Encoding.Default.GetString(segm2)); var a8 = LCS(Encoding.Default.GetString(segm3), Encoding.Default.GetString(segm2)); var a9 = LCS(a7, a8); // Методом тыка пришёл к получению данной сигнатуры: //Добавляем сигнатуру в базу данных Addsignature(Encoding.Default.GetBytes(a9)); this.progressBar1.Value = 0; }