LINUX.ORG.RU

Анализ двоичных файлов

 ,


0

1

Привет всем!

Я пытаюсь понять структуру двоичного файла (данные русско-английского словаря). Программа позволяет добавлять и менять уже имеющиеся данные, поэтому можно отследить, как меняются двоичные данные. Двоичных файлов несколько, они имеют разную структуру и разное назначение. Разобрал большинство из них, но застопорился на одном. Разобрал его вплоть до сегментов вида

b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITsbYje}q\xa6\xd0\xda'
. Такие сегменты включают комментарии к терминам и еще какую-то информацию. Если вписать новое слово, сегмент всегда увеличивается байт-в-байт пропорционально длине слова. В данном конкретном случае b'bYje}q' означает слово «палата». Как мы видим, буква «а» кодируется по-разному в разных позициях (b'Y', b'e', b'q'). Методом тыка удалось выяснить, что значения b'Y', b'e', b'q' сохраняются для слов с чередующейся «а», например, «макака» (b'_Yieuq'). Однако, если «а» чередуется не через одну букву, то последовательность b'Yeq' нарушается. Например, «сарафан» будет b'dYoe\x7fq\x84' (сохраняется b'Yeq'), однако, «сараффан» будет b'dYoe\x7f\x85w\x8a' («а» кодируется как b'Y', b'e', b'w'). Т.е. кодировка привязана к позиции.

Кроме того, после байтов, кодирующих слово, идут 3 последних байта, назначение которых неясно (сегмент, в котором кодируется слово «палата», заканчивается на байты b'\xa6\xd0\xda'). Интересная особенность этих 3 последних байтов заключается в том, что они всегда будут одинаковы для слов одинаковой длины. Например, слово «макака» кодируется в сегменте

b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs_Yieuq\xa6\xd0\xda'
, где «макака» = b'_Yieuq', а 3 последних байта (b'\xa6\xd0\xda') будут одинаковы для всех слов из 6 символов. Это правило работает для всех слов с одинаковой длиной, например, сегменты, кодирующие слова из 8 символов, всегда заканчиваются на b'\xb2\xdc\xe6'. К примеру, вот сегмент, кодирующий «00000000»:
b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa3\xa9\xaf\xb5\xbb\xc1\xc7\xcd\xb2\xdc\xe6'
. Как мы видим, «00000000» кодируется как b'\xa3\xa9\xaf\xb5\xbb\xc1\xc7\xcd', а последние 3 байта - b'\xb2\xdc\xe6' характерны для слов из 8 символов.

TL/DR: байты кодируются в зависимости от своих позиций - но каким образом?

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

Вот здесь есть все слова, которые я анализировал.

Не понял, что за странное представление, и что вообще происходит. Но по твоему описанию похоже, что слово и побитовая маска хранятся в одной строке, и возможно, что применяется какая-то побитовая операция.

Bagrov ★★★★★
()
Последнее исправление: Bagrov (всего исправлений: 1)

Анализ двоичных файлов

для этого существуют такие вещи, как hex-редакторы. ты страдаешь фигнёй с питоном

eternal_sorrow ★★★★★
()

TL/DR: байты кодируются в зависимости от своих позиций - но каким образом?

Напоминает кодировку файлов истории QIP: буква в i-й позиции сохранялась как «код_буквы (в CP1251, вроде) + i».

Смещение «a» на 1 позицию вправо увеличивает код на 1 (w == q + 1).

anonymous
()
Ответ на: комментарий от anonymous

0 во второй позиции это \xa9.

0xA9 - 0x30 (код 0 в ASCII/CP1251) == 0x79. 0x79 + 0xE0 (код а в CP1251) == 0x59 (mod 0xFF). 0x59 в ASCII/CP1251 это Y.

Короче, кодирование элементарное.

anonymous
()
Ответ на: комментарий от anonymous

Смещение «a» на 1 позицию вправо увеличивает код на 1 (w == q + 1).

Ну тут я тупанул чутка. Увеличивает код на 6.

anonymous
()

а с чего решено что перекодируются символы ?

там вполне может быть soundex или транскрипция - то есть произношение слова.

и ‘А’ бывает ударная/безударная. Возможно ещё какая-то, долгая-краткая :-) То есть возможно это не позиционный код, просто ‘А’ разные

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)
Ответ на: комментарий от MKuznetsov

Нет, «а» там одинаковые. Поскольку те сегменты, которые я привел, изменились после того, как я сам добавил в программе тестовые слова. А транскрипция там отдельно лежит. И, по-моему, в демо-версии ее нет.

anonymizer
() автор топика
8 апреля 2020 г.

Спасибо всем за помощь. Я смог декодировать то, что было нужно. Но есть небольшая проблема. Я взялся за новую версию, и там уже другой алгоритм XOR. Опять без компрессии, байт-в-байт, кодировка cp1251. Например, вот что будет, если добавить в комментарий нули:

"0000000000"
b'''\x18\x9f\xf0!\xec\xa0}\xefxq''' (3 кавычки добавлены, чтобы не экранировать при необходимости)

NO  ORIG  INT1  INT2  OFFSET  DELTA
1   "0"   48    24    -24     -24  
2   "0"   48    159   111     135  
3   "0"   48    240   192     81   
4   "0"   48    33    -15     -207 
5   "0"   48    236   188     203  
6   "0"   48    160   112     -76  
7   "0"   48    125   77      -35  
8   "0"   48    239   191     114  
9   "0"   48    120   72      -119 
10  "0"   48    113   65      -7   

INT1 обозначает позицию кодируемого символа («0») в кодировке cp1251, INT2 - финальную позицию, OFFSET - смещение, DELTA - разницу между смещениями.

Заметил следующие особенности.

1) Кодирование зависит от длины фрагмента. Один и тот же символ будет закодирован по-разному в зависимости от длины фрагмента.

2) Если фрагменты одинаковой длины и отличаются, например, только конечные байты, то начальные байты будут одинаковы.

3) Обнаружил алгоритм для кодирования разных байтов, стоящих на одинаковых позициях (например, b"abc" -> b"abd"). За редким исключением, там зациклено смещение -2, -2, -2, +6, -2, -2, +10 для всей кодировки cp1251. Проблема в том, что мне надо знать, как меняются байты на разных позициях, т.е., не b"abc" -> b"abd", а, например, от чего зависит смещение b"d" в b"abcd", если смещение a, b и c известно.

Например:

"bbbbbb"
b'''`\xbe\xe4\x81\x19\x97'''

NO  ORIG  INT1  INT2  OFFSET  DELTA
1   "b"   98    96    -2      -2   
2   "b"   98    190   92      94   
3   "b"   98    228   130     38   
4   "b"   98    129   31      -99  
5   "b"   98    25    -73     -104 
6   "b"   98    151   53      126  

"bbcbbb"
b'''`\xbe\xfb\x81\x19\x97'''

NO  ORIG  INT1  INT2  OFFSET  DELTA
1   "b"   98    96    -2      -2   
2   "b"   98    190   92      94   
3   "c"   99    251   152     60   
4   "b"   98    129   31      -121 
5   "b"   98    25    -73     -104 
6   "b"   98    151   53      126  

"abc"
b'''JD%'''

NO  ORIG  INT1  INT2  OFFSET  DELTA
1   "a"   97    74    -23     -23  
2   "b"   98    68    -30     -7   
3   "c"   99    37    -62     -32  

"abcdef"
b'''a\xbeB\xd1f\xb1'''

NO  ORIG  INT1  INT2  OFFSET  DELTA
1   "a"   97    97    0       0    
2   "b"   98    190   92      92   
3   "c"   99    66    -33     -125 
4   "d"   100   209   109     142  
5   "e"   101   102   1       -108 
6   "f"   102   177   75      74   

Какой алгоритм используется? Извините, если туплю, но у меня небольшой опыт работы с бинарниками, а в шифровании вообще не разбираюсь.

anonymizer
() автор топика
Последнее исправление: anonymizer (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.