예제 #1
0
 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);
     }
 }
예제 #2
0
        public void Add(Node_Write.Virus data)
        {
            Node newItem = new Node(data);

            if (root == null)
            {
                root = newItem;
            }
            else
            {
                root = RecursiveInsert(root, newItem);
            }
        }
예제 #3
0
파일: Form1.cs 프로젝트: TheMyxa/SafeInfo
        /// <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;
                }
            }
        }
예제 #4
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);
        }
예제 #5
0
 public void Delete(Node_Write.Virus target)
 {//and here
     root = Delete(root, target.hash8);
 }
예제 #6
0
 public Node(Node_Write.Virus data)
 {
     this.data = data;
 }