Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 13, 2020 13:28:11

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

Приветствую!
Вопрос скорее общего характера, а не по Python. Анализирую структуру двоичных файлов одной популярной программы-словаря. При этом я 100% уверен, что где-то в ресурсах программы должно быть слово b'HelenDZ' (или b'helendz'), потому что я видел его в словаре, однако поиск по бинарникам не дает результатов. Я знаю, что, к примеру, кириллица имеет в бинарнике кодировку cp-1251, но ведь вышеуказанное слово состоит из латиницы и должно лежать именно в форме b'HelenDZ'. Пробовал использовать словарь оффлайн, все то же самое. Значит, это слово лежит где-то в ресурсах. Все ресурсы, судя по всему, лежат в одном главном каталоге с программой. Но почему поиск не дает результатов (он рабочий, я проверял)?

Отредактировано vanvanov (Янв. 13, 2020 13:28:49)

Офлайн

#2 Янв. 13, 2020 14:06:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

vanvanov
Значит, это слово лежит где-то в ресурсах.
  
>>> 'HelenDZ'.encode('utf-16')
b'\xff\xfeH\x00e\x00l\x00e\x00n\x00D\x00Z\x00'
>>> 
>>> 'HelenDZ'.encode('utf-32')
b'\xff\xfe\x00\x00H\x00\x00\x00e\x00\x00\x00l\x00\x00\x00e\x00\x00\x00n\x00\x00\x00D\x00\x00\x00Z\x00\x00\x00'
>>>



Офлайн

#3 Янв. 13, 2020 16:07:24

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

py.user.next
К сожалению, ничего не найдено. Еще какие-нибудь варианты?

Офлайн

#4 Янв. 13, 2020 17:23:49

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

vanvanov
Еще какие-нибудь варианты?
ну так сказать трудно, наврядли у вас чтото выйдет если вы не знаете наверняка:
1. в какой кодировке храняться данные(шото сомневаюсь что cp-1251).
2. сжат ли чемто файл. (Наврядли он храниться в несжатом виде, иначе он бы словари занимали просто тонны места. Хотябы какойнить lzma или zip там точно должен использоваться.Даже если они изобрели свой велосипед|компилтор, то очень сомнительно что там не использовались какие либо методы сжатия)
3. зашифрован ли файл. Иногда в подобные данные вставляют защиту от дурака “шифруя” XOR-ом по какомунить числу. Легко детектиться если это plain text c кучей пробелов, но вот если это бинарные данные то сложнее.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 13, 2020 17:43:40)

Офлайн

#5 Янв. 14, 2020 04:30:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

vanvanov
К сожалению, ничего не найдено.
Там вариантов миллион. Но даже открытые данные в ascii могут храниться не так, как ты предполагаешь.

PEHDOM
2. сжат ли чемто файл.
Может быть сжат, может храниться вообще не там и не так. Эти строки вообще в базе данных могут храниться в её внутреннем формате.

PEHDOM
3. зашифрован ли файл.
Может быть и зашифрован чисто в целях гарантии целостности данных. Так что и не XOR может быть, а более стойкий алгоритм.



Отредактировано py.user.next (Янв. 14, 2020 04:37:00)

Офлайн

#6 Янв. 14, 2020 07:05:29

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

Один из хороших вариантов разобраться - добавить свое слово и посмотреть что изменилось. Конечно если есть такая возможность.



Офлайн

#7 Янв. 25, 2020 19:57:16

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

doza_and
Один из хороших вариантов разобраться - добавить свое слово и посмотреть что изменилось. Конечно если есть такая возможность.
Спасибо за дельный совет!

Изучаю, как все устроено. Да, действительно, есть возможность добавлять свои данные. При этом в двоичных файлах происходит изменение в одном из сегментов (он увеличивается строго на длину добавленного слова + 1, т.е. при добавлении слова “word” сегмент увеличится на 5 байт). Добавил комментарий в виде буквы “W”, при этом добавились байты b'U\xac'. Решил поэкспериментировать, перезаписал позиции новых байтов, запустил оригинальный словарь и получил такие результаты:
b'V\xac' -> комментарий не виден
b'U\xad' -> комментарий изменился на ‘X’
b'A\xac' -> тW (комментарий исчез, но к термину перед комментарием добавилось ‘тW’)
b'U\x32' -> комментарий изменился на ‘Э’
b'U\x33' -> комментарий изменился на ‘Ю’
b'U\x34' -> комментарий изменился на ‘Я’
<…>
b'U\x54' -> комментарий изменился на ‘я’

Вернул назад резервную копию, добавил в другом месте комментарий в виде “2020”. В результате, сегмент
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KIT|\xa6\xb0'
изменился на
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa5\xa9\xb1\xb5\x9a\xc4\xce'
.
Методом тыка определил, что за показ “2020” отвечают байты b'\xa5\xa9\xb1\xb5'. Меня смущает то, что повторяющиеся цифры (2, 0) кодируются разными байтами. Тут используются маски? Вы как думаете?

Офлайн

#8 Янв. 26, 2020 07:51:25

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

Масок тут нет скорее всего.
То что меняется на длину слова +1 говорит о том что там слово байт в байт+длина в один байт или терминатор.

Со стороны вообще неясно о чем идет речь. То слово добавляется и про него вы говорите как что удлиняется потом комментарий появляется, который вы непонятно зачем исследуете. Когда вы описываете ваши тесты непонятно какие гипотезы вы проверяете. По результатам тестов из описания не видно какие вы выводы сделали.

Я бы посоветовал действовать более последовательно (менее хаотично). Начать со слова длины 1. Без комментариев. Найти способ кодирования (отображение данных в циферки). Сравнить с таблицами кодировок, которых туча. Может найдете вашу тогда смотрите на файл применяя эту кодировку. Потом добавляйте количество букв. Как разберетесь, займитесь комментариями.



Отредактировано doza_and (Янв. 26, 2020 07:55:25)

Офлайн

#9 Янв. 26, 2020 11:02:26

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

doza_and
То слово добавляется и про него вы говорите как что удлиняется потом комментарий появляется, который вы непонятно зачем исследуете.
Дело в том, что у словаря достаточно сложная структура. Есть специальный файл для окончаний, есть для основ, есть индекс, который склеивает номера основ во фразы, и есть файл (самый большой), по которому строится словарная статья. Я сейчас на последнем этапе (построение статьи), остальное я более-менее успешно распарсил. Структура файлов, на самом деле, несложная. Там действительно слова кодируются байт-в-байт, без шифрования, кодировка windows-1251 (да, программа старая, появилась еще в 90-х, если не раньше). При добавлении термина изменяются несколько бинарников подряд, при добавлении комментария - только 1 (отвечающий за словарную статью), поэтому изменения легче отследить. Бинарник, отвечающий за словарную статью, является исключением - там не windows-1251. На данный момент точно известно, что в нем хранятся номера статей и комментарии. Что еще - не знаю.
doza_and
Найти способ кодирования (отображение данных в циферки). Сравнить с таблицами кодировок, которых туча.
Там примерно такое:
b'\x32' -> ‘Э’, b'\x33' -> ‘Ю’, b'\x34' -> ‘Я’. Такой кодировки я не знаю. Но меня другое смущает. Повторяющиеся символы (как в числе 2020 или в слове awwwwful, или просто 13 нулей или знаков доллара) кодируются разными байтами. Как такое может быть? Кроме того, если я вручную поменяю, например, b'\xa5\xa9\xb1\xb5' (2020) на b'\xa5\xa5\xa5\xa5', словарь мне покажет “2,&”, а если - на b'\xb5\xb5\xb5\xb5', то “B<60”.

UPD.
Сегмент, в котором (наряду с другой информацией) кодируется 0:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa3\x88\xb2\xbc'
Сегмент, в котором кодируется 1:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa4\x88\xb2\xbc'
Сегмент, в котором кодируется 0000:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa3\xa9\xaf\xb5\x9a\xc4\xce'
Сегмент, в котором кодируется 2020:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa5\xa9\xb1\xb5\x9a\xc4\xce'
Сегмент, в котором кодируется 2021:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa5\xa9\xb1\xb6\x9a\xc4\xce'

Отредактировано vanvanov (Янв. 26, 2020 12:05:27)

Офлайн

#10 Янв. 26, 2020 17:47:35

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

vanvanov
Как такое может быть?
Ну например авторы подумали что неплохо бы RLE сжатие применить. https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BB%D0%B8%D0%BD_%D1%81%D0%B5%D1%80%D0%B8%D0%B9

вот и будут разные буквы…

Это такая гипотеза. Можете меняя число букв ее проверить.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version