Найти - Пользователи
Полная версия: Нужно вскрыть файл в формате .sav от движка Ren'Py
Начало » Центр помощи » Нужно вскрыть файл в формате .sav от движка Ren'Py
1 2
prisrak_razyma
Здравствуйте. У меня появилась сумасшедшая идея вскрыть сохранения Ren'Py. Сунулся и нечего понять не могу с какого края подступится. Сразу оговорюсь мне нужен метод шифровки и дешифровки, так как мне очень интересно как это работает(хранит перемеренные в защищённом виде)
JOHN_16
https://github.com/renpy/renpy/blob/9b76083a7812def93b131347a67af6574be83799/renpy/loadsave.py#L50
кажется что они вовсе не защищенные
prisrak_razyma
Нет,не получается, использую вот эти способы
         cPickle.loads(s)
        pickle.loads(s)
из функции
 def loads(s):
    if renpy.config.use_cpickle:
        return cPickle.loads(s)
    else:
        return pickle.loads(s)
выдаёт ошибку на оба способа:
TypeError: a bytes-like object is required, not ‘_io.BufferedReader’
py.user.next
Надо метод load() использовать.
prisrak_razyma
Последовал вашему совету вот код
 import pickle
import _pickle as cpickle
from json import dumps as json_dumps
f = open('auto-1-LT1.save','rb')
q=cpickle.load(f)
Выдаёт ошибку:
_pickle.UnpicklingError: A load persistent id instruction was encountered,
but no persistent_load function was specified.
На такой код:
 f = open('auto-1-LT1.save','r')
q=pickle.load(f)
Выдаёт ошибку:
File “G:\piton\lib\encodings\cp1251.py”, line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)
UnicodeDecodeError: ‘charmap’ codec can't decode byte 0x98 in position 207: character maps to <undefined>

py.user.next
prisrak_razyma
_pickle.UnpicklingError: A load persistent id instruction was encountered,
but no persistent_load function was specified.
Тебе надо создать свой Unpickler и там переопределить метод persistent_load().
python.org. Unpickler example
prisrak_razyma
А можно для чайника. Как это сделать?

py.user.next
prisrak_razyma
А можно для чайника. Как это сделать?
Я так понял, что ты не знаешь, что значит “переопределить метод класса”, скорее даже так “переопределить?”, “метод?”, “класса?”.

Пример, что я привёл с сайта python.org, очень ясный: вместо того, чтобы сериализовать базу данных, он берёт объект и сериализует только небольшую часть информации, по которой потом при десериализации можно будет получить правильно доступ к базе и восстановить данные из неё. Так миллион записей из базы остаётся в базе, а в файл сериализации идёт небольшой ключ доступа к миллиону записей.

Так что, видимо, твой sav-файл был получен точно так же, с сериализацией таких ключей доступа. И чтобы его восстановить обратно, нужно на эти объекты реагировать методом persistent_load(), так как внутри sav-файла они помечены как хранящие не сами данные, а такие небольшие по объёму ключи доступа к данным.

Так как ты метод такой не определил (используешь базовый десериализатор), то оно тебе и говорит “вижу объект с ключом внутри, распаковать обратно его нечем”.
prisrak_razyma
py.user.next
Что значит “переопределить метод класса”. Я знаю, но не понимаю как это сделать.
Скорей всего ты не прав, потому что я пользуюсь сайтом http://www.saveeditonline.com/ и он показывает все переменные. Плюс если перенести сейв то он будет работать и у другого человека.
Либо я что-то не понимаю.
py.user.next
prisrak_razyma
Что значит “переопределить метод класса”. Я знаю, но не понимаю как это сделать.
Ну скажи, что не понимаешь. Я сомневаюсь, что ты понимаешь, потому что ты метод load() не смог отличить от метода loads(), а ведь это вещь элементарная. Потом ты пишешь, что пример тебе непонятен, а он вообще для новичков даже подходит, там всё как на ладони.

prisrak_razyma
и он показывает все переменные
prisrak_razyma
Плюс если перенести сейв то он будет работать и у другого человека.
Так оно у него воспроизводится, а ведёт куда-то на внутренние данные в программе, которые у всех лежат одинаковыми. Если они одинаковые, их не надо сериализовать, достаточно ссылки.

prisrak_razyma
 _pickle.UnpicklingError: A load persistent id instruction was encountered
Оно не может тебе просто так с потолка выбросить исключение такое. Оно видит инструкцию внутри файла и начинает выполнять действия, а для них нужна функция, а по умолчанию её нет. А её нет почему? Потому что ты используешь load() не у того объекта. Обычный объект работает без всяких ссылок, воспринимая всё как прямые данные.

prisrak_razyma
Я знаю, но не понимаю как это сделать.
Сделай заглушку, но для этого надо переопределить метод класса, а ты не знаешь, как это делать. Если бы ты хоть одну книжку прочитал или даже пролистал, то ты бы знал, как это делать, что это и где.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB