Как распаковать файлы jsonlz4 (резервные копии закладок Firefox) с помощью командной строки?

22

Кажется, существуют разные способы распаковки JavaScript и браузера, но не существует ли способа преобразовать файлы jsonlz4 во что-то, что unlz4будет читать?

l0b0
источник
1
Перекрестная ссылка: Чтение файлов резервных копий закладок "jsonlz4" • Форумы MozillaZine (2014-11-04)
Грэм Перрин

Ответы:

18

Я смог распаковать jsonlz4 с помощью lz4json:

apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
Рольф
источник
1
Решение andikleen также подходит для .json.mozlz4файлов, например, как показано на github.com/andikleen/lz4json/issues/1#issuecomment-336729026 (примечание для себя: помните, помните, gmakeво FreeBSD…).
Грэм Перрин
3
Также: bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 (2016-05-13) под ошибкой Mozilla 1209390 - Использование стандартного формата файла lz4 вместо нестандартного jsonlz4 / mozlz4 привлекает внимание к avih / dejsonlz4:
Грэм Перрин
1
FWIW, инструмент andikleen не удалось скомпилировать с ошибкой «неопределенная ссылка на LZ4_decompress_safe_partial» (я установил его liblz4-devдо сборки). Инструмент Avih, OTOH, отлично работал для меня.
Waldyrious
1
Разве не иронично, что организация open-web использует собственный формат сжатия данных пользователя, что делает нетривиальным изучение ваших собственных данных ?!
августа
@ Грэм-Перрин: dejsonlz4 работал очень хорошо для меня. Он не « преобразует файлы jsonlz4 во что-то, что unlz4 будет читать » в соответствии с запросом, а непосредственно распаковывает их. Было бы хорошо сделать это реальным ответом, чтобы сделать его более заметным.
mivk
17

Сохраните этот скрипт в файле, например mozlz4:

#!/usr/bin/env python
from sys import stdin, stdout, argv, stderr
import os
try:
    import lz4.block as lz4
except ImportError:
    import lz4

stdin = os.fdopen(stdin.fileno(), 'rb')
stdout = os.fdopen(stdout.fileno(), 'wb')

if argv[1:] == ['-c']:
    stdout.write(b'mozLz40\0' + lz4.compress(stdin.read()))
elif argv[1:] == ['-d']:
    assert stdin.read(8) == b'mozLz40\0'
    stdout.write(lz4.decompress(stdin.read()))
else:
    stderr.write('Usage: %s -c|-d < infile > outfile\n' % argv[0])
    stderr.write('Compress or decompress Mozilla-flavor LZ4 files.\n\n')
    stderr.write('Examples:\n')
    stderr.write('\t%s -d < infile.json.mozlz4 > outfile.json\n' % argv[0])
    stderr.write('\t%s -c < infile.json > outfile.json.mozlz4\n' % argv[0])
    exit(1)
Хокон А. Хьортланд
источник
Мне пришлось изменить , import lz4чтобы import lz4.block as lz4, но он по- прежнему не работают. Некоторые байты против строки, связанной с ошибкой. OTOH этот скрипт работал с изменением импорта: gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389
1
@ user31389: я обновил скрипт. Это работает сейчас?
Håkon A. Hjortland
Не работал на меня, пока я не сделал $ pip install lz4.
Даниэль
5

Фактически почти все файлы lz4 профиля Firefox являются файлами mozlz4 . Это означает, что они имеют одинаковый «заголовок формата файла». За исключением одного файла. Я говорю о файле webext.sc.lz4 . Он имеет mozJSSCLz40v001\0заголовок файла и, возможно, некоторую scупаковку для упаковки группы файлов в поток байтов.

Существует аддон Firefox для чтения или компресс .mozlz4 текстовые файлы mozlz4-редактировать

hlovdal
источник
4

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

Следующее, кажется, работает по крайней мере на Python 2.7 и 3.6 с использованием последней версии привязок Python LZ4 :

def mozlz4_to_text(filepath):
    # Given the path to a "mozlz4", "jsonlz4", "baklz4" etc. file, 
    # return the uncompressed text.
    import lz4.block
    bytestream = open(filepath, "rb")
    bytestream.read(8)  # skip past the b"mozLz40\0" header
    valid_bytes = bytestream.read()
    text = lz4.block.decompress(valid_bytes)
    return text

Конечно, это не пытается проверить входные данные (или выходные данные), не предназначено для обеспечения безопасности и т. Д., Но если кто-то просто хочет иметь возможность анализировать собственные данные FF, он выполняет основную работу.

Командная строка версии здесь , которые могут быть сохранены в соответствующем каталоге и вызывается из командной строки , как:

chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>
Сэмюэл Хендерсон
источник