public void Add(Virus data) { Node newItem = new Node(data); if (root == null) { root = newItem; } else { root = RecursiveInsert(root, newItem); } }
public Virus?Find(string key) { Virus a = Find(key, root).data; if (String.Compare(a.hash8, key, true) == 0) { return(a); } else { return(null); } }
/// <summary> /// Удалить сигнатуру из файла /// </summary> private void deleteFile_Click_1(object sender, EventArgs e) { List <Virus> buffer = new List <Virus>(); // ищем, что было выделено в listbox1 for (int i = 0; i < listBox1.Items.Count; i++) { if (listBox1.Items[i] == listBox1.SelectedItem) { StreamReader sr = new StreamReader("sign.txt"); string line = sr.ReadLine(); sr.Close(); FileStream InfectedFilesDB = new FileStream(line, FileMode.Open, FileAccess.Read); BinaryFormatter binForm = new BinaryFormatter(); for (int k = 0; k < listBox1.Items.Count; k++) { Virus inf = (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; } } }
/// <summary> /// Сканировать директорию /// </summary> /// <param name="path">Путь к директории</param> /// <param name="sign">База сигнатур</param> public List <string> scan(string path) { // создаем АВЛ дерево List <Virus> sign = getVirusDB(); AVL tree = new AVL(); // создаем АВЛ дерево из сигнатур for (int i = 0; i < sign.Count; i++) { tree.Add(sign[i]); } addSign aS = new addSign(); List <string> str = new List <string>(); DirectoryInfo dir = new DirectoryInfo(path); foreach (string f in Directory.GetFiles(path, "*.exe", SearchOption.AllDirectories).Union(Directory.GetFiles(path, "*.dll", SearchOption.AllDirectories))) { Virus? virus; string signHash, signHash2; // Открываем файл FileStream file = new FileStream(f, FileMode.Open); // узнаем, где у него исп секция 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, ((Virus)virus).length); signHash2 = aS.hash(signHash2); // если полные хеши равны, то это точно зараженный файл if (signHash2 == ((Virus)virus).hash) { // добавляем в str путь к файлу str.Add(f); // ищем сигнатуру - источник заражения и // прибавляем ей число обнаружений for (int i = 0; i < sign.Count; i++) { if (sign[i].hash == ((Virus)virus).hash) { //так делается, ибо это ошибка компилятора Virus vir = sign[i]; vir.detect++; sign[i] = vir; } } break; } // отменяем смещения file.Seek(8 - ((Virus)virus).length, SeekOrigin.Current); } // идем назад на 8 байт и смещаем на 1 байт file.Seek(-8 + 1, SeekOrigin.Current); } file.Close(); } // Путь к файлу базы сигнатур StreamReader sr = new StreamReader("sign.txt"); string line = sr.ReadLine(); sr.Close(); // сериализуем структуру (превращаем в бинарную форму) 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(str); }
public void Delete(Virus target) {//and here root = Delete(root, target.hash8); }
public Node(Virus data) { this.data = data; }