|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.04.2012, 01:06 | #1 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Быстрый поиск сигнатуры HEX в файле, как это делается?
Доброго времени суток!
От нечего делать, думаю как же реализуется алгоритм поиска HEX-сигнатуры в файле, когда база сигнатур насчитывает >5000-10000 записей, в течении нескольких секунд. Сейчас я понимаю под сигнатурой, уникальную последовательность байт характерных, только для чего-либо, среди остального множества. Ярким примером будет PEid. Собственно как это работает? Но куда более интересный вопрос: Как найти уникальную последовательность байт имеея 2 файла? Я уже пытался, найти решение 2-го вопроса, вот таким образом: Код:
И есть 2, 3 его мутации. как там найти уникальные байты? Последний раз редактировалось Человек_Борща; 20.04.2012 в 01:18. |
20.04.2012, 01:21 | #2 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,646
|
Есть алгоритмы быстрого поиска подстроки в строке. Наиболее простой алгоритм примерно такой:
Пусть исходная строка: S = S1S2...Sn - символы строки. Подстрока: P1P2...Pm - ее символы. Находим сумму: SumP := P1 + P2 + ... + Pm - суммируем коды символов. Также находим сумму: SumS := S1 + S2 + ... + Sm - сумма m-первых кодов символов исходной строки. Если SumP = SumS, то проверяем, не является ли последовательность S1S2...Sm нужной подстрокой. Если нет, то идем дальше. SumS := SumS - S1 + S(m+1) Опять сравниваем SumP = SumS. Далее: SumS := SumS - S2 + S(m+1) И т.д. Если на каком-то шаге SumP = SumS, то это еще не факт, что подстрока найдена, в таких случаях делается посимвольная проверка. Есть еще алгоритм Бойера-Мура: http://ru.wikipedia.org/wiki/%D0%90%...83%D1%80%D0%B0 , он сложнее. Разумеется, все это можно применять не только к строкам, а к любым последовательностям. E-Mail: arigato.freelance@gmail.com
|
02.12.2012, 13:50 | #3 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Хм, подыму тему ибо надо и я не понимаю..
Есть сигнатура CE 08 F9 5E D4 9B 64 1A Я задаю её как: Код:
В ТЗ сказано что сигнатура в конце файла. Я могу: 1. Идти от начала и до конца 2. Начать с конца 1. понятно движение слева на право. 2. не понятно, как читать с конца? Движение курсора справа-налево, и тогда я должен искать: Код:
Как искать саму сигнатуру в принципе? Есть вариант, чтения байт в массив размером 8 байт и потом по-байтно сравнить с сигнатурой. Но опять же проблема, файл может и не делится на 8. Подскажите куда смотреть? |
02.12.2012, 15:47 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А если так: читаем очереной блок в буфер. С помощью Pos ищем вхождение сигнатуры. Если нет проверяем последний байт буфера насчет вхождения в сигнатуру, если есть, то проверка - нет ли начала сигнатуры в конце блока. Если есть, то в следующем прочитанном блоке проверяем первые байты блока на совпадение с концом сигнатуры. И т.д. Если читать блоки с конца файла, то проверка начала и конца буфера с точностью наоборот. Если файл целиком умещается в буфер, то вообще проблем нет. Насчет эффективности уверенности нет. Предполагаю, что Pos побыстрее будет, чем программный цикл по байтам. С приведением буфера и сигнатуры к String для использования в Pos проблем нет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 02.12.2012 в 15:49. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
CopyRect - как это делается? | Tip.the.besT | Общие вопросы Delphi | 2 | 22.01.2012 22:35 |
Как это делается? | Daison | Свободное общение | 1 | 10.04.2011 18:58 |
Просмотр документа перед печатью. Как это делается? | ProgDel | Общие вопросы Delphi | 7 | 18.11.2010 08:51 |
как это делается? | natalie1983 | Microsoft Office Excel | 5 | 11.03.2010 18:20 |
как это делается? | самая_счастливая | Операционные системы общие вопросы | 5 | 25.12.2009 10:41 |