예제 #1
0
        //Проверка первых 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);
        }
예제 #2
0
        //Сканер для Наблюдателя
        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);
        }