Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск последоват. байт с пропусками в байт массиве 
:(
    Опции темы
supersonic
Дата 20.5.2013, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



Приветсвую! Есть задачка найти последоватательность байтов с пропусками в байтовом массиве, например есть такая последовательность, тут ?? означает любой байт
?? ?? ?? ?? ?? 1E 06 8C C8 8E D8 ?? ?? ?? 8E C0 50 BE ?? ?? 33 FF FC B6
длинна последовательности произвольная, количество и длинна пропусков также произвольны. Может есть какие то библиотеки для решения подобных задач ? Регулярки не подходят в виду того что для одного байт-массива будет выполнятся несколько тысяч таких поисков и время работы приложения значительно увеличится.
PM MAIL   Вверх
fish9370
Дата 20.5.2013, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



библиотек, таких не знаю, тут не так сложно написать самому, регулярные выражения для этой задачи не нужны

исходя из задачи (как я ее понял) имеем три последовательности, которые идут в определенном порядке относительно друг друга

1) организуем поиск первой последовательности - тупой перебор до первого вхождения
2) перебор пока совпадают, иначе возврат к пункту 1
3) последовательность найдена - поиск следующей последовательности, переход к пункту 1
4) все последовательности найдены

можно распараллелить поиск несколькими потоками, немного конечно будет сложнее


--------------------
undefined
PM MAIL WWW ICQ   Вверх
supersonic
Дата 20.5.2013, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



Общий принцип я примерно себе так и представлял, но условия вы немного не так поняли
>>>>исходя из задачи (как я ее понял) имеем три последовательности, которые идут в определенном порядке относительно друг друга

Длинна последовательности произвольная, количество и длинна пропусков также произвольны
т.е. она может быть и такой (как в моем примере в 1м посте)
?? ?? ?? ?? ?? 1E 06 8C C8 8E D8 ?? ?? ?? 8E C0 50 BE ?? ?? 33 FF FC B6
а может быть и такой
AD 4A 7B ?? ?? ?? ?? ?? 1E 06 8C ?? C8 8E D8 ?? ?? ?? 8E C0 50 BE ?? ?? 33 FF FC ?? ?? B6

Это сообщение отредактировал(а) supersonic - 20.5.2013, 17:09
PM MAIL   Вверх
fish9370
Дата 20.5.2013, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



а в чем принципиальная разница? искомые последовательности нам известны целиком или есть еще какие-то условия?

а, стоп, вроде врубился, т.е. совпадение может быть частичным? то что не отмечено вопросами нам неизвестно, правильно?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Arantir
Дата 20.5.2013, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 1
Всего: 55



Выбросьте из искомой последовательности знаки вопроса и замените их соответствующими отступами. Организуйте обычный поиск, но ищите не целую последовательность, а интервалы соответствующей длины с соответствующими отступами между ними.

Например:
Код

 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
?? ?? ?? ?? ?? 1E 06 8C C8 8E D8 ?? ?? ?? 8E C0 50 BE ?? ?? 33 FF FC B6

Выбираем из массива первые 24 байта (0-23). Просто сравниваем 6-10, 14-17 и 20-23 байты. Если не сошлось — берем из массива 1-24 байты и сравниваем с теми же интервалами, добавляя смещение (7-11, 15-18, 21-24).
По сути задача сводится к определению этих интервалов из входящего шаблона. В остальном можно использовать любой алгоритм поиска подмножества во множестве.

Это сообщение отредактировал(а) Arantir - 20.5.2013, 20:17


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
volatile
Дата 21.5.2013, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(supersonic @  20.5.2013,  14:05 Найти цитируемый пост)
?? ?? ?? ?? ?? 1E 06 8C C8 8E D8 ?? ?? ?? 8E C0 50 BE ?? ?? 33 FF FC B6

если судить по дальнейши объяснениям, то неправильно вопрос задан.
похоже вопрос должен звучать так:
Цитата

* 1E * 06 * 8C * C8 * 8E * D8 * 8E * C0 * 50 * BE  * 33 * FF * FC * B6

где * - означает любое количество любых байтов.

так?

Это сообщение отредактировал(а) volatile - 21.5.2013, 00:15
PM MAIL   Вверх
supersonic
Дата 21.5.2013, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



Такс, может быть я немного не так пояснил - суть задачи заключается в поиске бинарных сигнатур внутри PE-файлов, сигнатуры могут быть т.н. разряженными, т.е. внутри сигнатуры может встретится любое количество "разрывов" произвольной длинны, тут "разрывы" - это любые байты, вот для примера одна сигнатура, взято с PeId

[BeRoEXEPacker v1.00 -> BeRo / Farbrausch]
signature=60 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? E8 ?? ?? ?? ?? BE ?? ?? ?? ?? B9 04 00 00 00 8B F9 81 FE ?? ?? ?? ?? 7F 10 AC 47 04 18 2C 02 73 F0 29 3E 03 F1 03 F9 EB E8 BA ?? ?? ?? ?? 8D B2
ep_only=1

т.е. это означает что PE файл начиная со своей точки входа имеет сначала 2 байта 60 68 потом 4 любых байта потом снова байт 68 потом снова 4 любых и снова после них 68 и так далее...
ну и таких сигнатур более 7к, каждую последовательность нада проверить на более чем лям различных файлов.



Это сообщение отредактировал(а) supersonic - 21.5.2013, 13:55
PM MAIL   Вверх
volatile
Дата 21.5.2013, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



supersonic, пока вы сами не решите что вам нужно, никто вам не поможет.
последний пост противоречит 2-му посту.

PM MAIL   Вверх
Dem_max
Дата 22.5.2013, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



ТС а 
?? ?? ?? ?? ?? 1E 06 8C C8 8E D8 ?? ?? ?? 8E C0 50 BE ?? ?? 33 FF FC B6
и 
1E 06 8C C8 8E D8 ?? ?? ?? 8E C0 50 BE ?? ?? 33 FF FC B6
не одно и тоже ??


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xvr
Дата 22.5.2013, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(supersonic @  21.5.2013,  13:54 Найти цитируемый пост)
ну и таких сигнатур более 7к, каждую последовательность нада проверить на более чем лям различных файлов.

В таком случае именно регулярки вам и помогут. Только по ним надо построить конечный автомат, причем ровно один сразу по всем вашим 7к сигнатур

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0779 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.