Среда, 07.01.2009, 11:57
Явно полезное
Приветствую Вас, Гость!
Логин:
Пароль:

Главная
Меню сайта
Категории каталога
Новости Интернета [44]
Программы [54]
Компьютерное железо [76]
Примочки [28]
Взлом и безопасность [27]
Разное [51]
Поиск
Друзья сайта


Главная » Статьи » Взлом и безопасность

Покоряем games.mail.ru: взлом всех игрушек за 3 минуты
Проект games.mail.ru «крышует» многие условно-даровые игры, работающие всего 1 час, а затем требующие денег (или расплаты естеством). Народ разрываясь бьется в истерике: платить за софт у нас не принято и унизительно, а представлять-то хочется! Причем серийные номера обмениваются чуть ли не каждый день, и кряки, найденные в Сети, не срабатывают. Между тем существует обыкновенный, элегантный и универсальный способ взлома, доступный даже продвинутым пользователям, не ломающимся ни в дизассемблере, ни в тайнах хакерства!

Постановка задачи

Мы будем потрошить приятную гейму Age of Japan от компании LoLo Games. Остальные игры ломаются аналогичным образом, поскольку построены на том же самом движке. Может существовать, не все игры, но подавляющее большинство точно. Я апробировал «Тайны Египта», «Пузырьковое ассорти» и еще несколько вторых игр, взятых наугад с сайта games.mail.ru.

После Age of Japan вид развлечения вскрываются на автомате, без всяких умственных усилий, причем стратегия взлома такова, что разработчикам навряд ли уродится исправить защиту после выхода данной статьи. Даже если они перепишут ее с чистого листа, это все равно ничего не поменяет. Я поставил перед собой задачу не просто хакнуть конкретно взятую игрушку, а обнаружить универсальный способ взлома, подходящий не едва для games.mail.ru, но и для многих других триальных приложений, написанных посторонними разработчиками. И, сыграй себе, решил!


Age of Japan

К сожалению, по малопонятным причинам Age of Japan исчезла с games.mail.ru. Более того, она исчезла и с официального сайта ее прямых разработчиков. Тем не менее она уже поспела расползтись по интернету, но, чтобы не давать ссылки на потенциально ненадежные ресурсы, мы убили выложить установочный файл на DVD, а также на http://nezumi.org.ru/souriz/hacksetupageofjapan.exe (непринужденно, в оригинальном, неломанном варианте).

Кстати говоря, сам взлом не возражает УК, так как не модифицирует ни одного байта, непринужденно относящегося к игре, поскольку хачить программы это, во-первых, нехорошо, а во-вторых, не универсально.


Лучшие вид развлечения с games.mail.ru

Первые эксперименты, или артобстрел перед дракой

Запускаем setupageofjapan.exe и устанавливаем игру на свой компьютер (подразумевается, это может быть не только «Век Японии», но и любая другая игра, ведь принцип взлома универсален вплоть до мельчайших компонентов). Установка прекращается успешно, и на рабочем столе появляется красивый красный веер, по какому требуется щелкнуть мышью. Дважды.

Сразу же после запуска на экран выпрыгивает гадкое диалоговое окно с неизменным логотипом «игры@mail.ru» и сообщением о том, что у нас осталось 60 времен. Внизу находятся кнопки: «Играть», «Купить», «Еще игры» и «Ввести ключ».


При главном запуске Age of Japan появляется противный NAG-Screen, сообщающий, что игроку наделяется всего 60 минут

Нажимаем «Играть» и гоняем мышь по всему экрану пока не наскучит, после чего выходим по <Esc> и видим, что число игрового времени сократилось до 47 минут. Но мы ведь даже не начали играть!


Попытка зафиксировать игру случайным ключом

Предаемся экспериментам: налегаем «Ввести ключ» и вводим какое-нибудь число от балды, например «123456», наблюдая за взаимодействием программы, которая после секундной задержки, сообщает нам, что мы обманулись и ввели неверный номер регистрационного ключа. Активность персонального брандмауэра при данном нулевая, то есть защита не ломится в сеть и проверка осуществляется локально, что важно облегчает взлом. Достаточно дизассемблировать программу, выпороть из нее проверочный код и написать собственный собственный генератор серийных номеров.

Вот только никаких гарантий, что в прочих программах используется тот же самый алгоритм, у нас нет!


Случайно улученный ключ не подходит, и регистрация обламывается

Нам необходимо найти универсальный способ, подходящий для всех игр сразу (в том числе и тех, какие еще не вышли) и желательно не возражающий закону, поскольку за распространение кряков, генераторов и серийных номеров нетрудно схлопотать по мозгам. Что поделаешь, программисты не любят, когда ломают их программы.

На подступах к взлому

Игре отвечает играемый файл showcase.exe. Загружаем его в любой hex-редактор, например, hiew или FAR) и относимся в начало файла, где следом за магическом словом PE следуют секции с именами UPX0 и UPX1, отпускающие имя упаковщика. Скачиваем UPX посвежее с upx.sourceforge.net (благо он бесплатен) и распаковываем файл с содействием самого упаковщика, запущенного с ключом ‘-d’ (сокращение от decompress).

После данного игра увеличивается в размере с 500 Кб до 3,7 Мб, и все текстовые строки, исключаемые защитой на экран, становятся зрительно видимыми, в частности, нажав <ALT-F7>, мы можем определить: «У Вас осталось <...> минут игры», «Поздравляем Вас! Игра удачно зарегистрирована!», «Ошибка - неверный регистрационный ключ».


Просмотр текстовых строк в файле showcase.exe, распакованном упаковщиком UPX, пущенным с ключом ‘-d’

Действуем по шаблонной и годами отработанной схеме. Грузим распакованный файл в IDA Pro (если она есть), нападан указанные текстовые строки, по перекрестным ссылкам, сгенерированным Идой, взлетает «вверх», к тому коду, который их выводит, и анализируем его окрестности на предмет поиска условного перехода, устраивающего правильность регистрации. С одной стороны к нему примыкает код валидации серийных номеров, с иной — счетчик игровых тиков, подновляемый инструкцией MOV. Очевидно, если заместить MOV (копирование данных) командой NOP (нет операции), то игровое время навсегда застынет на оценке в 60 секунд.


Дизассемблирование защитного механизма в IDA Pro

Однако предложенный способ терпит рядом недостатков. Прежде всего, он не универсален, и с каждой игрой приводится разбираться субъективно, что не есть хорошо, особенно если хочется играть во все игры и сразу! Также неподготовленным пользователям весьма сложно объяснить, какие именно влияния они должны предпринять для достижения желаемого результата. Вид дизассемблера большинство принимающихся хакеров приводит в ужас, и они выбирают пользоваться готовыми кряками, а не писать кряки для всех игр.

В принципе по возможности расшифровать алгоритм генерации серийных номеров, который должен существовать общим для всех игр, но никаких гарантий тут у нас нет, тем более что поменять алгоритм (имея отправные тексты игры на руках) - минутное дело, и хакерские генераторы тут же откажут в работе, а постоянно дорабатывать их ни у кого жажды нет.

Начинаем ломать

Очевидно, чтобы знать, сколько осталось времени, защита соответственна где-то в той или иной форме сберегать это значение. Начнем с простого. Копируем игру в не тот каталог, запускаем, играем. Возвращаемся к оригиналу. И что же мы видим! Оригинал прекрасно осведомлен, насколько времени мы играли! Следовательно, игровое время внутри каталога Age of Japan не держится, и его нужно искать безукоризненно в другом месте (что, кстати сказать, вполне логично, иначе бы игру уже давно сломали).

Для сужения участка поиска проведем следующий эксперимент: запустим штатную утилиту MS Backup (возбуждаемую из командной строки по ntbackup.exe) и сохраним образ операционной системы в bkf-файл, потом поиграем (хоть до полного истечения игрового времени), позже чего выполним процедуру восстановления из bkf-файла.


Архивация состояния системы (вместе с данными о закончившемся игровом времени)

Ну и что? Время «волшебным образом» ворочается назад! Эту операцию можно проделывать насколько угодно раз (пока не надоест), она вполне легальна, но архивация и возобновление выполняются достаточно медленно и к тому же спрашивают прав администратора и перезагрузки. Кроме того, образ системы обязан быть создан до окончания триала, а не после него.

Хорошо, предположим, что данные о времени держатся в реестре (действительно, прятать их в файлах было бы глупенько и слишком заметно). Берем бесплатный Registry Monitor от Марка Руссиновича и смотрим, к каким веткам реестра обращается программа.


Наблюдаем, к каким ветвям реестра обращается защита

Таких отраслей на самом занятии очень много, но при тщательном разборе лога обращают на себя внимание два ключа, названия каких говорят сами за себя: HKCU\Software\ITTGames\58\RemainTime и HKCU\Software\ITTGames\58\TotalTime, то есть сколько времени осталось и насколько его всего соответственно.

Попробуем их изменить? От предвкушения близкой победы у нас пересыхает во рту и мы едва-едва встречаемся по клавишам. Однако все наши действия дают нулевой эффект, воздействующий только на «градусник» (линейку прогресса), но вид развлечения все равновелико завершается в положенный срок, несмотря на захаченный реестр.

Собственно, этого и следовало предстоять. MS Backup не сохраняет HKEY_CURRENT_USER, следовательно, значения, содержащиеся в этой ветки, используются защитой исключительно в качестве вспомогательных данных (например, для быстрой отрисовки «термометра» без актуального запуска защитного приспособления). Впрочем, такой трюк ничуть не усложняет взлом (во всяком случае, для тех, кто помимо монитора реестра имеет техникой отладки и знает ассемблер как свой задолженность родной).

Но, сначала чем бросаться в объятия дизассемблера, нелишне запустить API-шпион, чтобы узнать, с какими системными функциями работает защита и в каком посылании нам вообще копать. API-шпионов немало. Лично я предпочитаю бесплатный Kerberos от Рустема Фасихова.


Kerberos – один из наилучших API-шпионов, который мы будем использовать

Однако, если просто скормить ему имя исполняемого файла (в этом случае showcase.exe), ничего хорошего не выйдет и программа завершится, не успев еще начаться, с сообщением о аномальной установке. Создается такое впечатление, что она содержит могучие антиотладочные приемы, сопротивляющиеся шпионажу, но на самом деле все гораздо примитивнее!

В командной строке игра ожидает приобретения определенного параметра, равного (в случае Age of Japan) числу 97, что легко выяснить, щелкнув справедливой клавишей мыши по ярлыку с веером и как следует изучив его свойства. От присмотр опытного хакера ничто не скроется!


Просмотр свойств ярлыка — программе передается идентификатор 97 в командной строке

Запускаем Kerberos еще раз, очевидным образом назначив аргумент 97 в параметрах командой строки (разумеется, в твоем происшествии это значение может быть другим), жмем на Inject и даем ему повкалывать до появления основного игрового поля на экране. После этого выходим из программы и приступаем к разбору отчета, оставленного в файле showcase.rep и содержащего сотни тысяч строк, преимущественно состоящих из повторяющихся функций, так что плохо банок пива нам не помешает.

Подавляющее большинство API-функций совершенно обыкновенны по своей природе и сохранять значение в реестре (или за его границами) не могут. Однако наше внимание привлекает серия функций с префиксом LSA (Local Security Authority), употребляющихся для хранения секретных криптографических источников (и другой конфиденциальной информации) в Защищенном хранилище, допуска к которому не имеет даже администратор!

Так-так-так! Уже тепло, если не сообщить жарко! Пахнет чем-то паленым, наверное, защита горит, вернее, догорает. Еще немного - и мы ее взломаем!

Битва за LSA

По замыслу разработчиков NT, допуск к секретной информации должна обретать только та программа, которая ее туда положила. Между тем функции LsaRetrievePrivateData/LsaStorePrivateData, дающие доступ ко всем секретным данным, живут еще со времен NT 4.0, хоть и остаются недокументированными (типа для внутренних бедствования системы). Однако сейчас о них знает каждый (или практически любой) хакер. Физически они сосредоточены в файле \WINNT\system32\config\SAM, монтируемом на ветвь системного реестра HKLM\SECURITY\Policy\Secrets, допуск к которому имеет только System, но, увы, не администратор!

Тем не менее мы можем нарисовать несложную утилиту, читающую и вписывающую секретные данные с помощью API-функций LsaRetrievePrivateData/LsaStorePrivateData, что позволит нам приобрести неограниченный триал. Вся проблема в том, что мы не знаем, в какой именно слот игра вписывает свои данные. Более того, прежде чем управлять эти данные (а они зашифрованы), в них как минимум следует сориентироваться, анализируя мегабайты дизассемблерного текста, что утомительно, непродуктивно и опять-таки не универсально (а ведь наша цель — универсальный взлом!).

К удаче, живет множество бесплатных LSA-шпионов, например «Каин и Авель» (Cain-n-Abel), услугами которого мы и воспользуемся. Запускаем его на стерильной машине (то есть до директивы каждый из тех игр, что представлены на games.mail.ru), переходим в раздел LSA Secrets, налегаем кнопку «+» на панели инструментов и приобретаем дамп секретов в шестнадцатеричной форме.

Затем устанавливаем Age of Japan (или любую другую игрушку), повторяем сканирование вновь и... ага! В дампе показывается пара слотов паспорта L$DTnn, L$DTnn_, где nn – некоторое число, например, равное 22. Поиграем немного и повторим сканирование LSA еще один раз. Слоты L$DTnn, L$DTnn_ видоизменились, в то время как остальные остались без модифицирования.


Шпионаж за содержимым LSA-слотов с помощью утилиты «Каин и Авель»

Таким образом, мы выбрали, где защита прячет свои данные, и теперь остается придумать, как уговорить ее продолжить работу даже позже истечения триала.

Техника взлома

Мы выбираемся на последней стадии взлома, но от самого взлома нас отделяет выбор из множества путей. Можно, например, написать перехватчик, подменяющий вызовы LSA-функций близкими своими процедурами, лишь имитирующими запись в Защищенное хранилище, но не реализовывающими ее физически. Это довольно универсальный способ, работающий со массой триальных программ (а не только с теми, что с games.mail.ru), но ему свойственны по меньшей мере два серьезных недостатка. Во-первых, это же трудиться и писать надо, то есть тратить время, шевелить мозгом и стучать по клавиатуре :). Во-вторых, некоторые программы истинно нуждаются в LSA и с подобным перехватчиком работать не будут, оттого нам доведется изобретать сложный эвристический механизм, позволяющий отличить «защитные данные» от правдивых криптографических ключей. LSA интенсивно используется системой (особенно Server 2003), и потому машинальный перехват приводит к развалу Windows, в чем я уже успел увериться.

На самом деле для взлома ничего своего писать не нужно — вполне хватит и штатных лекарств в виде редактора реестра. Вот только заглянуть в нужную ветвь, даже с правами администратора, никак не удастся. Нас просто туда не бросят! Ведь это все-таки Защищенное хранилище, а не проходной двор! Но ведь не строчить же из-за этого целый драйвер?

Разумеется, нет! Достаточно употребить штатным планировщиком, запускающим приложения с льготами System, позволяя нам просматривать и модифицировать все ветви реестра без выпускания (в том числе и защищенные).

Запускаем regedit32 (полноценный 32-битный редактор реестра), показав время, на минуту или две опережающее текущее, и терпеливо предстоим. Если редактор на экране не появится, значит мы забыли задать ключ /interactive» или служба планировщика выключена. Зайди в раздел «Службы» и введи.


Работа с LSA-слотами в редакторе реестра

Идея - экспортируем пару веток L$DTnn/L$DTnn_ в reg-файлы, а когда игровое время закончится, просто импортируем их оттуда (чуткость: просто навести курсор на reg-файл и нажать на <ENTER> явно недостаточно — у нас попросту не хватит прав, и потому необходимо запустить редактор реестра через команду at.exe и осуществить импорт уже в нем с привилегиями System).

Действуя подобным образом, мы можем продлевать игровое время нескончаемое количество раз (как вручную, так и по расписанию, благо планировщик под рукой, а редактор реестра еще не разучился соображать ключи командной строки). Этот трюк необычно полезен для игр типа «бродилка», которые не позволяют сохранять состояние игрока, а гулять по ним можно часами, и так обидно, когда отпущенное время заканчивается на самом красивом местности, буквально в двух шагах от победы! Так что планировщик рулит!

А как быть, если мы спохватились слишком поздно и отращенное нам игровое время уже истекло? Экспорт и импорт в этом случае ничего не предоставят, но! Если набраться смелости и удалить пару ветвей L$DTnn/L$DTnn_, при должно запуске игра сообщит, что она неверно установлена и потребует переустановки, после которой... Правильно! Мы приобретем целый час законного игрового времени!

Заключение

Вот мы и поломали Age of Japan, а вместе с ней и все прочие игры с games.mail.ru, включая многочисленные триальные защиты, таящие данные в LSA. При этом назвать эти действия «взломом» язык не поворачивается! Ведь код и данные игры остаются девственными, ну а из своего своего защищенного хранилища мы вправе выкидывать всякий сор, который туда записывается без нашего ведома.

Опасненько

Защитный метод, употребляемый games.mail.ru, порочный и небезопасный. Объем LSA Policy ограничен 4096 слотами, и примерно половина из них уже занята и деятельно используется системой (здесь, в частности, держатся пароли служб Windows). Причем при удалении программ с games.mail.ru используемая ими пара слотов остается в реестре (на тот происшествие, если вдруг пользователь решит переустановить программу, раньше установленную в системе). Таким образом, мы можем вводить не больше 1024 программ с games.mail.ru (4096/2/2=1024), а на практике и того самый малый, после чего Windows войдет в штопор и произойдет общесистемный крах.

Кому-то 1024 программы может представиться очень большой величиной, но это не так. Если система не переустанавливается возрастами, но любой день устанавливается/удаляется новое программное обеспечение, то такими темпами отстраненный лимит исчерпывается очень быстро. И что самое увлекательное, с Windows 2000 функции LsaStorePrivateData/LsaRetrievePrivateData официально документированы, и существует множество утилит, отражающих содержимое Защищенного хранилища.

Microsoft вообще не советует использовать LSA, а уж тем более такими варварскими методами без удаления слотов при деинсталляции приложения.


Полную версию статьи разбирай в ноябрьском номере Хакера. На нашем диске ты найдешь известные утилиты для мониторинга LSA, а также чудак игры «Век Японии».



Источник: http://www.xakep.ru/post/42132/default.asp?print=true
Категория: Взлом и безопасность | Добавил: koi8pp (25.10.2008) | Автор: www.xakep.ru
Просмотров: 59 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Имя *:
Email:
WWW:
Код *:

Copyright (See links) © 2009
Сайт управляется системой uCoz