//Проверка первых 8 байт исполняемоей секции private bool scan_Byte_body(string path, string f, addSign aS, Balanced_binary_tree_search tree) { string str; Node_Write.Virus?virus; using (FileStream file = new FileStream(f, FileMode.Open)) { // узнаем, где у него исп секция int[] data = aS.exeSect(file); // смещаем его на начало исп секции file.Seek(data[1], SeekOrigin.Begin); var buffer = new byte[8]; file.Read(buffer, 0, buffer.Length); str = string.Join(" ", buffer.Select(b => b.ToString("X2"))); } virus = tree.Find_body(str); if (virus != null) { return(true); } return(false); }
//Сканер для Наблюдателя 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); }