Как декодировать / расшифровывать собственный формат Mozilla Firefox .jsonlz4? (Sessionstore-подпорка / recovery.jsonlz4)

1515
cnst

Я пытаюсь разобраться в собственном формате файлов Mozilla Firefox, который .jsonlz4используется, например, для sessionstore-backups/recovery.jsonlz4, но безрезультатно.

Как мне вернуть мои данные, в частности, какой-нибудь длинный текст, который я набрал в некоторых текстовых областях сбойного сеанса? Это мои данные!

10
Я бы не назвал формат _pprietary_. Конечно, это пользовательский, не используемый где-либо за пределами проектов Mozilla, но, поскольку весь Firefox, включая соответствующий (де) код сжатия, является бесплатным и открытым исходным кодом, этот формат не следует называть проприетарным. (PS Я не говорю о брендинге, который лицензируется по-другому.) Ruslan 5 лет назад 8
@Ruslan, но на самом деле он проприетарный - просто потому, что OSS не делает его непатентованным, поскольку существуют нулевые стандартные инструменты для просмотра содержимого этих файлов, тогда как все остальные файлы, даже формат JAR Java, могут легко управляться с помощью 100% стандартных непатентованных инструментов, которые доступны в портах / пакетах каждой приличной системы UNIX. ОТО, совершенно нетривиально на самом деле получить ваши собственные данные из этих файлов `.jsonlz4`. cnst 5 лет назад 0

2 ответа на вопрос

10
cnst

Есть немного результатов Google, которые фактически приводят к выполнимым решениям, но, согласно https://www.reddit.com/r/firefox/comments/2ps6wg/jsonlz4_bookmark_backups/, кажется, что следующее работает наиболее надежно:

  • в about:config, переключите devtools.chrome.enabledнастройку со значения по умолчанию falseна значениеtrue

  • откройте Scratchpad из Firefox:

    • либо с fn+ Shift+ F4на MacBook,
    • или Shift+ F4,
    • или через строку меню через СервисВеб-разработчикСкретчпад
  • в строке меню в Scratchpad Firefox измените Среду с Контента на Браузер (если пропустить этот шаг, это приведет к ошибкам, как Exception: ReferenceError: OS is not definedна следующем шаге)

  • используйте код вроде следующего в Scratchpad Firefox:

    var file = "/Users/…/sessionstore-backups/recovery.baklz4"; //OS.File.read(file, { compression: "lz4" }).then(bytes =>  // OS.File.writeAtomic(file + ".uncompressed", bytes));  OS.File.read(file, { compression: "lz4" }).then(bytes => { OS.File.writeAtomic(file + ".uncompressed.stringify", JSON.stringify(JSON.parse(new TextDecoder().decode(bytes)),null,1)) }); 

    Последний параметр для JSON.stringifyобработки количества пробелов в каждой строке; установка 0 приводит к тому, что все это печатается в одну строку, а установка 1 правильно разделяет строки (установка 2 создаст слишком много бесполезных пробелов и увеличит размер файла для небольшой выгоды)

  • нажмите Runкнопку

  • запустить fgrep :textarea /Users/…/sessionstore-backups/recovery.baklz4.uncompressed.stringifyиз приложения терминала

6
Bob

К сожалению, из-за нестандартного заголовка стандартные инструменты не будут работать. Есть открытое предложение изменить это. Очевидно, заголовок Mozilla был разработан до появления стандартного формата фрейма lz4; он оборачивает стандартный блок lz4.

Тем не менее, тот же отчет об ошибке включает в себя несколько альтернативных методов. Я кратко перечислю их:

  • Используйте инструмент dejsonlz4, который включает в себя двоичные сборки для Windows и должен быть прост в сборке на * nix
    • lz4json - аналогичный инструмент, но он опирается на внешнюю liblz4 и его несколько проще собрать на * nix, но сложнее на Windows (за пределами WSL)
  • Используйте этот довольно простой скрипт Python: https://gist.github.com/Tblue/62ff47bef7f894e92ed5 (требуется пакет lz4 через pip или менеджер пакетов) - скрипт выглядит как python3, но его легко адаптировать к python2
  • Существует веб-расширение, которое должно быть в состоянии открыть их. NB: хотя источник доступен, я не проверял его, и запрашиваемые им разрешения немного касаются ( особенно ответа на вопросы )
  • Теоретически, вы должны быть в состоянии удалить первые 8 байтов (например, с помощью dd if=original.jsonlz4 of=stripped.lz4 bs=8 skip=1), и это должно оставить вас с действительным блоком lz4. Обратите внимание, что это отличается от кадра lz4 . В то время как большинство языков программирования имеют библиотеки, которые могут легко декодировать блок, найти предварительно собранный инструмент для этого сложнее, например, liblz4-toolпакет принимает только формат кадра.

Похожие вопросы