Когда-то раньше я рассказывал о плагине
SaveGame Deemer, позволяющем получить расшифрованный вариант сохранения, чтобы стало возможным его дальнейшее редактирование и загрузка. На этот раз я хочу продемонстрировать не плагин, а целую программу, которая позволяет расшифровывать и зашифровывать обратно сохранение без посторонней помощи и при этом по возможностям практически не уступает плагину SaveGame Deemer. Редактировать сейв с помощью SED в некоторой степени стало намного проще т.к. запускать игру каждый раз для проделывания различных манипуляций вам не придется. Однако эта малоизвестная программа была разработана японцем, и поэтому язык в ней соответствующий, но не волнуйтесь – я перевёл её на английский язык.
Скачать программу для PSP: sed.rar (English)
Скачать оригинал для PSP: SaveDataE-D_cn.rar (China)
Альтернатива для PC: PSP.SaveData.Encrypter.Decrypter.GUI-LMAN.rar
Порт SED для PC: PSP Savedata En-Decrypter on PC by proxima.zip
Преимущества SED перед SaveGame Deemer
• Удобство использования: вам не придется каждый раз прибегать к запуску игры для того, чтобы получить расшифрованный сейв или чтобы загрузить модифицированный – всё это делается в данной программе.
• Старый добрый графический интерфейс, выполненный в стиле
Sony
• Нет путаницы при присвоении имени расшифрованного сохранения в отличии
SaveGame Deemer, который иногда присваивал только регион игры без номера сейва.
• Считывает PARAMS.SFO, игнорируя при этом защиту и переделывает его как нужно.
Недостатки SED перед SaveGame Deemer
• Программа предоставлена только на японском языке (но на данный момент я эту ситуацию исправил)
• Японский стиль управления, а именно смена клавиш местами
X/О перемешивается со стандартным стилем (в диалогах используется стиль управления по умолчанию).
Перед тем, как продолжить...
Хочу сразу сказать то, что у меня не было никакой возможности найти интересную информацию о программе
SED, по какой логике она работает, а также дельную информацию о структуре сейвов. Выводы сделал за счет огромного количества проб и ошибок, поэтому алгоритм работы может быть описан в некоторой степени неверно или кое-что мог упустить. Так же заранее предполагается, что вы знаете, как найти регион от сейва и имеете представления, что такое HEX редактор, как им пользоваться, а также знаете типы данных.
Кроме того хотел бы поблагодарить cooler.nvkz из форума 4pda.
Без него я бы не наткнулся на такую диковинку и вряд ли была бы сея статья.
|
Структура PARAM.SFO или самая главная оболочка каждого сейва
Если вы были любопытными и заглядывали в папку с сохранением, то, наверное, замечали, что каждый раз присутствует файл с именем
PARAM (
Packed
ARchive
At
Memory) и с расширением
SFO (
Saved in
FOrmation). Помимо игровой информации он содержит ещё и техническую информацию: что расшифровывать, сколько считывать данных, влияет на алгоритм шифрования, а также наличие чексумм, тем самым сведя на нет любые модификации. Лишь частично изучив его, сравнивая разные
PARAM.SFO с помощью
HEX редактора, я пришёл к такому выводу:
Для удобства представления информации,
Sony распределили данные по разным категориям. Но до объявления этих категорий, они распределили информацию, а именно сколько байтов следует выделить для каждой отдельной категории. Для оптимизации считывания данных, Sony ещё добавила другой параметр, а именно сколько считывать байтов для каждой отдельной категории. Если вы, например, выделили 256 байт для первой категории, а поставили считывать только 64 байта, то первые 64 байта будут считаны, а последние пропустятся (256-64=192 байта будут пропущены) и будет считываться другая категория. Сейчас я постараюсь описать, за что отвечает каждая категория:
1)
CATEGORY – Ему всегда присваивают значение
MS (видимо имеется в виду
Memory
Stick). Скорее всего она поясняет, на каком именно хранилище информации должен храниться сейв.
2)
PARENTAL_LEVEL – Уровень родительского контроля.
3)
SAVEDATA_DETAIL – Обычно здесь кратко описывают сохранение.
4)
SAVEDATA_DIRECTORY – Название папки, где лежат данные сейва. Сделано специально для того, чтобы исключить подмену папки на сейв из чужой игры.
5)
SAVEDATA_FILE_LIST – Список файлов, которые приставка будет расшифровать и загружать. К каждому файлу также приписана чексумма (которые генерируются по неизвестной логике), чтобы исключить подмену этого зашифрованного файла на другой.
6)
SAVEDATA_PARAMS – Хранит важное значение, а именно
PARAMS TYPE (об этом чуть ниже), которое влияет на шифровку и расшифровку данных. Кроме того защищает файл
PARAM.SFO чексуммами, и они генерируются по неизвестной логике.
7)
SAVEDATA_TITLE – Обычно здесь указывают тип информации (system data, game data и так далее).
8)
TITLE – Обычно сюда пишут название игры.
Несмотря на то, что Sony ввели параметр, который отвечает за количество считываемых данных, его реально используют только для этих категорий:
SAVEDATA_DETAIL,
SAVEDATA_DIRECTORY,
SAVEDATA_TITLE и
TITLE. Во всех остальных случаях этот параметр остаётся неизменным.
Способ обхода “законсервированных” данных
Несмотря на то, что Sony хорошо продумала свою систему защиты,
HellCat (автор плагина
SaveGame Deemer) придумал свой способ подхода к ней – просто, при попытке сохраниться/загрузиться, временно приостановить процесс игры и сдампить/подменить данные, которые будут потом “законсервированы”.
Однако
Bluekiller (автор программы
SED) каким-то невероятным способом нашёл формулу генерации ключа, с помощью которой можно расшифровать и шифровать данные из категории
SAVEDATA_FILE_LIST, а также изучил построение чексумм в
PARAMS.SFO, благодаря чему становится возможным изменять “законсервированные” данные напрямую. Формула работы его программы примерно такова:
1) Взять основной ключ игры (
GameKey).
2) Взять переменную
SAVEDATA_PARAMS из файла
PARAMS.SFO (выделено на скриншоте)
3) Потом
GameKey и эта переменная компонуется по неизвестной формуле, получая при этом финальный ключ шифрования.
4) Используя этот ключ расшифровать все файлы из ветки
SAVEDATA_FILE_LIST (выделено на скриншоте)
5) Также можно потом зашифровать все расшифрованные данные обратно. Но при этом вносятся другие чексуммы в
PARAMS.SFO (по неизвестной формуле), чтобы пройти проверку.
Что используется для расшифровки данных:
Не знаю как вы, но после изучения и составления этой формулы я выделил 3 основные данные:
1)
GameKey – основной ключ игры для составления
FinalKey.
2)
PARAMS Type – это переменная
SAVEDATA_PARAMS, которая берётся из файла
PARAM.SFO. Используется для компоновки с
GameKey.
3)
FinalKey – Результат компоновки
GameKey и
PARAMS Type (также, возможно, и других данных) по специальной неизвестной формуле. С помощью этого ключа можно расшифровывать и зашифровывать данные сохранения. Его нужно генерировать каждый раз поновой, так как даже если сохраниться, не внося дополнительных изменений, то зашифрованный вариант будет выглядеть совсем иначе…
Уже можно приступать?
Несмотря на то, что программа умеет расшифровывать и зашифровывать данные, сама она это не сделает до тех пор, пока вы не отыщите специальный ключ для данной игры, по которой идет основа шифрования и дешифровки –
GameKey
Для различных игр всегда используется разный
GameKey, но для одной и той же игры разного региона обычно всегда используют один и тот же
GameKey (в редких случаях разные, как, например, в игре
Pursuit Force). Так же я установил, что этот ключ одинаковый для каждой версии прошивки – даже если ваша прошивка намного ниже необходимого минимума в игре. Хотя из-за этого иногда возникают проблемы с несовместимостью сохранений при обновлении версии модифицированной прошивки, но об этом чуть позже...
Как мы будем искать GameKey?
Размер самого ключа составляет 16 байт, то есть 16 х 8 = 128 битная шифрация, что составляет 2^128 различных комбинаций. А учитывая то, что
GameKey модифицируется параметром
PARAMS Type, то подобрать его методом брута (подбор ключей) - невозможно. Но как всё-таки найти этот
GameKey? Если вспомнить метод работы
SaveGame Deemer, то можно предположить, что сам
GameKey предоставляется только тогда, когда нужно обратиться к сохранению. Именно в этот момент этот основной ключ временно записывается в оперативную память, что позволяет наглым образом “стащить” его. По такому принципу мы и будем находить
GameKey. Всего я нашёл 3 способа дампа ключа:
1) Использовать возможности программы
SED, а именно обыск дампа оперативной памяти.
2) Использовать плагин
SaveGame Deemer, чтобы сдампить дополнительную информацию о структуре сейва, которая содержит так же и ключ.
3) Использовать чит-девайс
FreeCheat, который сразу дампит ключ в отдельный файл, если это возможно.
Первый способ
Сам
SED может найти
GameKey с любого дампа оперативной памяти, который лежит в корне флешки и содержит расширение
DMP. Если вы внимательно прочитали метод обыска, то, наверное, догадались, что дампить память лучше в тот момент, когда вы вызвали штатный диалог сохранения/загрузки сейва от Sony и загрузились/сохранились не выходя из этого диалога или когда четко видите, что игра автоматически сохранила/загрузила данные. Сам дамп памяти можно сделать в любом плагине, представляющий собой чит девайс (например:
CWCheat,
FreeCheat,
CheatMaster Fusion и так далее). Перед поиском дампа нужно выделить такой сейв, который вы пытались или система пыталась сохранить/загрузить.
Пример на игре Exit:
1) Для начала запустим игру. Не забываем перед этим включить чит-девайс (я использовал
CheatMaster Fusion)
2) Пытаемся вызвать диалог сохранения/загрузки от
Sony. Сохраняемся/загружаемся, но при этом не выходя из диалога полностью (не нажимая на кнопку назад после успешной операции)
3) Включаем меню чит-девайса, находим меню дампа памяти и дампим. После этого выходим из игры.
4) Если дамп памяти лежит не в корне флешки, а в отдельной папке с чит-девайсом, то его нужно переместить в корень флешки.
5) Меняем расширение дампа на
DMP, если он представлен в другом расширении
6) Теперь запускаем
SED, выбираем сохранение, которое попытались загрузить/сохранить, открываем меню опций (
Options)>найти GameKey (
Find gamekey)
7) Если дамп лежит в нужном месте, то пойдет процесс поиска и если поиск завершился удачно, то у вас выйдет диалог сохранения ключа.
8) А также диалог удаления дампа – если он не нужен, то удаляем
9) Все! Теперь вы можете расшифровывать, изменять содержимое с помощью
HEX редактора и зашифровывать обратно каждую сохранёнку от этой игры с данным регионом. В моем случае –
Exit с регионом
ULUS10074.
Второй способ
Плагин SaveGame Deemer автоматически дампит, помимо данных сохранения (SDDATA.BIN) и его описания (SDINFO.BIN), еще и дополнительные данные о структуре сейва (Регион_игры.BIN), которая также содержит GameKey. Эти дополнительные данные всегда дампятся при попытке обратиться к сохранению или же при попытке вызова диалога загрузки/сохранения, не зависимо от того, загрузитесь/сохранитесь ли вы или нет. После дампа открыть этот файл нужно HEX редактором и найти ключ можно почти в самом конце файла. Затем нужно перекопировать этот ключ, вставить в отдельный файл, присвоить следующее имя Регион_игры.BIN, зайти в директорию с программой SED и закинуть этот файл в папку gamekey.
Пример на игре Patapon 2:
1) Запускаем игру, не забываем включить перед этим плагин
SaveGame Deemer
2) Игра с самого начала пытается обратиться к сохранению, это отчётливо видно с этого окна.
Тем более заметна долгая загрузка, что свидетельствует о том, что плагин дампит дополнительные данные. А это значит, что можно сразу выйти из игры после того, как игра “поедет” дальше т.к. нужные данные мы раздобыли. Просто вовсе необязательно вызывать диалог сохранения/загрузки данных и тратить на это время.
3) Заходим после этого в PSP\SAVEPLAIN\ и открываем
регион_игры.bin HEX редактором (обычно весит данный файл 1536 байт)
4) Переходим на самый конец файла и копируем ключ, что выделено на скриншоте
5) Создаем новый файл, вставляем ключ
6) Сохраняем в директорию с программой
SED в папку gamekey. Имя файла должно содержать регион игры с расширением bin (можно перекопировать имя с того файла, где вытащили ключ)
7) Все! Теперь вы можете расшифровывать, изменять содержимое с помощью
HEX редактора и зашифровывать обратно каждую сохранёнку от этой игры с данным регионом. В моем случаи –
Patapon 2 с регионом
UCES01177
Третий способ
В плагине
FreeCheat есть частичный функционал плагина
SaveGame Deemer, который позволяет так же сдампить расшифрованный сейв и загружать модифицированный по похожему принципу. Однако кроме этого он дампит еще и ключ в отдельный файл – лишь остается переименовать и перекопировать в директорию с программой
SED в папку gamekey.
Пример на игре Metal Slug Anthology:
1) Запускаем игру, не забываем включить плагин
FreeCheat. Обращаем внимание на то, что плагин
X и
O меняет местами на японский стиль.
2) После запуска заходим в меню чит-плагина (клавиша по умолчанию: нотка). Затем заходим в
MEM Manager > SAVEDATE Manager
3) Переключаемся на
Operate Mode, нажав кнопку вниз. Теперь нажмите круг и поставьте вместо
Disable на
Dump. Подтвердите выбор, снова нажав на круг.
4) Теперь сделайте любые действия с сохранением – пробуйте загрузиться или сохраниться
5) После этого выходим из игры и заходим в папку FreeCheat/SAVEDATA
6) Находим файл с расширением
*.key и переименовываем, убрав тире и поменяв расширение на bin
7) Теперь перемещаем его в директорию с программой
SED в папку gamekey
8) Все! Теперь вы можете расшифровывать, изменять содержимое с помощью HEX редактора и зашифровывать обратно каждую сохранёнку от этой игры с данным регионом. В моем случаи –
Metal Slug Anthology с регионом
ULES00530
Какой способ выбрать – вам решать, но 1 и 3 способ можно выполнить без помощи ПК.
Расшифровка и шифрование сохранений
После того, как вы достали
GameKey, вам полностью открыт доступ к редактированию сохранений к конкретной игре – вы можете расшифровывать данные для редактирования и зашифровать его обратно в сохранёнку. Делается это очень просто – достаточно вызвать меню опций (
Options) и выбрать расшифровку данных (
Decrypt) или шифрование данных обратно (
Encrypt). Расшифрованный вариант будет лежать в корне вашей флешки с присвоенным именем от папки с сохранением и с расширением
*.bin. Этот файл должен лежать здесь с таким же именем, если вы захотите его зашифровать обратно в сейв! В противном случае вы получите сообщение о неудачном шифровании.
Пример расшифровки сейва:
1) Выбираем сейв, который мы хотим расшифровать (предварительно вы уже заполучили
GameKey)
2) После этого откройте меню опций (
Options)>Расшифровать (
Decrypt)
3) Затем пойдет запрос на подтверждение. Если вы ничего не спутали, то продолжаем дальше
4) Если все завершилось успешно, то вы получите такое сообщение
5) Все! Теперь расшифрованный вариант будет лежать в корне флешки. Обращаем внимание на то, что имя файла совпадает с именем папки с сохраненными данными.
Пример шифровки данных обратно в сейв:
1) Допустим, что мы отредактировали расшифрованный вариант как нам нужно. Для начала выбираем такой сейв, который мы до этого расшифровали.
2) После этого откройте меню опций (
Options)>Шифровать (
Encrypt)
3) Затем пойдет запрос на подтверждение. Если вы ничего не спутали, то продолжаем дальше
4) Если найден расшифрованный файл и шифровка этих данных в сейв закончилось успешно, то вы получите такое сообщение
Ошибка 80110306 –“сюрприз” от Sony и как его обойти или пересохранение несовместимой старой сейвки для новой прошивки
Довольно часто встречаемая ошибка, которая связана с сохранениями. Она означает то, что сохранение не прошло проверку подлинности, указывая причину как за повреждение данных. В обычных условиях (т.е. исключая различных модификаций или повреждение карты памяти) происходит тогда, когда ваша прошивка намного ниже необходимого минимума для игры, и вы потом обновились до той, что требовала в оригинале игра (не имеет значения, если прошивка ваше той, что требовала игра).
После некоторых исследований я заметил то, что единственное строгое отличие, из-за которой возникает весь этот неприятный казус – разные значения
PARAMS Type в файле
PARAM.SFO. На старых прошивках (для которой разработчики и не планировали делать игру) и на новых (для которой разработчики планировали создавать игру) он по-разному генерируется (причем значение этой переменной всегда ниже на старой прошивке, для которой игру и не делали). Впрочем, не смотря на это, новая версия прошивки могла бы без проблем его загрузить –
GameKey же каждый раз одинаковый. Но Sony заранее знают, что если игра правильным образом сгенерировала свой PARAMS Type, а на сохранении представлено совершенно другой параметр
PARAMS Type, то смысла загружать его нет – уже видны следы “темных” сил.
Поэтому чтобы обойти Sony’евскую задумку, придется расшифровать данные и зашифровать снова, но только с новым параметром
PARAMS Type, с которым ваша прошивка с данной игрой работает.
Пример на игре Patapon 2:
Повторно (подобный пример с одинаковым результатом был в
SaveGame Deemer) представим такую ситуацию - вы долго сидели на
3.71 M33 и обновляться было лень, но потом случилась “революция” и вам срочно захотелось перейти на новую версию модифицированной прошивки (допустим до
5.00 M33-6). Однако после обновления сохранения от данной игры не загружаются, выдавая сообщение об ошибке, а на старую прошивку ой как не хочется возвращаться…
1) Чтобы исправить эту проблему, необходимо сейв адаптировать под другой
PARAMS Type. Не забываем, что он влияет на финальный ключ, с помощью которого расшифровывается файл, поэтому нужно сначала данные сохранения расшифровать (но перед всеми этими манипуляциями – добудьте сначала
GameKey!).
2) После этого войдите в игру и пробуйте сохраниться. Я переписал свой старый неработоспособный сейв, который пытался загрузить. Сделал я этого для того, чтобы без лишних манипуляций (вручную сменить
PARAMS Type) перейти к следующему шагу
3) Снова запускаем
SED и шифруем данные
4) Все, теперь сохранёнка загружается без проблем
Хочу снова вернуться на 2 шаг и наглядно продемонстрировать, что виной этого казуса является именно разные значения
PARAMS Type.
2) На это раз не будем пересохранять старый сейв, а сохранимся на новый слот.
3) Открываем папку с новым сохранением и открываем файл
PARAM.SFO HEX редактором. Переходим по нужному адресу и копируем значение
PARAMS Type (показано на скриншоте).
4) После этого открываем проблемный сейв и переходим по тому же адресу. Заметьте, что значение
PARAMS Type уже другой
5) Вставляем из буфера значение и сохраняем. На счет защиты PARAM.SFО чексуммами можно не волноваться – программа SED их переделает как нужно.
6) Теперь запускаем
SED и шифруем данные.
7) Все, теперь сохранёнка загружается без проблем
Большинство игр разного региона отличаются в основном тем, что они разного региона, как бы забавно оно не звучало. Поэтому большинство сейвов будут спокойно работать даже на другом регионе и лишь в исключительных случаях придется прибегать к переадаптации сейва под другой регион (как, например, было в игре
Patapon 2 при портировании с японского региона на европейский, но об этом я писал в статье про
SaveGame Deemer).
Сама по себе концепция портирования, по сравнению с плагином
SaveGame Deemer, не изменилась – нужно лишь расшифровать сейв одного региона и затолкать его в другой сейв с другим регионом. Поэтому повторять одно и то же не буду, а лишь продемонстрирую использование другого инструмента.
Пример использования на игре Resistance: Retribution
Представим такую ситуацию – вы играли в палёный русский перевод с японским регионом игры и вас достал этот перевод. Теперь вы прикупили английскую версию игры, но нужно срочно портировать сейв под этот регион…
1) Для начала, как всегда, нужно добыть
GameKey одного и другого региона для данной игры. Большинство разработчиков используют один и тот же
GameKey для разных регионов, но чтобы лишний раз не попасть в исключение – лучше добыть их самим, а не копировать и не переименовывать ключ под другой регион. Кроме того если у вас нет ни одного сейва другого региона, на который нужно перенести данные – обязательно создайте.
2) После того, как вы добыли
GameKey, расшифровываем сохранение, которое хотим портировать. Так же для своего удобства и для оценки шанса вероятности портирования, можно еще расшифровать другой сейв с другим регионом, на который нужно данные перенести.
3) Теперь предстоит переименовать полученный файл на такое имя, которое соответствует папке с сохраненными данными, на который мы хотим перенести данные. Так как я расшифровал оба сейва, то мне не придется рыскать эту папку. Помните про оценку шанса портирования? Сравните размер полученных файлов – если они одинаковые, то шансы увеличиваются. В моём случаи они разные, но это из-за того, что игра экономичным образом записывает данные – заранее, как это делается в большинство играх, она максимальный размер не забивает.
4) Теперь снова запускаем
SED и шифруем расшифрованный вариант на тот сейв, на который мы хотим перенести данные.
5) Все! Теперь проверяем…
Описание меняется почти точно также, как и при использовании плагина
SaveGame Deemer, разве что будет пару отличий:
1) Менять описание мы будем непосредственно в файле
PARAMS.SFO с помощью HEX редактора. Конечно, после его редактирования ваш сейв провалит тест на подлинность, но…
2) Если немного схитрить, а именно запустить
SED, расшифровать данные и сразу зашифровать обратно (не забываем сначала добыть
GameKey!), то он автоматически переделает
PARAMS.SFO как нужно.
Кроме как описания,
PARAMS.SFO еще содержит и техническую информацию - не забывайте об этом! Поэтому если хотите изменить описание, то лучше остальное бездумно не трогать. Описание в
PARAMS.SFO можно найти по следующим адресам, что приведено на схеме чуть ниже.
Если не хотите ориентироваться по схеме, то описание в
PARAMS.SFO можно найти:
1) Краткое описание – почти в самом начале.
2) Тип данных – почти в самом конце.
3) Название игры – в самом конце.
Как и при использовании
SaveGame Deemer, чтобы включить спец. символы, а также символы кириллицы – используйте коды символов из
UTF-8 кодировки. Для этого достаточно будет ввести и сохранить текст в
UTF-8 кодировке и открыть его HEX редактором.
Теперь остается лишь постепенно копировать и вставлять текст в
PARAMS.SFO на нужные места.
Кроме того если вы внимательно прочитали структуру
PARAMS.SFO, то вам еще нужно будет изменить количество считываемых байтов! Желательно выставить не максимальное, а подсчитать и указать реальное количество байтов, которые следует прочитать.
Теперь, после всех модификаций, остаётся лишь сохранить изменения и затем вновь переделать
PARAMS.SFO, расшифровывая и вновь зашифровывая файл с помощью
SED
Все, можно проверять…
На этот раз посвятим самому интересному, на мой взгляд, моменту - читерству. Сразу же скажу, что если вы не видите разницы между 16-ричным и 10-ричными разрядами, плохо представляете HEX редактор, не понимаете, что такое размер данных и для чего это нужно – вам здесь делать абсолютно нечего, ибо с большим трудом и методом огромного количества ошибок вы сможете хотя бы что-то изменить и заставить при этом сохранение работать.
Все-таки каким образом можно читерить в сохранениях? Практически также, как это делается в
CWCheat или в
Artmoney для ПК. Во-первых, вы должны определиться, что вы хотите изменить в сохранении: деньги, предметы, уровень, опыт и так далее. Во-вторых вы не можете наугад менять данные, не зная, что вы меняете вообще, поэтому нужно отсеивать данные. Для начала сделайте первое расшифрованное сохранение, измените интересующее вас значение в игре (старясь не менять другие), сохранитесь и снова расшифруйте сохранение. Только не пересохраните первый вариант во время расшифровки т.к. вы будете их сравнивать через HEX редактор. Такой метод отсеивания можно не применять, если вы находите крупные данные (например: 35235322$) т.к. маловероятно, что при поиске такого значения вы найдете что-то подобное, но и это не исключено.
Кроме того во время поиска таких крупных данных не забывайте, что нужно указать размер данных (если это можно на вашем HEX редакторе), а также определиться, используется ли знак (отрицательные значения) или нет. В-третьих нужно убедится, что разработчики не придумали свою самодельную систему защиты. То есть если Sony защищает сохранения всякими чексуммами и шифровкой, то и в расшифрованном варианте есть проверка некоторых данных на чексумму или другая защита, не позволяющая за просто так модифицировать и расшифрованный вариант. В этом случаи вам поможет лишь различные знания всяких уловок, хитростей, метод отсеивания, сравнения и усердное исследование.
Пример на игре Ragdoll Cannon
Довольна интересная homebrew игра с забавным геймплеем, но ещё и с продуманной защитой от читерских плагинов не дающий за просто так читерить в этой игре. Использует штатные методы сохранения от Sony и поэтому мы вставим измененные данные ещё до запуска игры…
1) Но сначала, как всегда, нужно добыть
GameKey.
2) Теперь расшифровываем сейв…
3) Чтобы не стереть на будущее расшифрованный сейв, переименовываем расшифрованный вариант.
4) Допустим, что хотим изменить количество выстрелов, счёт и текущий уровнь. Сначала смотрим начальные данные…
5) Проходим один уровень (игра сохраняется автоматически), отмечаем, что изменилось…
6) Снова расшифровываем сейв
7) И сравниваем их между собой
8) Заметно 3 отличия. Первое отличие – явно номер уровня, на котором остановились (если отчёт брать от нуля). Второе отличие – явно количество сделанных выстрелов. Третье отличие – Total Score. Теперь нужно определить размер данных т.е. сколько байтов выделено для хранения каждого раздела. Стоит обратить внимание, что одним байтом очки выше чем 255 не запишешь (2^8 бит=256 различных комбинаций), поэтому там явно используется хотя бы 2 байта (2^16 бит=65536 различных комбинаций). Также если посмотреть расстояние между 1 и 2 отличием, то можно предположить, что для их хранения выделяется 4 байта, а следовательно и набранному счёту выделено 4 байта. Теперь нужно определить, кодируется ли числа со знаком - signed (т.е. используется ли отрицательное число) или нет. Если приглядеться к 3 отличию, то можно заметить FFFFFFFF. Обычно его используют не для кодирования максимально возможного числа, а для кодирования числа -1.
На игровых скриншотах явно было заметно, что Best Score ничему не равнялся, а обычно -1 используют для того, когда какое-либо достижение нужно отключить т.к. оно не достигнуто. Значит, предположим, что именно здесь и хранится Best Score. Если для этого используют число со знаком, то и для Total Score будет использоваться тоже самое. Скорее всего, разработчики не заботились об оптимизации игры, и поэтому для количества выстрелов и для номера уровня будет использоваться опять значение со знаком. Но эти рассуждения нужно ещё проверить на практике – изменим текущий уровень на 26 (счёт идёт от нуля), количество сделанных выстрелов на 25, Total Score на 25, Best Score на 26.
9) Сохраняем изменения, запускаем SED и шифруем измененные данные в сейв.
10) Проверяем…
Пример на игре Полиция Майами: отдел нравов
Практически действовать будем так же, как и на прошлом примере, только на этот раз игра преподнесет маленький сюрприз…
1) Как и в прошлый раз, добываем
GameKey, расшифровываем интересующий сейв и переименовываем расшифрованный вариант.
2) Допустим, что захотели изменить количество наличных. Смотрим начальные данные.
3) Тратим деньги (в своём примере купил автомат), отмечаем, что изменилось.
4) Сохраняемся и расшифровываем этот сейв.
5) Теперь сравниваем данные
6) Здесь заметно 3 отличия. Из них второе отличие – явно количество наличных т.к. если перевести их в десятичный вид, то получим 9FDE=40926 и 8C56=35926 (обращаем внимание, что байты перевернуты). Третье отличие – явно показывает наличие автомата, но так как оружие в игре можно и модернизировать, то, скорее всего, нулевое значение значится как отсутствие пушки, а значение больше нуля показывает его уровень модернизации. Но вот за что отвечает 1 отличие? Если все-таки это проигнорировать и подсунуть ему модифицированный вариант зашифрованного сохранения, то при попытке его загрузить получаем вот это:
7) Данные правильно перемодифицированы, но почему произошла такая ошибка? Сначала вспомним, что означает код ошибки
80110306 – провал проверки подлинности при проверки сохранёнки. Если это действительно произошло из-за корявой шифрации данных или при неверном модифицировании
PARAMS.SFO, то его вообще нельзя было бы загрузить и вместо содержимого сразу бы отображались как за поврежденные данные, но тем не менее сейв нормально отображается и система предоставляет возможность его загрузить. Значит все-таки первое отличие неспроста – не забыли, что разработчики могут придумать самодельную систему защиты для проверки расшифрованного варианта? Больше всего первое отличие похоже на чексумму, а после неё лишь идут реальные сохраненные данные. Проверим, открыв оригинальный файл и сгенерировав всевозможные чексуммы в выделенной области (если ваш HEX редактор такое не поддерживает, то придется создать новый файл и сюда вставить выделенные данные). Выделять будем все, кроме первой строки с записанной защитой.
Стоит обратить внимание на то, что показано на скриншоте – чексумма, сгенерированная методом генерации
MD5, совпадает с той, что записано в файле. Теперь понятно, как можно обойти защиту и загрузить модифицированные данные - достаточно будет заново сгенерировать
MD5 чексумму после модификации и записать её в файл.
Сначала изменим количество наличных до максимально возможных с учётом того, что там используется значения со знаком (хотя мне не понятно, зачем разработчики включили отрицательные значения для денег, когда в долги невозможно уйти). Байтов для кодирования используется 4 т.к. 1 байт очень мало, 2 байта не слишком много, а 4 байта – сполна хватает для хранения больших денег. Так как значение со знаком, то максимальное положительное число (((2^32 бит)/2)-1)=2147483647, а максимально отрицательное ((2^32 бит)/2)=2147483648. Положительное число меньше всегда на единицу – это вызвано тем, что нужно ещё закодировать нейтральную цифру нуль. Также в качестве бонуса увеличу уровень модернизации купленного автомата. Разработчики явно не задумывались об оптимизации и для хранения о текущем уровне используют опять 4 байта и снова со знаком! Только зачем, если уровень всё равно нельзя повысить выше чем 4 и при этом там не бывает отрицательных значений вообще? Ну ладно, закроем глаза на их причуды и выставим максимальное значение: 2147483647.
8) Теперь сохраняем изменения, зашифровываем в сейв и проверяем…
На этот раз статья заканчивается, но напоследок
Забавные случаи с GameKey
Не смотря на то, что
GameKey используется для шифрации и расшифровки данных, некоторые разработчики любят оставлять здесь свои пасхалки или просто удивляют своим подходом к сгенерированному ключу.
Resistance: Retribution
Разработчики этот игры используют самый “наисложнейший” ключ
Metal Slug Anthology
В ключе отчетливо видна фраза
TriROCKSc. Явно случайным методом такой ключ не составишь…
Patapon 2
Если попытаться открыть этот файл, выставив японскую кодировку текста Shift-JIS, то можно заметить довольно странную формулу...