| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 26.6.2006, 14:00 |
"*" - можно пропустить по алгоритму пойска! Так как осуществить пойск? |
| Автор: Alexeis 26.6.2006, 14:47 |
| h1tter, для этих целей следует использовать более продвинутое средство - Регулярные выражения. Существует специальный модуль. На форуме уже обсуждалось. |
| Автор: 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 | ||
Это что же и для бинарных файлов подходит? |
| Автор: Alexeis 27.6.2006, 17:33 | ||
Yanis, h1tter писал о поиске по строке
Не знаю может я чего то не понял |
| Автор: drkot 27.6.2006, 18:24 |
Вобще формат маски (как мне извесно): * - любое количество любых символов ? - один любой символ если придерживаться этой концепции то: маска разбивается на фрагменты разделенные "*" для каждого фрагмента составляется битовая маска (в данном случае FF0F00FF (Mask)) тоесль на месте вопросов ставим нули, а фрагмент строки приводим к такому виду 1D0A00AB0 (Ask) далее сканируем файл на предмет вхождения первого фрагмента ( (Sfile and Mask) = Ask если не напутал), при совпадении переходим ко второмы фрагменту (поиск начинаем с первого непроверенного байта). и так далее пока не завершатся все фрагменты. если получили совпадение по всем фрагментам, то искомая строка найдена. Для начала определись с языком запросов!!!! |
| Автор: Yanis 27.6.2006, 21:25 | ||
На сколько я понял, то h1tter хочет сделать что-то вроде антивирусной проверки -- по маске. Поиск по маске и ещё и в файле это довольно сложно... Сам с таким не сталкивался. |
| Автор: Alexeis 28.6.2006, 13:46 |
| Yanis, В этом случае любой байт можно рассматривать как 1 символ и искать нужную последовательность. 5 соответствует #5 241 соответствует #241 Мне кажется, что и в этом случае можно "прикрутить" регулярные выражения, хотя может существует что-то более специализированное. |
| Автор: h1tter 28.6.2006, 15:47 | ||||
Да, потом я скачал русскую версию библиотеки. Почитал хелп.Что-то про составление регулярных выражении. Примерно понял.Но что бы точно направить тему в то русло, я объясню зачем это надо: Составляется антивирусная программа, но не подумайте, что я занес в базу вирусов сто сигнатур, и теперь делаю пойск в файле.В моей базе уже 37481(!!!) сигнатур вредоносных программ. Из начально я пользовался очень сложным и нудным методом, Я думаю не стойт объяснять.Потом перешел на регулярные выражения (я эще не знал что они так именуются, для меня это были просто расширенный формат стандартной маски), в базу я заносил уже полу-регулярные выражения. А как их искать я не знал, вот и решил переделать алгоритм. Формат сигнатур очень простой, вот пример:
Ну так какие алгоритмы пойска можно предложить с участием выше перечисленной библиотеки? |
| Автор: Alexeis 28.6.2006, 16:08 | ||
| h1tter, Это в каком смысле? Сигнатура и есть регулярное выражение Expression = Сигнатура далеше Exec Алгоритм поиска уже реализован в TRegExpr, запускается он по Exec
|
| Автор: drkot 29.6.2006, 11:18 | ||
я алгоритм предложил. чем он неприемлем? Регулярные выражения вещь класная, тока заточена под текст. Для бинарного поиска не пробовал. |
| Автор: Yanis 29.6.2006, 11:22 |
Тем что файлик, например в 700MB не всегда очень легко загнать в string. |
| Автор: Alexeis 29.6.2006, 15:52 |
| Yanis, строка может содержать 4Гб, другое дело если компонентик решит пару раз скопировать такую строку Добавлено @ 15:54 С дугой стороны DrWeb тоже умирает на таких SFX-ах |
| Автор: drkot 29.6.2006, 16:11 | ||
о строках как о типе стринг речи небыло. таки всего лишь последовательность байтов представленая в шестнадцатиричном формате для наглядности. Хоть TStoune напиши, а суть алгоритма поиска неизменится ето если эвристику включить. Подобные тормоза наблюдаются и на сжатом видео и аудио. Видать для экристиви код сложноватый (если разобраться почти случайные числа поди найди там логику вот и парится DrWeb) |