Wie dekomprimiere ich jsonlz4-Dateien (Firefox-Lesezeichen-Backups) über die Befehlszeile?

Antworten:

18

Ich konnte den jsonlz4 mit lz4jsonfolgendem Befehl entpacken :

apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
Rolf
quelle
1
Die andikleen-Lösung eignet sich auch für .json.mozlz4Dateien, z. B. wie unter github.com/andikleen/lz4json/issues/1#issuecomment-336729026 gezeigt (Hinweis für sich selbst: Denken Sie daran, denken Sie daran, gmakeunter FreeBSD ...).
Graham Perrin
3
Außerdem: bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 (2016-05-13) unter Mozilla-Fehler 1209390 - Verwenden Sie das Standard-LZ4-Dateiformat anstelle des nicht-Standard-Jsonlz4 / Mozlz4, um auf avih / dejsonlz4
Graham Perrin
1
FWIW, andikleens Tool konnte nicht kompiliert werden, mit dem Fehler "undefinierter Verweis auf LZ4_decompress_safe_partial" (ich habe es liblz4-devvor dem Erstellen installiert ). Das Tool von avih, OTOH, hat bei mir perfekt funktioniert.
Waldyrious
1
Ist es nicht ironisch, dass eine Open-Web-Organisation ein proprietäres Komprimierungsformat für Benutzerdaten verwendet, sodass es nicht trivial ist, Ihre eigenen Daten zu untersuchen ?!
8.
@ Graham-Perrin: dejsonlz4 hat bei mir sehr gut funktioniert. Es " transformiert jsonlz4-Dateien nicht in etwas, das von unlz4 gelesen wird ", sondern dekomprimiert sie direkt. Es wäre gut, eine echte Antwort darauf zu finden, um sie sichtbarer zu machen.
Mivk
17

Speichern Sie dieses Skript in einer Datei, zB 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)
Håkon A. Hjortland
quelle
Ich musste ändern import lz4zu import lz4.block as lz4, aber es immer noch nicht funktioniert hat . Einige Bytes versus Zeichenfolgenfehler. OTOH dieses Skript arbeitete mit der Importänderung
user31389
1
@ user31389: Ich habe das Skript aktualisiert. Funktioniert es jetzt?
Håkon A. Hjortland
Hat nicht für mich gearbeitet, bis ich es tat $ pip install lz4.
Daniel
5

Eigentlich sind fast alle Firefox-Profil- LZ4- Dateien MozLZ4- Dateien. Dies bedeutet, dass sie den gleichen "Dateiformat-Header" haben. Ausgenommen eine Datei. Ich spreche über die Datei webext.sc.lz4 . Es hat einen mozJSSCLz40v001\0Dateikopf und möglicherweise eine scPackung, um eine Gruppe von Dateien in einen Byte-Stream zu packen.

Es ist ein Firefox - Add - on oder Kompresse lesen .mozlz4 Textdateien mozlz4-edit

hlovdal
quelle
4

Ausreichend hartnäckiges Googeln führt dazu, dass viele Lösungen gefunden werden, aber die meisten davon scheinen entweder (a) durch spätere Änderungen an den zugrunde liegenden Bibliotheken kaputt zu sein oder (b) unnötig komplex (zumindest nach meinem persönlichen Geschmack), was sie klobig macht in vorhandenen Code ablegen.

Das Folgende scheint zumindest auf Python 2.7 und 3.6 zu funktionieren, wenn eine aktuelle Version der Python LZ4-Bindungen verwendet wird :

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

Natürlich wird nicht versucht, Eingaben (oder Ausgaben) zu validieren, es ist nicht beabsichtigt, sicher zu sein usw., aber wenn man nur seine eigenen FF-Daten analysieren möchte, wird die grundlegende Arbeit erledigt.

Befehlszeilenversion hier , die im entsprechenden Verzeichnis gespeichert und über die Befehlszeile aufgerufen werden kann als:

chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>
Samuel Henderson
quelle