Pull to refresh

Игра «Terraria» и её «хорошая» система шифрования профайлов

Reading time3 min
Views14K
Как-то на днях я сидел и готовился к предстоящему экзамену. Но одногруппник же хотел, чтобы я его завалил. Зная, что я «падкий» на игры в стиле Minecraft, он скинул мне игру Terraria. Вначале интерес к ней зашкаливал, но чуть позже, из-за «убогости» на мой взгляд одиночной игры, он упал, и я решил поиграть в мультиплеер, где и была обнаружена интересная особенность: все добытые в одиночной игре вещи, были у меня в инвентаре даже на различных серверах в мультиплеере. Это и натолкнуло меня на мысль набрать в инвентарь по-больше «крутых» вещей. Как это было достигнуто — под катом.

Первые попытки

Сначала файл с данными пользователя был скормлен WinHex'у и получен от него следующий результат:



Отсюда не виден никакой простой путь «расшифровать» данный файл.
Поэтому был задействован ProcessMonitor от SYSInternals. Он показал, что используется библиотека bcrypt.dll для шифрования пользовательского файла. Почитав об этой библиотеке и алгоритме, который она использует, стало понятно, что без ключа мне файл не расшифровать. Поэтому было принято решение дизассемблировать файл Terraria.exe. Ну, думаю, хоть ассемблерный код более менее прольёт свет на это. Хотел взять IDA Pro Advanced 6.1 и орудовать им, но меня вовремя остановили и ткнули носом в то, что сама игруля-то написана на .Net, что позволяет более качественно получить код программы. Всё таки CIL разбирать проще, чем ассемблерный код.
Поэтому, ища руководства для сего действия, я прочитал эту статью от avaver. К счастью на компьютере была установлена Visual Studio 2010, где и были необходимые ilasm.exe и ildasm.exe,
Руководствуюсь этой статьёй, вбил в командную строку (открытую через пункт в меню «Пуск» из группы MS Visual Studio) это:

ildasm.exe Terraria.exe /source /out:Terraria.il

Получив довольно понятный код на CIL мной были найдены методы Player::EncryptFile и Player::DecryptFile. Исследование их и контекста их использования показали, как проходит процедура загрузки/сохранения пользовательских данных.

Считывание данных при загрузке происходит по следующему алгоритму:
  1. Сначала файл player1.plr расшифровывается в player1.plr.dat
  2. Далее считываются данные из player1.plr.dat и записываются в оперативную память (размер файлов <1КБ )
  3. После сих действий файл player1.plr.dat удаляется.

Процедура записи данных происходит аналогично в обратном порядке:
  1. Запись данных из оперативной памяти в player1.plr.dat
  2. Шифрование player1.plr.dat в player1.plr
  3. Удаление player1.plr.dat


Смотря на такой алгоритм, становится понятно, что все «вкусняшки» содержатся в файле player1.plr.dat. Но, к сожалению, все действия с ним происходят настолько быстро, что его даже не успеваешь заметить в «Проводнике». И тогда в исходниках была обнаружена функция, которая удаляет данный файл. Закомментировав данную функцию и пересобрав файл, цель была достигнута.
Кстати говоря, для пересборки файла была введена следующая команда в ещё запущенную консоль:

ilasm.exe Terraria.il /exe /out:Terraria.exe

Отлично, после запуска игры, файл player1.plr.dat наконец-то в моих руках.
Как и ожидалось, в нём все вкусняшки:



Использование в своих целях

Ну хорошо, файл мы получили, а теперь попробуем с ним разобраться.
Понял я там далеко не всё, но вот то, что я понял:



Так как это пользовательский файл, то он содержит данные о пользователе: сначала длина ника (красным), затем сам ник (зелёным). Далее идёт «здоровье» персонажа на момент выхода из игры (розовым) и вообще максимальное значение здоровья (коричневым).

После этого идёт информация об «экипировке» персонажа, его «аксессуарах» и само содержимое инвентаря, которое описывается таким образом:
  • Сначала длина в байтах названия предмета (красным)
  • Затем само название (зелёным). Кстати, это название можно просто скопировать с официального вики-проекта
  • После этого количество единиц данного предмета (оранжевым)
  • И в конце отступ 3 нулевых байта до следующего элемента инвентаря (голубым)

Если же в инвентаре присутствуют несколько (n) свободных клеток, то вставляется n*5 нулевых байт (это длина названия, равная нулю + кол-во предметов, тоже 0 + отступ 3 нулевых байта).
Но нам же нужно не только «прочитать» файл, но и применить в своих целях. Для этого просто был закомментирован вызов процедуры, которая расшифровывает исходный файл player1.plr и перезаписывает player1.plr.dat. Таким образом считывание всегда происходит из файла player1.plr.dat и он не удаляется. Поэтому мы можем вносить в него изменения, не беспокоясь за оригинальный player1.plr — он нам картину не испортит.

Заключение

Как видно из моих скринов, я себе наделал «крутых вещиц» и поиграл с ними в мультиплеере. Но это быстро наскучило, и интерес к игре иссяк полностью. Подготовка к экзамену продолжается!
Tags:
Hubs:
Total votes 97: ↑82 and ↓15+67
Comments60

Articles