Como descompactar arquivos jsonlz4 (backups de favoritos do Firefox) usando a linha de comando?

Respostas:

18

Consegui descompactar o jsonlz4 usando lz4json:

apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
Rolf
fonte
1
A solução andikleen também é boa para .json.mozlz4arquivos, por exemplo, como mostrado em github.com/andikleen/lz4json/issues/1#issuecomment-336729026 (note para si mesmo: lembre-se, lembre-se, gmakeno FreeBSD…).
Graham Perrin
3
Também: bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 (13-05-2016) no bug da Mozilla 1209390 - Use o formato de arquivo lz4 padrão em vez do jsonlz4 / mozlz4 não-padrão chama a atenção para avih / dejsonlz4: decompress Mozilla Firefox bookmarks arquivos de backup
Graham Perrin
1
FWIW, a ferramenta de andikleen falhou ao compilar, com o erro "referência indefinida a LZ4_decompress_safe_partial" (eu instalei liblz4-devantes de construí-lo). A ferramenta da avih, OTOH, funcionou perfeitamente para mim.
waldyrious
1
Não é irônico que uma organização de web aberta esteja usando um formato de compactação proprietário para os dados do usuário, tornando não trivial examinar seus próprios dados ?!
cnst
@ Graham-Perrin: dejsonlz4 funcionou muito bem para mim. Ele não " transforma os arquivos jsonlz4 em algo que o unlz4 lê " conforme solicitado, mas os descompacta diretamente. Seria bom torná-lo uma resposta real para torná-lo mais visível.
mivk
17

Salve este script em um arquivo, por exemplo 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
fonte
Eu tive que mudar import lz4para import lz4.block as lz4, mas ainda não funcionou. Alguns bytes vs erro relacionado a sequência. OTOH este script funcionou com a alteração de importação: gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389
1
@ user31389: atualizei o script. Isso funciona agora?
Håkon A. Hjortland
Não estava trabalhando para mim até que eu fiz $ pip install lz4.
Daniel
5

Na verdade, quase todos os arquivos lz4 do perfil do Firefox são arquivos mozlz4 . Isso significa que eles têm o mesmo "cabeçalho de formato de arquivo". Exceto um arquivo. Eu falo sobre o arquivo webext.sc.lz4 . Possui mozJSSCLz40v001\0cabeçalho de arquivo e talvez algumas scembalagens para empacotar o grupo de arquivos no fluxo de bytes.

Há um Firefox addon para ler ou compressa .mozlz4 arquivos de texto mozlz4-edit

hlovdal
fonte
4

Pesquisadores suficientemente persistentes para isso apresentam muitas soluções, mas a maioria delas parece (a) interrompida por alterações subsequentes nas bibliotecas subjacentes ou (b) desnecessariamente complexa (pelo menos para o meu gosto pessoal), tornando-as desajeitadas para cair no código existente.

A seguir, parece funcionar pelo menos no Python 2.7 e 3.6 usando uma versão recente das ligações do 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

É claro que isso não tenta validar entradas (ou saídas), não se destina a ser seguro, etc., mas se alguém quer apenas ser capaz de analisar os próprios dados de FF, ele faz o trabalho básico.

Versão da linha de comando aqui , que pode ser salva no diretório relevante e chamada a partir da linha de comando como:

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