Универсальный UnWrapper для игр.
В последнее время очень популярными стали небольшие логические игры от Reflexive, Alawar, LoloGames, NevoSoft и др. Объясняется это, на мой взгляд, тем, что игрушки эти относительно небольшие, что позволяет скачивать их большому количеству пользователей, порой даже интересные, а так же они являются хорошим способом убить время, сидя дома, а особенно на работе

И, конечно, компании не просто так распространяют свои игры, а хотят за это денег (пусть и небольших, но порой быстрее найти кряк для игры, чем возится с ее покупкой). Вам предлагают заплатить за игру и получить серийный номер, иначе вы не сможете играть больше отведенного триального времени. В играх от Reflexive это 60 минут, от Alawar – 30 минут.
Сегодня мы попробуем взломать некоторые из этих игрушек, а также написать для них универсальный кряк. Практически все эти игры используют для защиты, так называемый wrapper. Под эти словом подразумевается программа, которая из себя запускает одну или несколько других программ. В данном случае, имеется файл игры (.rwg – в Reflexive, .wrp или .wrp.exe – в Alawar), который специально поврежден и при обычном запуске выдает ошибку или просто не запускается. Wrapper запускает этот файл и уже в памяти восстанавливает байты необходимые для работоспособности файла. Для того, чтобы убрать этот wrapper совсем, оставив только саму игру, нам нужно узнать куда и какие байты записываются.
Reflexive.
Начнем с игр от Reflexive. В примере будет использована игра Astrobatics, но вы можете взять любую другую (т.к. принцип один и тот же) или вообще ничего не брать, а просто посмотреть, что у меня получилось ;)
И так берем отладчик (я взял OllyDbg) и запускаем из под него Astrobatics.exe. Ставим бряк на CreateProcess, т.к. именно эта функция используется для запуска файла игры:
bp CreateProcessA
Нажимаем F9 (Debug>Run) появляется окно для запуска игры, где показано сколько нам осталось играть. Кстати забыл сказать, что для успешного взлома у Вас должна остаться хотя бы минута времени

, если время совсем не осталось до придется пропатчить wrapper, про это я расскажу чуть позже.
И так нажимаем “Play Game” и оказываемся в отладчике. Нажимаем Ctrl-F9 (Debug>Execute till return) пока не окажемся в основном модуле (в строке заголовка должно быть написано “module Astrobat”). Тут видим, что открывается процесс (OpenProcess) и из него читаются данные (ReadProcessMemory). Трейсим программу по F8 до ReadMemory попутно запоминаем/записываем адрес буфера (Buffer), куда читаются данные, и размер буфера (BytesToRead). У меня Buffer = 0A30910, а BytesToRead = 3C. Теперь откроем буфер в дампе:
d 0A30910
Сейчас можно выделить это дело от 0A30910 до 0A30910+3C и куда-нибудь скопировать, чтобы потом по этим данным найти место в файле куда пишутся данные, но это делать не обязательно, т.к. адрес в файле можно было увидеть выше (pBaseAddress) хотя и его запоминать не обязательно, т.к. данные записываются с точки входа (EntryPoint).
Дальше по коду идет расшифровка прочитанных байт. Это все можно пропустить и поставить бряк на функцию записи в процесс (WriteProcessMemory), которая находится чуть ниже. Теперь жмем F9 (Debug>Run), проходим WriteProcessMemory и видим в нашем буфере (0A30910) уже расшифрованные данные, те самые, которые мы должны записать в файл. Выделяем их в дампе от 0A30910 до 0A30910+3C и копируем (Binary>Binary Copy). Теперь можно используя любой HEX-редактор открыть наш .RWG-файл, начиная с точки входа записать эти данные. А можно прямо здесь, используя OllyDbg: после того как скопировали буфер, открываем в отладчике .RWG-файл, после загрузки курсор должен стоять на точке входа, если в настройках не указано иное. У меня он равен 491AB4, переходим по этому адресу в дампе:
d 491AB4
Выделяем байты от 491AB4 до 491AB4+3C (размер данных) и вставляем то, что было скопировано (Binary>Binary Paste). Теперь нужно это дело сохранить – в контекстном меню дампа, выбираем “Copy to executable file” откроется наш файл, там в контекстном меню выбираем “Save File” и сохраняем его под новым именем например Astrobatics_new.exe. Теперь если все сделано верно, игра должна работать

и тогда можно удалить старый .EXE и .RWG. Кстати, в отличие от официально зарегистрированной игры в нашей не открывается окошко после выхода ;)
Можно взломать проще пропатчив 2 байта в самом wrapper’е, там где проверка на регистрацию. Открываете оригинальный .EXE в любом HEX-редакторе и ищите последовательность байт:
84 C0 74 0E 8B CE
Что соответствует командам:
test eax,eax
je XXXXXXXX
mov ecx,esi
Заменяем это на
84 C0 90 90 8B CE
Т.е. убираем переход. Должно работать, правда теперь после закрытия игры Вы будете лицезреть окошко с благодарностями за регистрацию
Как реализовать данный unwrapper в программе Вы можете увидеть обратившись к исходникам в конце статьи.
Alawar.
Теперь возьмемся за игры от Alawar. Я буду ковырять игру «Маленькие бомберы возвращаются», принцип тот же самый, правда wrapper защищен ASProtect’ом и не поддается автораспаковщику Stripper. Ну что же, снимем дамп с запущенного игрового файла (.WRP или .WRP.EXE) и будем сравнивать с оригиналом. Начнем сравнение с точки входа, точка входа у дампа переместилась несколько ниже, чем у оригинала и содержит следующие команды:
push XXXXXXXX; у меня push 004C22F0
ret
Программа при запуске сразу же переходит по адресу XXXXXXXX, скорее всего, это оригинальная точка входа. Не будем добавлять переход в .WRP-файл, а просто изменим точку входа на адрес XXXXXXXX отняв ImageBase и посмотрим что получится (в моем случае 4C22F0-400000=C22F0). EntryPoint можно поменять например утилитой PETools. Вуаля, игровой файл запустился!!! (если конечно Вы все правильно сделали и принцип зашиты не поменялся). Вот и вся защита

Теперь можно файл .WRP переименовать в .EXE, а старый .EXE удалить. Кстати, alawar’ские игрушки хранят информацию о том, сколько Вам осталось играть в реестре. В ветви [HKCU\Software\Aent Sys\pr\], содержатся разделы с названиями игр (только без гласных букв и на английском языке), например игра «Маленькие бомберы возвращаются» сохраняет время в разделе “lttlbmbrsrtrns”. Дальше идет подраздел из шести цифр (обычно «200711» или «200802», наверное, это год и месяц выпуска/изменения защиты), в котором содержится DWORD-параметр “Program”, он то и содержит оставшееся время в миллисекундах

С самого начала он равен 1800000, т.е. 1800000/1000/60 = 30 минут. Допустим мы хотим поиграть месяц

30*24*60 = 43200 минут, 43200*60*1000 = 2592000000 ставим это десятичное значение и играем месяц ;). Максимально можно поставить шестнадцатеричное значение 0xFFFFFFFF, после этого будет написано 0 минут, но кнопка «Играть» будет активна.
NevoSoft.
Ну что же, теперь рассмотрим игры от NevoSoft, я взял “Legends of Pirates”. Здесь все довольно просто. Сама игра находится в папке “game” все остальное, то что снаружи, это файлы наг-скрина и «защиты». Файл игры называется game.dll и находится в папке “game”, если переименовать его в .EXE можно увидеть значок игры, а также увидеть что файл не запускается

Теперь переименуем обратно и запустим игру. Посмотрим, что у нас в процессах. Помимо самой игры “legends_of_pirates.exe” в процессах появился файл “game\smssrv~1.dll”. Зайдем в папку “game” и скопируем этот файл с другим именем (если Вы не видите этот файл, скорее всего у Вас отключен просмотр скрытых файлов), например, “game.exe” и уберем из атрибутов файла свойство «Скрытый». Завершим основной процесс игры и попробуем запустить наш новый файл “game.exe” – он должен удачно запуститься. Как видите защита от NevoSoft просто копирует файл “game.dll”, ставит файлу атрибут «Скрытый» (для более лучшей «защищенности»

) и патчит его прямо на диске, а потом запускает.
Теперь можно удалить все файлы и папки, которые находятся рядом с папкой “game”, а содержимое папки “game” вынести наружу.
Вот, пожалуй, и все. К статье прилагаются исходники unwrapper’а на Си. По идеи unwrapper должен ломать все игры трех вышеприведенных компаний. Исходники писались на скорую руку, поэтому наверняка там есть недочеты, не точности, ошибки, баги, переполнения... В общем, если найдете баги в коде буду очень благодарен, если сообщите об этом мне.
Скомпилированный UnWrapper http://coder-club.in/download/unwrapper.rar
Исходники http://coder-club.in/download/unwrapper_src.rar
by Geograph
© 2008