public Node_Write.Virus?Find(string key) { Node_Write.Virus a = Find(key, root).data; if (String.Compare(a.hash8, key, true) == 0) { return(a); } else { return(null); } }
public void Add(Node_Write.Virus data) { Node newItem = new Node(data); if (root == null) { root = newItem; } else { root = RecursiveInsert(root, newItem); } }
/// <summary> /// +Удалить сигнатуру из файла /// </summary> private void deleteInfFile_Click(object sender, EventArgs e) { List <Node_Write.Virus> buffer = new List <Node_Write.Virus>(); // ищем, что было выделено в listbox1 for (int i = 0; i < listBox1.Items.Count; i++) { if (listBox1.Items[i] == listBox1.SelectedItem) { string line = key_create.GetValue("sign").ToString(); FileStream InfectedFilesDB = new FileStream(line, FileMode.Open, FileAccess.Read); BinaryFormatter binForm = new BinaryFormatter(); for (int k = 0; k < listBox1.Items.Count; k++) { Node_Write.Virus inf = (Node_Write.Virus)binForm.Deserialize(InfectedFilesDB); if (k != i) { buffer.Add(inf); } } InfectedFilesDB.Close(); // сериализуем buffer InfectedFilesDB = new FileStream(line, FileMode.Create); for (int j = 0; j < buffer.Count; j++) { binForm.Serialize(InfectedFilesDB, buffer[j]); } // надо удалить запись о сигнатурев listBox listBox1.Items.RemoveAt(i); InfectedFilesDB.Close(); break; } } }
//Сканер для Наблюдателя public bool scan_String(string path, string f) { string full_path_file = Path.GetDirectoryName(f) + @"\" + Path.GetFileNameWithoutExtension(f) + ".zip"; if (f == full_path_file) { return(false); } if (!scan_Byte_header(f))// Tru = exe || all False - другой мусор { return(false); } List <Node_Write.Virus> sign = getVirusDB(); Balanced_binary_tree_search tree = new Balanced_binary_tree_search(); // создаем АВЛ дерево из сигнатур for (int i = 0; i < sign.Count; i++) { tree.Add(sign[i]); } addSign aS = new addSign(); if (!scan_Byte_body(path, f, aS, tree))// Провекрка 8 байт исполняемой секции. True - скорее всего вирус False - исполняемая секция не равна { return(false); } FileStream file; // Открываем файл try { file = new FileStream(f, FileMode.Open); } catch (Exception) { return(false); } bool check = false; // создаем АВЛ дерево List <string> str = new List <string>(); DirectoryInfo dir = new DirectoryInfo(path); Node_Write.Virus?virus; string signHash, signHash2; // узнаем, где у него исп секция int[] data = aS.exeSect(file); // смещаем его на начало исп секции file.Seek(data[1], SeekOrigin.Begin); // прогоняем для всей исп области, смещаясь // каждый раз на 1 байт и беря 8 байт как длину // возможного вируса while (file.Position + 8 < data[1] + data[0]) { // получаем блок кода из сканируемого файла // на месте возможного вируса длиной 8 байт signHash = aS.read(file, 8); // хешируем его signHash = aS.hash(signHash); // сравниваем с помощью АВЛ по хешу // если возвращаемое значение не null, то // это, возможно, зараженный файл и нужно // проверить полный хеш virus = tree.Find(signHash); if (virus != null) { // возвращаемся назад на 8 байт file.Seek(-8, SeekOrigin.Current); // читаем длину сигнатуры signHash2 = aS.read(file, ((Node_Write.Virus)virus).length); signHash2 = aS.hash(signHash2); // если полные хеши равны, то это точно зараженный файл if (signHash2 == ((Node_Write.Virus)virus).hash) { check = true; // добавляем в str путь к файлу str.Add(f); // ищем сигнатуру - источник заражения и // прибавляем ей число обнаружений for (int i = 0; i < sign.Count; i++) { if (sign[i].hash == ((Node_Write.Virus)virus).hash) { //так делается, ибо это ошибка компилятора Node_Write.Virus vir = sign[i]; vir.detect++; sign[i] = vir; } } break; } // отменяем смещения file.Seek(8 - ((Node_Write.Virus)virus).length, SeekOrigin.Current); } // идем назад на 8 байт и смещаем на 1 байт file.Seek(-8 + 1, SeekOrigin.Current); } file.Close(); // Путь к файлу базы сигнатур string line = key_create.GetValue("sign").ToString(); // сериализуем структуру (превращаем в бинарную форму) FileStream VDB = new FileStream(line, FileMode.Create, FileAccess.Write); BinaryFormatter binForm = new BinaryFormatter(); // добавляем в VDB (файл базы сигнатур) объект sign // оно добавится туда в 2ой форме и сложно будет что-то понять // чтобы что-то понять, надо будет десериализовывать for (int i = 0; i < sign.Count; i++) { binForm.Serialize(VDB, sign[i]); } VDB.Close(); return(check); }
public void Delete(Node_Write.Virus target) {//and here root = Delete(root, target.hash8); }
public Node(Node_Write.Virus data) { this.data = data; }