Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 23, 2017 19:38:40

prisrak_razyma
Зарегистрирован: 2017-07-31
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужно вскрыть файл в формате .sav от движка Ren'Py

Здравствуйте. У меня появилась сумасшедшая идея вскрыть сохранения Ren'Py. Сунулся и нечего понять не могу с какого края подступится. Сразу оговорюсь мне нужен метод шифровки и дешифровки, так как мне очень интересно как это работает(хранит перемеренные в защищённом виде)



Да славится Ктулху. Великий бог программистов.Повелитель багов и ошибок.

Офлайн

#2 Авг. 23, 2017 21:05:54

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Нужно вскрыть файл в формате .sav от движка Ren'Py

https://github.com/renpy/renpy/blob/9b76083a7812def93b131347a67af6574be83799/renpy/loadsave.py#L50
кажется что они вовсе не защищенные



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Авг. 23, 2017 21:40:30

prisrak_razyma
Зарегистрирован: 2017-07-31
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужно вскрыть файл в формате .sav от движка Ren'Py

Нет,не получается, использую вот эти способы

         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’



Да славится Ктулху. Великий бог программистов.Повелитель багов и ошибок.

Отредактировано prisrak_razyma (Авг. 23, 2017 21:48:16)

Офлайн

#4 Авг. 24, 2017 01:45:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9895
Репутация: +  854  -
Профиль   Отправить e-mail  

Нужно вскрыть файл в формате .sav от движка Ren'Py

Надо метод load() использовать.



Офлайн

#5 Авг. 24, 2017 09:14:17

prisrak_razyma
Зарегистрирован: 2017-07-31
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужно вскрыть файл в формате .sav от движка Ren'Py

Последовал вашему совету вот код

 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>



Да славится Ктулху. Великий бог программистов.Повелитель багов и ошибок.

Офлайн

#6 Авг. 24, 2017 09:42:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9895
Репутация: +  854  -
Профиль   Отправить e-mail  

Нужно вскрыть файл в формате .sav от движка Ren'Py

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



Отредактировано py.user.next (Авг. 24, 2017 09:42:30)

Офлайн

#7 Авг. 24, 2017 11:33:24

prisrak_razyma
Зарегистрирован: 2017-07-31
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужно вскрыть файл в формате .sav от движка Ren'Py

А можно для чайника. Как это сделать?



Да славится Ктулху. Великий бог программистов.Повелитель багов и ошибок.

Офлайн

#8 Авг. 24, 2017 12:15:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9895
Репутация: +  854  -
Профиль   Отправить e-mail  

Нужно вскрыть файл в формате .sav от движка Ren'Py

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

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

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

Так как ты метод такой не определил (используешь базовый десериализатор), то оно тебе и говорит “вижу объект с ключом внутри, распаковать обратно его нечем”.



Отредактировано py.user.next (Авг. 24, 2017 12:17:50)

Офлайн

#9 Авг. 24, 2017 12:50:57

prisrak_razyma
Зарегистрирован: 2017-07-31
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужно вскрыть файл в формате .sav от движка Ren'Py

py.user.next
Что значит “переопределить метод класса”. Я знаю, но не понимаю как это сделать.
Скорей всего ты не прав, потому что я пользуюсь сайтом http://www.saveeditonline.com/ и он показывает все переменные. Плюс если перенести сейв то он будет работать и у другого человека.
Либо я что-то не понимаю.



Да славится Ктулху. Великий бог программистов.Повелитель багов и ошибок.

Отредактировано prisrak_razyma (Авг. 24, 2017 12:56:52)

Офлайн

#10 Авг. 24, 2017 13:16:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9895
Репутация: +  854  -
Профиль   Отправить e-mail  

Нужно вскрыть файл в формате .sav от движка Ren'Py

prisrak_razyma
Что значит “переопределить метод класса”. Я знаю, но не понимаю как это сделать.
Ну скажи, что не понимаешь. Я сомневаюсь, что ты понимаешь, потому что ты метод load() не смог отличить от метода loads(), а ведь это вещь элементарная. Потом ты пишешь, что пример тебе непонятен, а он вообще для новичков даже подходит, там всё как на ладони.

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

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

prisrak_razyma
Я знаю, но не понимаю как это сделать.
Сделай заглушку, но для этого надо переопределить метод класса, а ты не знаешь, как это делать. Если бы ты хоть одну книжку прочитал или даже пролистал, то ты бы знал, как это делать, что это и где.



Отредактировано py.user.next (Авг. 24, 2017 13:21:39)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version