Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Поиск шестнадцатеричной строки в бинарном файле


Автор: h1tter 25.6.2006, 17:35
Друзья, на днях столкнулся с одной проблемой:
Поиск шестнадцатеричной строки в бинарном файле.

На самом деле все очень просто: Считываешь байт,
Преобразуешь его, сравниваешь, если все байты найдены, то
строка найдена!
Но поиск ведется не по просто строке вида:
«1D5A16AB», а по маске, например «*1D?A??AB?»,
где между вопросами не равное количество символов.

Как сделать не знаю, опирался на алгоритм от «Петровича»
(«DRKB»,http://h1tter.nm.ru/masks.pas)  

Автор: Yanis 26.6.2006, 00:18
Цитата(h1tter @  25.6.2006,  18:35 Найти цитируемый пост)
где между вопросами не равное количество символов.

А чем тогда "*" отличается от "?"?  

Автор: h1tter 26.6.2006, 14:00
Цитата(Yanis @  26.6.2006,  00:18 Найти цитируемый пост)
А чем тогда "*" отличается от "?"? 

"*" - можно пропустить по алгоритму пойска!
Так как осуществить пойск? 

Автор: Alexeis 26.6.2006, 14:47
h1tter, для этих целей следует использовать более продвинутое средство - Регулярные выражения. Существует специальный модуль. На форуме уже обсуждалось. 

Автор: h1tter 27.6.2006, 14:34
Цитата(alexeis1 @  26.6.2006,  14:47 Найти цитируемый пост)
...для этих целей следует использовать более продвинутое средство - Регулярные выражения. Существует специальный модуль.


Покажите мне их!Как они работают? smile 

А если серъезно, то я скачал 
http://regexpstudio.com/Downloads/regexpr.rar.
И что с ним делать, как осуществить пойск сигнатуры в файле.
Если можно объясните вкратце smile 
 

Автор: Alexeis 27.6.2006, 14:53
1)Для начала нужно создать экземпляр класса TRegExpr
2)Затем нужно установить модификаторы (многосторочный - не многострочный, юникод - не юникод и т.д.)
3) Expression  присвоить маску поиска составленную по спец правилам (вы скачали компонент с английской справкой - у меня с русской). В хелпе подробно описаны правила.
4)InputString  присвоить строку с текстом.
5)Вызов Exec или ExecPos запустит поиск
6) Результат будет в Match[0] или  MatchPos[0] (первое появление) 

Автор: Yanis 27.6.2006, 16:19
Цитата(alexeis1 @  27.6.2006,  15:53 Найти цитируемый пост)
)Для начала нужно создать экземпляр класса TRegExpr
2)Затем нужно установить модификаторы (многосторочный - не многострочный, юникод - не юникод и т.д.)
3) Expression  присвоить маску поиска составленную по спец правилам (вы скачали компонент с английской справкой - у меня с русской). В хелпе подробно описаны правила.
4)InputString  присвоить строку с текстом.
5)Вызов Exec или ExecPos запустит поиск
6) Результат будет в Match[0] или  MatchPos[0] (первое появление)  

Это что же и для бинарных файлов подходит? 

Автор: Alexeis 27.6.2006, 17:33
Yanis, h1tter писал о поиске по строке
Цитата(h1tter @  25.6.2006,  16:35 Найти цитируемый пост)
Но поиск ведется не по просто строке вида:«1D5A16AB», а по маске, например «*1D?A??AB?»,где между вопросами не равное количество символов.

Не знаю может я чего то не понял smile 
 

Автор: drkot 27.6.2006, 18:24
Цитата(h1tter @  25.6.2006,  17:35 Найти цитируемый пост)
«*1D?A??AB?»,

Вобще формат маски (как мне извесно):
  * - любое количество любых символов
  ? - один любой символ

если придерживаться этой концепции то:
  маска разбивается на фрагменты разделенные "*"
  для каждого фрагмента составляется битовая маска (в данном случае FF0F00FF (Mask)) тоесль на месте вопросов ставим нули, а фрагмент строки приводим к такому виду 1D0A00AB0 (Ask) 
  далее сканируем файл на предмет вхождения первого фрагмента ( (Sfile and Mask) = Ask если не напутал), при совпадении переходим ко второмы фрагменту (поиск начинаем с первого непроверенного байта). и так далее пока не завершатся все фрагменты.
 если получили совпадение по всем фрагментам, то искомая строка найдена.

Для начала определись с языком запросов!!!! 

Автор: Yanis 27.6.2006, 21:25
Цитата(alexeis1 @  27.6.2006,  18:33 Найти цитируемый пост)
Не знаю может я чего то не понял

Цитата(h1tter @  25.6.2006,  18:35 Найти цитируемый пост)
Друзья, на днях столкнулся с одной проблемой:
Поиск шестнадцатеричной строки в бинарном файле.

На сколько я понял, то h1tter хочет сделать что-то вроде антивирусной проверки -- по маске. Поиск по маске и ещё и в файле это довольно сложно... Сам с таким не сталкивался. 

Автор: Alexeis 28.6.2006, 13:46
Yanis, В этом случае любой байт можно рассматривать как 1 символ и искать нужную последовательность.
5     соответствует #5
241 соответствует #241
Мне кажется, что и в этом случае можно "прикрутить" регулярные выражения, хотя может существует что-то более специализированное. smile  

Автор: h1tter 28.6.2006, 15:47
Цитата(alexeis1 @  27.6.2006,  14:53 Найти цитируемый пост)
...вы скачали компонент с английской справкой - у меня с русской)...

Да, потом я скачал русскую версию библиотеки.
Почитал хелп.Что-то про составление регулярных выражении.
Примерно понял.Но что бы точно направить тему в то русло,
я объясню зачем это надо:
Составляется антивирусная программа, но не
подумайте, что я занес в базу вирусов сто сигнатур,
и теперь делаю пойск в файле.В моей базе уже 37481(!!!)
сигнатур вредоносных программ.
Из начально я пользовался очень сложным и нудным методом,
Я думаю не стойт объяснять.Потом перешел на регулярные выражения
(я эще не знал что они так именуются, для меня это были просто расширенный формат
стандартной маски), в базу я заносил уже полу-регулярные выражения.
А как их искать я не знал, вот и решил переделать алгоритм.
Формат сигнатур очень простой, вот пример:
Код

DOS.Supra.Gen=b82135cd21891e????8c06????b425ba????cd21{1-3}cd2780fc4b

W97M.Sad.A=4c6f67696324203d204d6963726f24202b20223a53616422{-10}576f726442617369632e4d6163726f436f70792022476c6f62616c3a4175746f436c6f7365222c204c6f67696324
  
Ну так какие алгоритмы пойска можно предложить с участием выше перечисленной библиотеки? 

Автор: Alexeis 28.6.2006, 16:08
h1tter, 
Цитата(h1tter @  28.6.2006,  14:47 Найти цитируемый пост)
Ну так какие алгоритмы пойска можно предложить

Это в каком смысле?
Сигнатура и есть регулярное выражение
Expression = Сигнатура
далеше Exec
Алгоритм поиска уже реализован в TRegExpr, запускается он по Exec

Код

if Exec
then
  showmessage('вирус найден')
 

Автор: drkot 29.6.2006, 11:18
Цитата(h1tter @  28.6.2006,  15:47 Найти цитируемый пост)
Ну так какие алгоритмы пойска можно предложить с участием выше перечисленной библиотеки? 

я алгоритм предложил. чем он неприемлем?

Регулярные выражения вещь класная, тока заточена под текст. Для бинарного поиска не пробовал.
 

Автор: Yanis 29.6.2006, 11:22
Цитата(drkot @  29.6.2006,  12:18 Найти цитируемый пост)
чем он неприемлем?

Тем что файлик, например в 700MB не всегда очень легко загнать в string. 

Автор: Alexeis 29.6.2006, 15:52
Yanis, строка может содержать 4Гб, другое дело если компонентик решит пару раз скопировать такую строку smile

Добавлено @ 15:54 
С дугой стороны DrWeb тоже умирает на таких SFX-ах 

Автор: drkot 29.6.2006, 16:11
Цитата(Yanis @  29.6.2006,  11:22 Найти цитируемый пост)
Тем что файлик, например в 700MB не всегда очень легко загнать в string. 

о строках как о типе стринг речи небыло.
Цитата(drkot @  27.6.2006,  18:24 Найти цитируемый пост)
а фрагмент строки приводим к такому виду 1D0A00AB0 (Ask) 

таки всего лишь последовательность байтов представленая в шестнадцатиричном формате для наглядности.
Хоть TStoune напиши, а суть алгоритма поиска неизменится  smile 


Цитата(alexeis1 @  29.6.2006,  15:52 Найти цитируемый пост)
С дугой стороны DrWeb тоже умирает на таких SFX-ах

ето если эвристику включить. Подобные тормоза наблюдаются и на сжатом видео и аудио. Видать для экристиви код сложноватый (если разобраться почти случайные числа поди найди там логику вот и парится DrWeb) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)