2 / 2 / 0
Регистрация: 28.09.2012
Сообщений: 127

Поиск вируса Бойером-Муром

13.10.2013, 12:18. Показов 1529. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Проблема такая: необходимо найти вирус в директории по заданной сигнатуре (т.е. это может быть папка или файл или еще что-то). Но поиск необходимо совершить при помощи алгоритма Бойера — Мура, подскажите как это реализовать? Есть алгоритм Бойера-Мура поиска подстроки в строке, но это не то, что надо
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public static char[] SymbolOfX; //Таблица символов искомой строки  
public static int[] ValueShift; //Таблица смещений для символов
public static void ShiftBM(string x) //Процедура - формирование смещений
        {
            int j; //Счетчик
            int k = 0; //Счетчик
            bool fl; //Флаг
            SymbolOfX = new char[x.Length]; //Инициализация
            ValueShift = new int[x.Length]; //Инициализация
            //Цикл по искомой строке без последнего символа
            for (int i = x.Length-2; i >= 0; i--)
            {
                fl = false; //Флаг
                j = 0; //Обнуление
                while ((j<k+1)&&(fl == false))
                {
                    if (SymbolOfX[j] == x[i]) fl = true;
                    j++;
                }
                if (fl == false)
                {
                    SymbolOfX[k] = x[i];
                    ValueShift[k] = x.Length - i - 1;
                    k++;
                }
            }
        }
//Функция поиска алгоритмом БМ
public static string BM(string x, string s)
        {
            bool has, have; //Флаги
            int l,j,i; //Счетчики
            Function.ShiftBM(x); //Вызов процедуры, формирубщей таблицу смещений
            string nom = ""; //Строка с номерами вхождений
            if (x.Length > s.Length) return nom;
            //Основной цикл по исходной строке
            for (i = 0; i < s.Length-x.Length+1; i++)
            {
                j = x.Length - 1;
                have = true;
                //Проверка с последнего символа                
                while ((j >= 0)&&(have == true))
                {
                    //Если не совпадает символ искомой и исходной
                    if (s[i + j] != x[j])
                    {
                        have = false;
                        //Если это последний символ
                        if (j == x.Length-1) 
                        {
                            l = 0;
                            has = false; //Флаг
                            //Поиск символа в таблице смещений
                            while ((l < x.Length)&&(has == false))
                            {
                            //Если символ есть
                                if (s[i + j] == SymbolOfX[l]) 
                                {
                                    has = true; //Изменение флага
                                    i = i + ValueShift[l] - 1; //Сдвиг на величину
                                }
                                l++;
                            }
                            //Если не найден символ в таблице смещений
                            if (has == false) 
                                //Сдвиг на величину искомой строки
                                i = i + x.Length - 1; 
                        }
                    }
                    j--;
                }
                if (have == true)
                    nom = nom + Convert.ToString(i) + ", ";
            }
            //Если строка номеров не пустая
            if (nom != "")
            {
                nom = nom.Substring(0, nom.Length - 2); //Удаление последней запятой и пробела
            }
            return nom; //Возвращение результата поиска
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.10.2013, 12:18
Ответы с готовыми решениями:

Поиск вируса
Понимаю, что тема немного не по топику, но все же надеюсь на вашу помощь. Пишу курсач на тему стелс-вирусов. К нему желательно прикрепить...

Поиск и устранение вируса
Всем привет, возможно есть вирус, как обнаружили прочитайте тут обязательно...

2 вируса
Что делать? у меня в диспетчере задач висят 2 процесса. svchost.exe.exe и GoogleUpdater.exe,в авто загрузке когда убираешь...

8
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
13.10.2013, 12:25
Цитата Сообщение от Анна Сергеевна Посмотреть сообщение
но это не то, что надо
Странно. Для ClamAV годится, а вас не устраивает?
0
2 / 2 / 0
Регистрация: 28.09.2012
Сообщений: 127
13.10.2013, 12:46  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
Странно. Для ClamAV годится, а вас не устраивает?
Это же поиск подстроки в строке, а мне нужно поиск по всем директориям и файлам...я не могу понять как это сделать
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
13.10.2013, 13:17
Цитата Сообщение от Анна Сергеевна Посмотреть сообщение
не могу понять
  1. Рекурсивно обходите каталог и все его подкаталоги
  2. Для каждого файла подходящего типа, делаете мэппинг в память
  3. Для выбранного региона файла (DOS Stub, EP, Overlay etc) выполняете сканирование



P.S.

ClamAV - это Open Source. Загляните в исходники.
1
2 / 2 / 0
Регистрация: 28.09.2012
Сообщений: 127
13.10.2013, 14:21  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
ClamAV - это Open Source. Загляните в исходники.
не могу найти исходники

Добавлено через 24 минуты
Цитата Сообщение от gazlan Посмотреть сообщение
Рекурсивно обходите каталог и все его подкаталоги
Для каждого файла подходящего типа, делаете мэппинг в память
Для выбранного региона файла (DOS Stub, EP, Overlay etc) выполняете сканирование
Написала просто обход дирректории и вывод на консоль всех существующих файлов, как теперь правильно задать сигнатуру "вируса" и найти этот файл при помощи алгоритма Бойера-Мура?

Добавлено через 1 минуту
Цитата Сообщение от Анна Сергеевна Посмотреть сообщение
не могу найти исходники

Добавлено через 24 минуты

Написала просто обход дирректории и вывод на консоль всех существующих файлов, как теперь правильно задать сигнатуру "вируса" и найти этот файл при помощи алгоритма Бойера-Мура?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
 
namespace Serialization
{
    class Program
    {
        static void Main()
        {
            DisplayFileSystem(@"D:\3й курс\политология");
            Console.ReadKey();
        }
        private static void DisplayFileSystem(string path)
        {
            var dirInfo = new DirectoryInfo(path);
            WriteDirName(dirInfo);
            DisplayFilesList(dirInfo);
 
            foreach (var dir in dirInfo.GetDirectories())
            {
                DisplayFileSystem(dir.FullName);
            }
 
        }
 
        private static void DisplayFilesList(DirectoryInfo dirInfo)
        {
            foreach (var file in dirInfo.GetFiles())
            {
                Console.WriteLine("\t{0}", file.Name);
            }
        }
 
        private static void WriteDirName(DirectoryInfo dirInfo)
        {
            Console.WriteLine("Directory: {0}", dirInfo.FullName);
        }
    }
}
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
13.10.2013, 18:58
Цитата Сообщение от Анна Сергеевна Посмотреть сообщение
не могу найти исходники
Sources

как теперь правильно задать сигнатуру
Virus Database

Следующий вопрос, очевидно, будет о том, где накачать вирусов?
Вложения
Тип файла: rar cvdu.rar (129.5 Кб, 3 просмотров)
1
2 / 2 / 0
Регистрация: 28.09.2012
Сообщений: 127
13.10.2013, 19:32  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
Следующий вопрос, очевидно, будет о том, где накачать вирусов?
не совсем, вирусов как таковых нет. Задача заключается в том, что вирус вымышленный, т.е. допустим, что наш вирус, это какой-то вполне нормальный файл. Вот в качестве сигнатуры мы задаем имя этого файла, только это надо сделать в системе нулей и единиц.
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
13.10.2013, 20:32
Цитата Сообщение от Анна Сергеевна Посмотреть сообщение
Вот в качестве сигнатуры мы задаем имя этого файла
Это, тогда, новый MBAM будет - вирусы по имени файла детектировать. Для этого и BM не нужен.

Разберитесь, для начала, с тем, что такое сигнатура.
1
2 / 2 / 0
Регистрация: 28.09.2012
Сообщений: 127
17.10.2013, 20:51  [ТС]
Проблема сейчас в том, что индекс вылетает...не могу понять из-за чего=( и нужно еще добавить открытие всех файлов, т.е. их содержимое тоже нужно проверять
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
 
namespace Serialization
{
    class Program
    {
        static string Signature = "лекции";
 
        static void Main()
        {
            DisplayFileSystem(@"D:\3й курс\");
            Console.ReadKey();
        }
        private static void DisplayFileSystem(string path)
        {
            var dirInfo = new DirectoryInfo(path);
            WriteDirName(dirInfo);
            DisplayFilesList(dirInfo);
 
            foreach (var dir in dirInfo.GetDirectories())
            {
                DisplayFileSystem(dir.FullName);
                
            }
 
        }
 
        private static void DisplayFilesList(DirectoryInfo dirInfo)
        {
            foreach (var file in dirInfo.GetFiles())
            {
                Console.WriteLine("\t{0}", file.Name);
                Search(file.Name, Signature);
            }
        }
 
        private static void WriteDirName(DirectoryInfo dirInfo)
        {
            Console.WriteLine("Directory: {0}", dirInfo.FullName);
            Search(dirInfo.FullName, Signature);
        }
 
        static int[] _d;  
 
        ///<summary>Составление матрицы смещения</summary>
        ///<param name="image">Образ</param>
 
        static void Shift(string image)
        {
            _d = new int[char.MaxValue];
 
            for (var i = 0; i < _d.Length; i++)
            {
                _d[i] = image.Length;
            }
 
            for (var i = 0; i < image.Length; i++)
            {
                _d[image[i]] = image.Length - i;
            }
        }
 
        ///<summary>Реализация алгоритма Бойера-Мура</summary>
        ///<param name="_source">Строка</param>
        ///<param name="_image">Образ</param>
        ///<param name="sensitivity">Чувствительность к регистру</param>
     
        static void Search(string _source, string _image, bool sensitivity = false)
        {
            var source = _source;
            var image = _image;
 
            if (!sensitivity)
            {
                source = _source.ToLower();
                image = _image.ToLower();
            }
 
            Console.WriteLine("Строка: " + source);
            Console.WriteLine("Образ: " + image);
 
            Shift(image);
 
            if (image.Length > source.Length)
            {
                Console.WriteLine("Error: img > src");
                return;
            }
 
            if (image == source)
            {
                Console.WriteLine("Образ и строка равны");
                return;
            }
 
            for (var i = image.Length; i < source.Length + 1; )// Основной цикл
            {
                for (var j = image.Length - 1; j >= 0; j--)// Цикл проверки на совпадения
                {
                    if (image[j] == source[i - image.Length + j])// Проверка на совпадения
                    {
                        if (j == 0)// Если первый символ образа схож с текущим символом строки
                        {
                        Console.WriteLine("Образ найден на {0}-ом символе строки.", ((i - image.Length) + 1));
                        return;
                        }
                    }
                    else
                    {
                            i += _d[source[i]];
                            break;
                    }
                }
            }
 
            Console.WriteLine("Образ не был найден в исходной строке.");
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.10.2013, 20:51
Помогаю со студенческими работами здесь

32 вируса
32 вируса обнаружил анти-малваре,ноутбук мамин винде лицензионной года 3,всякоого хлама я думаю тут полно,вчера завис при...

Лечение вируса
При открытии любой ссылки происходит автоматический переход на сайт prizebot. ru, который Касперский блокирует как переход по вредоносной...

Удаление вируса
Не знаю как попал этот вирус на пк , не могу его удалить ни одним антивирусником , всплывает командная строка якобы он пытается что-то...

Удаление вируса
Приветствую. Какое-то время назад качал софт, после какого-то времени после этого на почту пришло письмо о попытке входа в steam. Не придал...

Лечение вируса
Помогите вылечить комп,вирус устанавливает левые проги которые не удаляются, меняет домашнюю страницу,открывает ссылки добавил


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru