Отсутствуют некоторые биты в заголовке данных (php) deflate - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь понять, как работает php gzdeflate / gzinflate.если я понимаю, это простой поток битов с трехбитным заголовком.Таким образом, можно было бы получить только первые биты и посмотреть, что сжато.Таким образом, взяв первые биты, мы можем теоретически (?) Извлечь байты за байтами?

Фактически я потерял несколько битов файла (около первых 40-50 байтов с некоторыми пропущенными битами, а не все биты,только некоторые из них).Я просто хочу знать, смогу ли я сделать умный "грубый удар", чтобы воссоздать первые байты, которые могут полностью gzdeflate () файл.Я знаю, что это PHP-код, поэтому извлеченные байты должны быть только ASCII.Я пытался перебить все биты, но это слишком долго.Так что, если бы я мог перебирать биты за битами, это было бы предпочтительнее.

(Если есть переопределение в python, которое читаемо, это мне очень поможет).Я прочитал http://www.zlib.net/feldspar.html, что больше о том, как сжать данных, я хочу распаковать его.

Спасибо

РЕДАКТИРОВАТЬ: Давайте возьмемпример.Вот мои данные (в шестнадцатеричном формате):

39e0 6fb2 41eb ....

Эти данные вычитаются из ключа.Этот ключ используется в шестнадцатеричном формате, поэтому у меня есть только 16 возможностей для каждого символа.

Алгоритм такой:

(ciphered - key) % 256 = deflate_data

Ключ в шестнадцатеричной форме.Первый ключ байта может быть только: 0x30 -> 0x39 и 0x61 -> 0x66. У меня есть только варианты (для ясности в младшем порядке, первый бит - это последний блок, два следующих бита - это тип кодирования):

Key -> deflate
0 -> 10010000  --> No, if .00 code, all other bits must be 00
1 -> 00010000  --> No, if .00 code, all other bits must be 00
2 -> 11100000  --> No, .11 is reserved
3 -> 01100000  --> No, .11 is reserved
4 -> 10100000  --> Maybe?
5 -> 00100000  --> Maybe?
6 -> 11000000  --> Maybe?
7 -> 01000000  --> Maybe?
8 -> 10000000  --> Uncompressed? Must check LEN and NLEN
9 -> 00000000  --> Uncompressed? Must check LEN and NLEN
a -> 00011011  --> No, .00 should hav all others bits to 0
b -> 11101011  --> No, .11 is reserved
c -> 01101011  --> No, .11 is reserved
d -> 10101011  --> Maybe?
e -> 00101011  --> Maybe?
f -> 11001011  --> Maybe?

поэтому первый байт моего ключа может быть: 4,5,6,7 или d, e, f.Некоторые из них использовали фиксированный словарь.Так возможно ли теоретически попробовать следующие байты?Другие байты являются динамическим словарем.Так возможно ли создать дерево Хаффмана со следующими байтами?Неправильный ключ, вероятно, приведет к невозможным деревьям Хаффмана.Когда у меня осталось немного возможностей, я могу попытаться перебить оставшиеся ключи.

8 и 9 могут быть легко протестированы.

Ключ сконструирован следующим образом:

MD5(pass[::-1])+MD5(pass[:len(pass)])

Таким образом, теоретически ключ может содержать от 32 до 50-60 символов в зависимости от длины ключа.

1 Ответ

0 голосов
/ 11 февраля 2019

Итак, можно было бы получить только первые биты и посмотреть, что сжато

Нет.3-битный заголовок просто определяет, является ли он последним закодированным блоком или нет, и тип кодирования блока.

Я просто хочу знать, могу ли я использовать интеллектуальную "грубую силу" для воссоздания первых байтов, которые могут полностью gzdeflate () файл

Маловероятно.Обычно большинство блоков попадают под тип кодировки 10 - compressed with dynamic Huffman codes.Итак, согласно RFC1951 - 3.2.3.Подробная информация о формате блока вы будете застревать при чтении первого кода дерева Хаффмана блока.Если вы не можете декодировать это дерево, вы даже не будете знать, где заканчивается ваш первый блок, потому что вы, возможно, потеряли маркер конца блока.

Что вы можете попробовать

Если вашцелостность файла не так важна, т. е. если это текст, XML, CSV или что-то еще, где вы извлечете выгоду из частичного восстановления файла - тогда вы можете добиться успеха с помощью этого алгоритма:

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

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

...