Відповіді:
Мені вдалося розпакувати jsonlz4, використовуючи lz4json
:
apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
.json.mozlz4
файлів, наприклад, як показано на github.com/andikleen/lz4json/isissue/1#issuecomment-336729026 (примітка до себе: пам’ятайте, пам’ятайте, gmake
на FreeBSD…).
liblz4-dev
перед його створенням). Інструмент avih, OTOH, прекрасно працював для мене.
Збережіть цей скрипт у файлі, наприклад 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
$ pip install lz4
.
Насправді майже всі файли lz4 профілю Firefox - це файли mozlz4 . Це означає, що вони мають однаковий "заголовок файлового формату". За винятком одного файлу. Я говорю про файл webext.sc.lz4 . Він має mozJSSCLz40v001\0
заголовок файлів і, можливо, деяку sc
упаковку для упаковки групи файлів у потік байтів.
Існує додаток для Firefox для читання або стиснення .mozlz4 текстових файлів mozlz4-edit
Для цього достатньо наполегливий Googling виявляє безліч рішень, але, здається, більшість з них або (а) порушені подальшими змінами в базових бібліотеках, або (b) надмірно складними (принаймні на мій особистий смак), що робить їх незграбними до падіння в існуючий код.
Здається, що принаймні працює на 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>