Реализовать распаковку и запаковку pickle-файлов

10 000 руб. за проект
30 августа 2021, 16:49 • 4 отклика • 56 просмотров
Здравствуй, добрый человек!

В обработку поступает пикл-файл (преимущественно 2 прото-версии, но также 3, 4), в котором запиклены как и простые типы/структуры данных (словари, множества и так далее) так и классы/модули из пользовательского пространства (Они не существуют в текущем окружении).

Необходимо расдампить содержимое файла (при этом не доставлять/не импортировать или самостоятельно не описывать пользовательские классы или модули) а создавать «виртуальные» классы и модули, которые мимикрируют под оригинал.


Например - импортируется некий `from foo.bar import Baz`, мы дампим его арги/кварги и стейт в собственный класс, запоминания имя и путь. То что нужно делается тут https://github.com/CensoredUsername/picklemagic, но есть еще объекты с `append` или `setitems` (foo[«bar»] = «bar»), но думаю тут можно вполне сделать класс умеющие сохранять значения этих операций.


В дальнейшем предполагается пропустить полученный слепок через обработчик (например https://jsonpickle.github.io/) чтобы отобразить содержимое в json.


Если попробовать схематически расписать флоу, то оно выглядит примерно так:

- загружаем модуль (попутно фейками неимпортируемые объекты)

- перегоняем весь модуль в жсон

- полученный жсон загружаем обратно в модуль

  • модуль дампим обратно (в ту же версию прото, какая была при загрузке)

Пару важных ключевых моментов

  • в дампах нет «хитрых» типов ака функции, лямбды
  • воссоздание модуля из жсона или запись модуль в пикл происходит в другом процессе и доступа к памяти при распикливании нет.
  • пикл после всей машинерии обязан быть эквивалентен (при условии что жсон не модифицировали конечно же)


Проверка будет происходить путем загрузки пикл-дампа, его инспекции через `pickletools` и сравнение репорта с выводом в жсон.
При успехе жсон пакуется обратно и побайтово сравниваем с оригиналом (это не должно быть проблемой, так как это делает питон и при наличии правильных фейковых классов все аккуратно запакуется обратно)


UPD: с такой историей могли столкнуться, к примеру, те кто работает с `renpy` и декодирует файлы игры и файлы сохранений.