Як розпакувати файли jsonlz4 (резервні копії закладок Firefox) за допомогою командного рядка?


22

Здається, існують різні способи розпакування цього JavaScript + браузера, але чи не існує способу перетворення файлів jsonlz4 в щось unlz4, що прочитається?


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/isissue/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: Розпакуйте файли резервних копій закладок Mozilla Firefox
Грехем Перрін

1
FWIW, інструмент andikleen не вдалося скомпілювати, з помилкою "невизначене посилання на LZ4_decompress_safe_partial" (я встановив його liblz4-devперед його створенням). Інструмент avih, OTOH, прекрасно працював для мене.
waldyrious

1
Чи не іронічно, що відкрита веб-організація використовує фірмовий формат стиснення для даних користувача, що робить нетривіальним для вивчення власних даних ?!
cnst

@ Грем-Перрін: 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-edit


4

Для цього достатньо наполегливий 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.