Найти - Пользователи
Полная версия: Поиск возможных комбинаций бинарных данных
Начало » Python для новичков » Поиск возможных комбинаций бинарных данных
1 2
vanvanov
Добрый вечер!
Я анализирую содержимое бинарного файла. Часть документации в открытом доступе, и на ее основе удалось частично восстановить логику. Осталось проанализировать извлеченные фрагменты. Вот длина некоторых из них:
 [10, 15, 16, 18, 19, 22, 23, 24, 26, 28, 29, 30]
Известно, что данные фрагменты образованы одним и тем же алгоритмом. К примеру, предыдущие фрагменты кодировались алгоритмом 1 байт, далее - произвольное количество семибайтовых комбинаций (3 байта + 2 байта + 2 байта) и обозначали целые числа (bL2h).
Могу ли я на основе, для начала, длины фрагментов угадать используемую комбинацию? Предполагаю, что надо искать одинаковые целые числа, которые поровну разделят числа из указанного выше списка, но задача усложняется тем, что, как в предыдущем примере, в определенном месте могут быть “лишние” 1-3 байта. Извините, если не очень понятно сформулировал особенности задачи.
py.user.next
vanvanov
Я анализирую содержимое бинарного файла.
Бинарный файл можно легко создать, заполнив его произвольными данными (мусором). Так что выражение “бинарный файл” ни о чём не говорит.

vanvanov
3 байта + 2 байта + 2 байта
Где ты видел данные по три байта? 1, 2, 4, 8, 16, …, 256 - вот стандартные длины для разных данных (от чисел до пакетов). Остальные длины - это либо строки, ограниченные маркером конца строки или заданной длиной перед строкой, либо хрен знает, кто это делал и стоит ли с этим разбираться.

vanvanov
Извините, если не очень понятно сформулировал особенности задачи.
Да, похоже на набор произвольных мыслей.
doza_and
vanvanov
Извините, если не очень понятно сформулировал особенности задачи.
Угу.
vanvanov
Часть документации в открытом доступе
Так напишите что это за файл. Если есть возможность прикрепите его к сообщению.
vanvanov
Я анализирую содержимое
Сформулируйте цель анализа.
Сформулируйте и приведите алгоритм анализа который у вас получился.
vanvanov
Могу ли я на основе, для начала, длины фрагментов
Что именно вы можете проще всего вам самому выяснить. А вот есть ли принципиальная возможность кому угодно по сообщению А узнать наступает ли событие Б определяется информативностью сообщения А. Если вам именно это нужно то смотрите что такое информационная энтропия и количество информации.
vanvanov
py.user.next
Где ты видел данные по три байта?
Здесь, если интересно. Из libmtquery, README.rus:
3 байта - номер слова (4 байтовый long ужатый до 3-х байт)
У меня получается расшифровать, когда прибавляю b'\x00'.
vanvanov
doza_and
Так напишите что это за файл. Если есть возможность прикрепите его к сообщению.
Словари Multitran в виде dict.ert и прочее отсюда.
doza_and
Сформулируйте цель анализа.
Есть библиотека для анализа словарей в бинарном формате на C++, которая, видимо, уже давно не поддерживается. Хочу сделать актуальную реализацию на Python. В C++ я не бум-бум, увы.
Сформулируйте и приведите алгоритм анализа который у вас получился.
Увы, полное описание не одну страницу займет. Делалось по 2 README из файлов этого проекта. Эти README, видно, писались для себя, потому что много белых пятен. Вкратце: есть база данных словарей в своем собственном формате. Для описания слов обычно используется алгоритм:
1) число байт в основной части (непосредственно задает слово)
2) число байт информационной части (информация о слове)
2) основная часть: слово в кодировке windows-1251
3) информационная часть: дополнительная информация о слове - его номер, код тематики и прочее
Дополнительная часть не целиком описывается в README, вот сейчас ее и расшифровываю. В результате анализа из dict.ert извлек следующие фрагменты:
 b'\xfccynv~!\x13\x0c&\x19\x1d51AQ'
b'\xfcc|\x87\x8dz\x91\x89-\x1b\x17*A3^\x8a'
b'\xfcqs\x82\x80{!\x06\x1b\x1f(%5Eo@IS'
b"\xfcmpt{\x8d?\x8d\x8c\x9f\x9b?'.:=EAYZajq\x81"
b'\xfcsv|y9\x8c\x94\xa0\x9f\xab\xa2\xa7i\xb0\xbe\xcd\x81\xca\xdc\xe1\xdd\xe8\xf9\xf4\x00\x05\x02\x15\xab\x99\xa3\xa8\xa5\xaf\xc3\xbb\xc7\xcc\xca\xdb\x1d\x17\xe9\xf1\xf6\x01\xfd\x0b\x14\x0c\x19."_2+qAM^aT\x95eahu\x80\x94\xae\xda\xe4'
b'\xfcml\x82~\x88\x93\x97\x94\x94\x9f\xa6\xa4K1EIGK%`fmj\xab\x80\x85\x8e\x88\x8d\x94\xa2\xa3\xa6\xd6\x05'
b'\xfcdvz\x83\x88\x92\x8e\x9f\x96W\xa1\xa8\xbc\xb8\xbc\xc9cX[dk_gx\x7f\x80\xbd\x92\x94\x8f\xa2\xca\xf3\xff'
Они, скорее всего, шифруют ряд целых чисел. Пытаюсь понять алгоритм, который использовался для создания этих фрагментов.
doza_and
vanvanov
шифруют ряд целых чисел
Маловероятно что кто-то шифрует числа. Могут использовать разное количество байт для представления целых чисел.

Задача решаема если у вас есть для слов информация из других источниках о этих числах или вас есть работающий алгоритм декодирования. Смотреть надо не в readme а в коде на c++. Скомпилировать запустить под отладчиком. Если библиотека старая то взять старые словари.

Декодирование можете выполнять при помощи модулей struct или ctypes.
Думаю ваша работа будет полезна если вы для словарей мультирана составите описание для katai
https://kaitai.io/. Кроме того это может существенно облегчить и вашу работу за счет исключения низкоуровневого кодирования.

py.user.next
vanvanov
Есть библиотека для анализа словарей в бинарном формате на C++, которая, видимо, уже давно не поддерживается. Хочу сделать актуальную реализацию на Python. В C++ я не бум-бум, увы.
vanvanov
Они, скорее всего, шифруют ряд целых чисел. Пытаюсь понять алгоритм, который использовался для создания этих фрагментов.
Думаю, тебе рано этим ещё заниматься. Лучше делай программы по хорошо документированным материалам, пока учишься. Уверяю тебя, на хорошо документированных материалах ты также будешь испытывать трудности. А когда опыт наберёшь, тогда можешь и реверсией заняться. На данном же этапе ты просто потеряешь время и результат будет нулевой. И опыта хорошего и качественного тоже не получишь. Поначалу нужно делать удобные задачки.
vanvanov
py.user.next
Когда-то же надо начать таким заниматься. Уже 6 лет программирую на Питоне в качестве хобби.
vanvanov
doza_and
Маловероятно что кто-то шифрует числа. Могут использовать разное количество байт для представления целых чисел.
Да, это я и имел в виду.
Смотреть надо не в readme а в коде на c++. Скомпилировать запустить под отладчиком. Если библиотека старая то взять старые словари.
Пока не скомпилировал. Куча непонятных предупреждений. Правда, на новой системе. Возможно, следует достать старый дистрибутив Линукса.
Думаю ваша работа будет полезна если вы для словарей мультирана составите описание для katai
https://kaitai.io/.
Спасибо. Уже смотрел, но бинарные файлы для меня - относительно новая тема, поэтому пока слишком круто.
py.user.next
vanvanov
Когда-то же надо начать таким заниматься. Уже 6 лет программирую на Питоне в качестве хобби.
Ну, вот ты говоришь про бинарные файлы и мне становится понятно, что ты не понимаешь, что это. А это ведь такая обширная тема и по ней лучше начинать с чего-то облегчённого, с чего-то с подсказками и разжёванным до каждого бита материалом. Что ты знаешь, например, о little- и big-endian при хранении бинарных файлов на диске и в памяти программы? Вот ты знаешь, что они просто могут различаться? Это маловероятно, что ты это знаешь. А когда работаешь с бинарными файлами, причём с файлами из реального мира, а не с учебными, это всё надо представлять и учитывать. И длина этих байтовых последовательностей может меняться: в памяти программы хранится одно по длине, а сохраняется другое. За пять минут это всё не объяснишь.

И дальше ты вдруг пишешь, что они “шифруются”. То есть тут, я думаю, ты имеешь в виду не шифрование, а кодирование или конвертацию. Они там не зашифрованы, в том-то и дело, а ты пишешь про шифрование. Это для тебя это выглядит как шифры, а для опытного разработчика это выглядит как обычные данные. Не все данные являются чистыми; во многих данных наряду с чистыми участками лежит мусор, который не используется, который там для забивки пространства. И я знаю, что вместо чтения данных ты увидишь этот мусор и подумаешь, что это данные какие-то, и будешь пытаться этот мусор разгадывать. И что ты разгадаешь в нём? Он просто для забивки лежит там, чтобы структуры в программе ровно в памяти заполнялись. И мусор бывает в виде отдельных байт, а также мусор бывает в виде групп битов внутри одного байта, когда там используются только некоторые биты в качестве битовых полей. А ты будешь при этом сидеть и разгадывать значение этого байта, будто там смысл какой-то есть; а он будет просто наполовину замусорен неиспользуемыми битами.

И вот чтобы это всё знать, это нужно начинать с простых учебных задачек про работу с битами через битовые операции.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB