コード例 #1
0
ファイル: AVL.cs プロジェクト: Spanri/lab-institute
        public void Add(Virus data)
        {
            Node newItem = new Node(data);

            if (root == null)
            {
                root = newItem;
            }
            else
            {
                root = RecursiveInsert(root, newItem);
            }
        }
コード例 #2
0
ファイル: AVL.cs プロジェクト: Spanri/lab-institute
        public Virus?Find(string key)
        {
            Virus a = Find(key, root).data;

            if (String.Compare(a.hash8, key, true) == 0)
            {
                return(a);
            }
            else
            {
                return(null);
            }
        }
コード例 #3
0
ファイル: Form1.cs プロジェクト: Spanri/lab-institute
        /// <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;
                }
            }
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
ファイル: AVL.cs プロジェクト: Spanri/lab-institute
 public void Delete(Virus target)
 {//and here
     root = Delete(root, target.hash8);
 }
コード例 #6
0
ファイル: AVL.cs プロジェクト: Spanri/lab-institute
 public Node(Virus data)
 {
     this.data = data;
 }