Upgrade-JAVA
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.
Upgrade-JAVA

Форум о модернизации ява, sis! Прошивка телефонов!
 
ФорумФорум  Последние изображенияПоследние изображения  ПоискПоиск  РегистрацияРегистрация  Вход  

 

 Хакинг игр!

Перейти вниз 
АвторСообщение
Admin
Admin
Admin


Сообщения : 13
Дата регистрации : 2010-03-12
Возраст : 32
Откуда : Ялта

Хакинг игр! Empty
СообщениеТема: Хакинг игр!   Хакинг игр! EmptyСб Мар 13, 2010 8:11 pm

Здесь выкладываем статьи по хакингу JAVA!Вопросы задаём тут-же!
Вернуться к началу Перейти вниз
http://up-java.gip-gip.ru
Admin
Admin
Admin


Сообщения : 13
Дата регистрации : 2010-03-12
Возраст : 32
Откуда : Ялта

Хакинг игр! Empty
СообщениеТема: Re: Хакинг игр!   Хакинг игр! EmptyСб Мар 13, 2010 8:12 pm

Выкладываю сразу несколько статей:
Автор: (c)Крис Касперски ака мыщъх

Надоело платить за мобильные игры? Заколебала череда бесконечных смертей? Хочется переделать спрайты/тексты/заставку под свой вкус? Нет ничего проще!!! Мобильные игры весьма компактны и потому просты для взлома и анализа. Надругаться над ними сможет даже начинающий хакер, а эта статья поможет ему сделать первые шаги, после которых он будет оттачивать хакерское мастерство уже самостоятельно.
Введение
Популярность мобильных игр стремительно растет. Они прочно оккупировали рынок сотовых телефонов, коммуникаторов, смартфонов, карманных компьютеров и других аналогичных устройств. Большинство игр распространяется на условно-бесплатной основе, то есть требуют деньги, иначе блокируют часть возможностей и/или ограничивают количество запусков. Но даже полностью бесплатные игры не лишены недостатков. Неудобное управление, быстро кончающиеся жизни... Да мало ли существует причин, побуждающих хакера дорабатывать код в соответствии со своими предпочтениями? Этические проблемы взлома нас не волнуют, поэтому мы немедленно переходим к технической части, благо хвост уже зудит, чешется и рвется в бой. О взломе мобильных игр написано много, но все как-то неконкретно и не в тему. Не так-то просто обобщить свой опыт и передать его другим. Но мыщъх все же попробовал....
Мобильные платформы
Основная масса мобильных игр (по некоторым оценкам аж до ~70%) пишется на Java, а точнее - J2ME, что расшифровывается как Java 2 Micro Edition. Это урезанная версия языка Java, ориентированная на маломощные системы и поддерживающая огромное множество мобильных устройств. Вместо "живого" машинного кода, сотовому телефону подсовывают так называемый "байт-код", исполняющийся на виртуальной Java-машине (Java Virtual Machine или сокращенно JVM). Теоретически, игра, написанная для одного сотового телефона, будет работать на любом другом, независимо от особенностей его аппаратного обеспечения, что очень хорошо (хотя на практике переносимость намного хуже). Расплачиваться за это приходится драматическим падением производительности в условиях и без того маломощных микропроцессоров.
Продвинутые игры (наподобие Fight Hard 3D и RiderX 3D) пишутся на чистом машинном коде и потому могут исполняться только на микропроцессорах одного семейства (например, ARM 6), что ограничивает сферу их применения. В настоящей статье они не рассматриваются. Поскольку нельзя объять необъятное, мы сосредоточимся исключительно на взломе Java-приложений, а до Fight Hard'а доберемся не раньше, чем мыщъх купит соответствующий сотовый телефон.
Рисунок 1. Телефон Siemens S55 с ИК-адаптером от iRwave.
Чем мы будет ломать
Выбор хакерского инструментария - дело сугубо личное, индивидуальное и, можно даже сказать, интимное. Поэтому не следует воспринимать ниже перечисленный список как догму. Это всего лишь один из вариантов. Практически все обозначенные утилиты реализованы в двух-трех вариантах - как консольных, так и графических. Так что, каждый может найти программу под свой вкус. Предлагаемая подборка включает в себя только бесплатные программы, игнорируя их коммерческие аналоги, иначе это не хакерство получается, а сплошной рекурсивный спуск (чтобы сломать мобильную игру, нужно хакнуть программу, которая ее ломает).
Прежде всего нам потребуется спецификация на байт-код виртуальной Java-машины, выложенная на официальном сайте корпорации Sun (на английском языке): [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] при этом знать сам язык Java совершенно необязательно, хоть и желательно. Во всяком случае, мыщъх несколько лет успешно хачил Java-приложения непосредственно в JVM, пока, наконец, не купил "Горький вкус Java" Брюса Тейта, разобравшись с основными языковыми концепциями, которые, кстати сказать, ничуть не облегчили ни дизассемблирование байт-кода, ни его анализ;
Лучшим дизассемблером Java-программ была и остается легендарная IDA Pro, распространяющаяся на коммерческой основе за нехилые деньги, однако при желании можно обойтись и без нее, воспользовавшись штатным дизассемблером, входящим в бесплатный Java SDK или любой другой утилитой аналогичного назначения, коих в последнее время развелось как грибов (см. JavaBite, описанный ниже);
Чтобы не корячиться над анализом байт-кода, имеет смысл прогнать ломаемое приложение через Java-декомпилятор, выдающий вполне читабельные и структурированные листинги. Java-декомпиляторов существует много. Хороших и разных. Мыщъх рекомендует бесплатный avaDec by wl, которым пользуется сам и который можно скачать с [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] Еще стоит попробовать JDecompilerс [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] Он также неплох и бесплатен. декомпилированный код можно хачить прямо в исходных текстах с последующей рекомпиляцией, но мыщъх этого делать не рекомендует, поскольку декомпилятор не всегда работает корректно и повторная компиляция зачастую ведет к краху программы, поэтому лучше патчить непосредственно сам байт-код;
Рисунок 2. Внешний вид Java-декомпилятора.
Для модификации байт-кода (то бишь "бит-хака") подойдет любой hex-редактор, например, всем известный hiew, однако лучше использовать специализированные инструменты, лучим из которых является бесплатный JavaBite by BitArts, наглядно отображающий дерево классов, а также включающий в себя дизассемблер и ассемблер байт-кода (http://www.wasm.ru/baixado.php?mode=tool&id=284);
Мобильные игры как правило распространяются в виде упакованных jar-файлов, создаваемые одноименной утилитой, входящей в состав Java SDK, однако это не единственно возможный вариант. Архиваторы 7-Zip(бесплатный) и WinAce (условно-бесплатный) справляются со своей задачей ничуть не хуже. Исключение составляют Java-приложения, снабженные цифровыми подписями. Ни 7-Zip, ни WinAce их создавать не умеют, да этого и не требуется. Любой сотовый телефон загрузит jar-архив и без подписи;
Иногда рядом с jar-архивом лежит jad-файл, без которого некоторые модели телефонов откажутся загружать java-приложение и тут приходится прибегать к помощи бесплатной утилиты JADgen, генерирующий jad-файлы на основе jar-архивов (http://softsearch.ru/programs/134-892-jadgen-download.shtml);
Некоторые хакеры рекомендуют использовать эмулятор сотового телефона для проверки работоспособности взломанных игр. Другие же (к числу которых принадлежит и мыщъх) предпочитают живое "железо", тем более что закачать приложение на телефон - не проблема. Правда, при этом существует угроза "завесить" аппарат так, что придется вынимать батарею или даже делать полный reset, удерживая определенные клавиши при включении (у каждой модели телефона - разные), описание которых можно найти в сервисной документации. Впрочем, страхи угробить телефон некорректным взломом очень сильно преувеличены. В 90% случаях некорректный хак пресекается жутко матерящимся Java-верификатором. В 9% случаях игра просто зависает, подвешивая за собой весь телефон. И только в 1% происходит разрушение содержимого энергонезависимой памяти и прочий бэд. Так что, неуверенным в себе хакерам все-таки стоит пользоваться эмулятором.
Что мы будем ломать
А ломать мы будем милую игрушку Macroman (реинкарнация культовой компьютерной игры выпущенной в 1979 году японской компанией Namco Тору, реализованной практически на всех 8-битных компьютерах типа ZX-Spectrum), демонстрационная версия которой распространяется бесплатно и валяется практически на любом мобильном сайте: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Поставим себе задачу -обессмертить колобка, чтобы игра никогда не кончалась. Главное -разобраться с техникой и стратегией взлома, освоив основные хакерские трюки и приемы. Остальные программы ломаются аналогичным образом и неважно, что это - вечная жизнь или снятие ограничения с количества запусков.
Короче, кончай курить, мужики! Курить мы будет потом, а сейчас глотнем пива и возьмемся за дело.
Рисунок 3. MacroMan Demo от компании Macrospace.
Как мы будем ломать
Пускаем мы, значит, Macroman'а и даем ему умереть на зубах зловредных существ (типа приведений), агрессивно бегающих по лабиринту. На экране появляется надпись: "1 Life Left" (осталась одна жизнь). Очевидно, что код, выводящий эту строку, так или иначе связан с кодом, уменьшающим количество жизней при каждом акте поедания колобка. Во всяком случае, во всех императивных языках программирования (к которым принадлежит и Java) ситуация обстоит именно так.
Вот эту строку мы и будем искать. Прямым текстом. Но сначала распакуем jar-архив, пропустив его через 7-Zip (предварительно изменив расширение с.jar на.zip). И вот что мы получим в результате:

- META-INF // директория с файлом манифеста в текстовом формате - IMAGES // директория с изображениями лабиринта и спрайтов в png - MACROMAN // директория с файлом MacromanMidlet.class в байт-коде - b.class \ -c.class | - d.class | -e.class +- файлы классов в байт-коде - f.class | -g.class /

Листинг 1. Содержимое распакованного jar-архива с ломаемой игрой.
Берем FAR (или любой другой файл-менеджер), давим <ALT-F7> (Search), вводим маску файлов "*" (все файлы) и строку для поиска "Life Left", которую и обнаруживаем через секунду поиска в файле "e.class", занимающим всего 19 Кбайт.
Рисунок 4. Поиск строки "Life" в декомпилированном листинге.
Прогнав "e.class" через JDec (или любой другой декомпилятор) мы получаем текстовой файл "e.java" размером порядка 36 Килобайт, который тут же открываем в FAR'е по <F4> (Edit), давим <F7> (Search) и вновь ищем строку "Life Left", затаившуюся в окрестностях следующего кода (см. листинг 2):

if (ax < 0) // <-переменная ax, хранящая в себе кол-во жизней { byte4 = 2; as1 = new String[2]; as1[0] = "Game Over"; as1[1] = "HiScore: " + aq.e; break; } if (ax == 1) { byte4 = 1; as1= new String[byte4]; as1[0] = ax + " Life Left"; // искомая строка }

Листинг 2. Декомпилированный фрагмент Java-программы, найденный поиском строки "Live Left".
Машинная логика вполне стандартна и особых пояснений не требует. Если переменная "ax" становится меньше нуля -мы получаем "Game Over", в противном случае на экран выводится количество оставшихся жизней.
Следовательно, чтобы взломать программу, необходимо найти код, уменьшающий переменную "ax" на единицу при каждом акте смерти. А как мы его найдем? Да все тем же контекстным поиском! Просто ищем "ax" контекстным поиском, анализируя прилегающий к ней код. Довольно быстро мы найдем строку инициализации, устанавливающую начальный счетчик жизней равный двум (на самом деле - трем, с учетом того, что смерть наступает, только если ax < 0):

private byte ax; ... av = 0; ax = 2; // инициализация счетчика жизней f.a(this, a4);

Листинг 3. Фрагмент кода, отвечающего за начальное количество жизней.
Можно, конечно, заменить строку "ax = 2" на "ax =69" (например), но это плохой и порочный путь. Во-первых, вечной жизни мы все равно не обретем, а во-вторых, еще не известно, как программа отреагирует на такие издевательства (поскольку количество оставшихся жизней отображается в виде "колобков" внизу экрана, то при слишком большом их числе поведение программы рискует стать непредсказуемым и крышесрывательным).
Ладно, идем дальше и... Видим заветную команду "ax--" в методе "f()", уменьшающую значение переменной "ax" на единицу (см. листинг 4).

public void f() { MacromanMidlet.c(); as = 3; removeCommand(b); if(ay <= 10) { addCommand(a); addCommand(e); } else { ax--; // <- вот здесь уменьшаются наши жизни!!! if(ax < 0) { addCommand(a); addCommand(e); if(av > aq.e) aq.e = av; } else { addCommand(f); } } c(); }

Листинг 4. Декомпилированный фрагмент метода f(), уменьшающего переменную "ax" (счетчик жизней) на единицу.
Вот это - то, что нужно!!! Остается найти байт-код, соответствующей данной конструкции языка высокого уровня. Вот тут-то нам и пригодится IDA Pro, ну или утилита JavaBite. Открыв файл "e.class" в любой из этих программ, переходим к методу "f()" и внимательно исследуем код на предмет обращений к переменной "ax".
Рисунок 5. Дизассемблированный байт-код в IDA Pro.
Как легко видеть, в методе "f()" обращение к переменной "ax" встречается дважды (см. листинг 5):

met016_44: ; CODE XREF: f_1+22^j 042 aload_0 ; var016_0 089 dup 180 001 199 getfield ax B ; читаем переменную ax, закидывая ее на стек 004 iconst_1 ; закидываем на стек константу 1 100 isub ; стягиваем со стека две ячейки и вычитаем их 145 int2byte ; преобразуем в int и забрасываем на стек 181 001 199 putfield ax B ; обновляем содержимое переменной ax 042 aload_0 ; var016_0 180 001 199 getfield ax B 156 000 047 ifge met016_106

Листинг 5. Фрагмент дизассемблированного байт-кода метода f(), уменьшающего переменную "ax" (счетчик жизней) на единицу.
А что, если заменить команду "isub" (опкод 64h/100) на "парную" ей команду "iadd" (опкод 60h/96)? Эту операцию легко осуществить в любом hex-редакторе, например, в hiew'е. Просто ищем последовательность "042/089/180 001 199/004/100/145/181 001 199" (окружающую инструкцию "isub") и заменяем 100 на 96. Тогда при каждом столкновении со злобными приведениями количество жизней будет увеличиваться на единицу и... в конце концов мы получим незапланированное переполнение и тогда -трындец. А нам трынденца не надо! Нам надо корректный взлом.
Рисунок 6. С каждой смертью количество жизней увеличивается на единицу.
Хорошо! Попробуем заменить инструкцию "isub" на команду "nop" (опкод 00h). Кстати, говоря, это можно сделать прямо в JaveBite, не прибегая к помощи hiew'а. Достаточно подвести курсор к "isub", щелкнуть правой кнопкой мыши и в появившемся контекстном меню выбрать пункт "Edit Instuction". Откроется диалоговое окно со списком всех возможных команд. Находим "nop", жмем на "OK" и давим <Ctrl-S> (Save Class), чтобы сохранить результаты правки на диск.
Рисунок 7. Модификация байт-кода в JavaBite.
Вот только результаты эти... мягко говоря, довольно удручающие. И при запуске программы Java-верификатор завершает ее выполнение в принудительном порядке. Это в x86-процессорах с их регистровой архитектурой инструкцию SUB можно безболезненно менять на NOP. Виртуальная машина Java исповедует иной принцип и аргументы команды "isub" предварительно забрасываются на вершину стека, в расчете на то, что она стащит их оттуда. Замена "isub" на "nop" вызывает дисбаланс стека и чтобы восстановить статус-кво необходимо так же "занопить" и команду "iconst_1". Инструкцию "int2byte" можно не трогать, т.к. она имеет нулевой побочный эффект, сохраняя стек в том состоянии, в каком он был до ее вызова.
Короче говоря, корректно хакнутый байт-код выглядит так:

met016_44: ; CODE XREF: f_1+22^j 042 aload_0 ; var016_0 089 dup 180 001 199 getfield ax B ; читаем переменную ax, закидывая ее на стек 000 nop ; ничего не делаем 000 nop ; ничего не делаем 145 int2byte ; преобразуем в int и забрасываем на стек 181 001 199 putfield ax B ; обновляем содержимое переменной ax

Листинг 6. Байт-код, получивший "бессмертие" (хакнутые байты выделены полужирным шрифтом).
Сохранив изменения в класс-файле по <Ctrl-S> (или <F9> если мы работаем в hiew'е), нам остается только упаковать все файлы обратно в jar-архив и залить его на сотовый телефон. Для тестирования, так сказать.
Рисунок 8. Создание jar-архива с помощью WinAce.
При использовании WinAce достаточно выделить все файлы (включая каталоги), в типе архива указать "JavaSoft-Jar" и плюхнуться на "ОК" (см. рис. Cool. А вот среди выходных форматов, поддерживаемых архиватором 7-Zip никакого jar'а нет! То есть, он, конечно, есть, просто называется Zip'ом. В "Archive format" указываем: "ZIP", в "Compression level" -"Normal", поле "Compression method" выставляем в "Deflate". Остальные параметры оставляем по умолчанию - как есть. Главное, не забыть вместо расширения ".zip" указать ".jar". Ну, а имя файла может быть каким угодно.
Рисунок 9. Создание jar-архива в 7-Zip.
Заливаем игру на телефон
Вот мы имеем свежеиспеченный хакнутый файл Macroman.jar. Будем заливать его на телефон? А то!!! Сделать это можно разными путями. Например, по инфракрасному порту, Голубому Зубу, прямому кабельному соединению или выложить файл на свой собственный http-сервер, а потом стянуть его оттуда через GPRS. В общем, вариантов множество. Лично мыщъх предпочитает ИК, пример связи с которым продемонстрирован ниже.
Рисунок 10. Заливка игры на телефон по ИК.
Итак, игра залита на телефон и... Дрожащими от волнения руками (все-таки наш первый взлом, как-никак) мы едва попадаем по клавишам, запускаем игру и... о чудо!!! Она работает! (В смысле, не падает) И самое главное - счетчик жизней навечно застыл на отметке двух. Мы обрели бессмертие, а вместе с ним утратили весь игровой азарт и интерес... Но какой интерес играть в игры? Вот ломать их -настоящий кайф!!!
Рисунок 11. Счетчик жизней, навечно застывший на отметке двух.
Заключение или что еще можно сделать
Вот мы и совершили свой первый взлом! Как видно, ничего сложного и сверхъестественного в этом нет. Не маги программы ломают. Это доступно каждому! Главное - сделай свой первый шаг, а уж там... поле деятельности практически безгранично. Можно заменить все текстовые строки, в том числе относящиеся к копирайту компании-создателя. Не то, чтобы это было законно, зато очень приятно и прикольно показывать друзьям мобилу с надписью "hacked by...".
Более творческие настроенные кодокопатели наверняка уже загружают спрайты в графический редактор, коверкая их в готическом хакерском стиле. Ну, или меняют логотип на заставке, который также находится в png-файлах, собранных в директории image.
Конечно, мы рассмотрели простейший случай взлома незащищенной программы. Некоторые игры и приложения тем или иным образом проверяют целостность байт-кода, а также пропускаются через обфускаторы, добавляющие "мусорные" инструкции, отвлекающие внимание и затрудняющие анализ, но базовая техника взлома при этом все равно остается неименной. Найти-и-обезвредить -вот наш девиз!!! Знания приходят с опытом, а опыт - со временем, проведенным за ломанием игр. Так что, дерзайте!!! Да... и еще... не слишком-то распространяйтесь о своих хакерских наклонностях. А то ведь и повязать могут, хотя взлом "для себя" закон не запрещает, но это уже по-любому тема совсем другого разговора.
Описание встретившихся JVM-команд
Команда Опкод Операнды
Описание
i2b 91h/145 1 операнд на стеке типа int
Сстягивает с вершины стека значение типа int, усекает до байта, снова переводит в int (с учетом знака) и забрасывает результат обратно на стек
aload_<n> (2Ah/42)+n 1 операнд на стеке типа objectref
Извлекает из objectref переменную по индексу <n> и забрасывает ее на вершину стека
dup 59h/89 1 операнд на стеке
Считывает операнд со стека, клонирует его и забрасывает обратно
getfield B4h/180 2 непосредственных индексных байта, на стеке: objectref и value
Забрасывает на вершину стека заданное поле данного класса
iconst_<i> (2h)+<i> -
Забрасывает на вершину стека константу <i>
isub 64h/100 2 операнда на стеке типа int
Стягивает с вершины стека две переменных типа int, вычитает одну из другой и забрасывает результат обратно на стек
iadd 60h/96 2 операнда на стеке типа int
Стягивает с вершины стека две переменных типа int, складывает их и забрасывает результат обратно на стек
putfield B5h/181 2 непосредственных индексных байта, на стеке: objectref и value
Стягивает с вершины стека переменную и записывает ее в заданное поле данного класса
nop 00h - Нет операции
Таблица 1. Краткое описание JVM-команд, встретившихся нам в подопытной программе.
Полезные ссылки
Macroman:
Java-игрушка, над которой мы будем издеваться на протяжении всей статьи: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
The JavaTM Virtual Machine Specification Second Edition:
Официальная спецификация на байт-код Java-машины (на английском языке): [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
avaDec 0.9b by wl:
Хороший Java-декомпилятор, распространяемый на бесплатной основе: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
JDecompiler (Java Decompiler) 1.0:
Еще один хороший и абсолютно бесплатный декомпилятор для Java-программ: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
IDA PRO:
Лучший дизассемблер всех времен и народов, поддерживающий в том числе и байт-код виртуальной Java-машины, распространяемый за нехилые деньги: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
JavaBite:
Дизассемблер, ассемблер и модификатор байт-кода JVM в одном флаконе, распространяемый бесплатно с кучей разных плагинов и прочих тулз: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
JADgen:
Бесплатный генератор jad-файлов, требуемых нескорыми моделями телефонов: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
7-Zip:
Бесплатный архиватор, позволяющий создавать в том числе и jar-архивы: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Winace 2.6:
Условно-бесплатный архиватор, в явном виде поддерживающий формат jar: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Creating a JAR File:
Штатная утилита для работы с jar-архивами от компании Sun, с возможностью создания цифровых подписей и прочих прибамбасов, бесплатная: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Bluejacking "У вас осталось 10 дней (J2ME)":
Познавательная статья, описывающая основы взлома мобильных игр на конкретных примерах для начинающих (на русском языке): [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]

Copyright ©️2003-2009, InsidePro Software. All rights reserved.
Thursday, 23rd of July 2009&~Взлом Java-апплетов
Сначала о теории. Виртуальные машины это что-то типа интерпретаторов, но по-круче. Это программы которые имитируют выполнение программы на программной модели какого-нить процессора. Т.е. прога строится на командах этого виртуального процессора. Таким образом стандартные апи отлетают в далекие края. Потому что команды этого процессора выглядят хз как. Там могут быть какие-угодно опкоды, которые интерпритируются в команды виртуального процессора. Это жеж какой ужас будет если все проги будут делаться на виртуальных машинах... Вот так все сложно и страшно. Никто переходить на виртуальные машины пока не собирается, потому что все виртуальные машины страшно тормозят. Естественно, пока туда-сюда код интерпритируется, потом его надо выполнить в системе команд нашего реального проца и преобразовать результаты для передачи виртуальному. Вот так от. Зачем они тогда ваще нужны? Тока изза мультиплатформенности. Т.е. пишется тока виртуальная машина под нужную ось, а проги для нее везде одинаковые. Ща у нас есть виртуальные машины Java и VB. Итак я покажу самый примитив, тошо явы я не знаю, на скока получилось смарите сами. Будем ломать ABCMenuMan от Wyka-Warzecha (http://www.wyka-warzecha.com). Там куча ограничений на нем, но пока, что я покажу как ломать самый явный из них - задержку при загрузке. Приступим. Открываем ABCMenuMan.class в Ida. Задержка должна быть на 100% в самом аплете. Нужно тока ее найти... Для начала не плохо бы узнать какой функцией она реализуется. Должно быть что-то связанное с временем. Но еще вопрос : Где искать имя этой функции? Запускаем sample.htm чтобы аплет запустился. Берем процдамп и смотрим чо там у нас использует explorer... Кучу DLL связаных с java. Но нам пока важна тока msjava.dll. Поики среди функции в этой dll не привели ни к чему - функций связаных с задержкой, типа delay не было Sad. Но зато была задержка для потока java_lang_thread_sleep. Но ведь аплет-то и есть поток explorer'a созданый виртуальной машиной... Ставим bрx на java_lang_thread_sleep (экспорт из msjava.dll загрузить не забудьте). Теперь запускаем sample.htm. Сработает айс. Жмем F11 и видим (адрес не буду совпадать): 015F:01DC5B6B PUSH DWORD PTR [EBP+14] 015F:01DC5B6E PUSH DWORD PTR [EBP+10] 015F:01DC5B71 PUSH 00000000 015F:01DC5B76CALL [EDX+24] - call java_lang_thread_sleep Ставим bpx на 01DC5B6B и делаем bd*, потому что будет будет куча вызовов. Закрываем sample.htm, be* и снова запускаем. Айс сработает на 01DC5B6B теперь смотрим чо загоняется в стек перед call. PUSH DWORD PTR [EBP+14] - тут ноли PUSH DWORD PTR [EBP+10] - тут число 17EB (нормальный вид, а не так как в памяти). Теперь смотрим в IDA ищем java.lang.thread.sleep. Находи вот это: met006_83: ldc2w 6123 invokestatic void java.lang.Thread.sleep (long) Хм, чо это за 6123... А скока это в hex? 6123=17EB! Круто. Это и есть задержка. Теперь все что нам остается это открыть ABCMenuMan.class в Hex редакторе, найти EB 17 и заменить на 00 00. А теперь когда мы все так прочувствовали, даю второй, гораздо более простой метод: Берем DJ Java Decompiler и декомпилим этот class файл. Потом правим код и в нем же перекомпиливаем обратно юзая Jbuilder Этот способ хорош, но это уже другой аплет выходит, а не крэк. :-x :-x :-x&~Куда податься телефонному кодеру: полный гид по мобильным платформам для программиста

Автор: Олег Придюк
Тот факт, что зарабатывать космокредиты на кодинге под мобилы нелегко, сомнений не вызывает. Именно поэтому программистов для Symbian, iPhone, BlackBerry, Windows Mobile, Android и других мобильных платформ почтенно зовут девелоперами. А когда зовут - обещают много платить за хорошую работу. Может и тебе пора влиться в стройные ряды воинов мобильного R&D?
Apple iPhone
Справка:
Используемые языки низкоуровневого программирования: Objective C, C++
Примерное количество проданных устройств: около 15 млн.
Доля рынка смартфонов: 16%
Количество выпущенных моделей телефонов: 3
Позитив:
Удобный SDK
Единый магазин программ с большим количеством покупателей
Не надо заботиться о совместимости с архивом выпущенного железа
Негатив:
Принципиальная невозможность реализовать многие функции через официальный SDK
Необходимость иметь компьютер Apple или с Mac OS X для установки IDE
Сложно продать программу дороже $5
Софт для великого и ужасного гаджета из Куперитно не пишет только ленивый или бездарный. Компания сумела создать глянцевый телефон, глянцевый SDK, отполировала все грамотным пиаром и прикрепила качественную документацию (подробнее об этом мы писали в декабрьском ][).
Программы для iPhoneпродаются легко и быстро, - владельцы сверкающей мобилки оперативно и с завидной периодичностью заходят в специально отведенное место, именуемое AppStore, и покупают там свежие игры и софт. Основная часть покупаемого стоит от $0.99 до $ 4.99. Это достаточно простые программы кодеров-любителей или маленьких компаний, часто выполняющие 1-2функции. Такой софт ласково называют iFart (в вольном перевода -"яПук"). Программы, которые после мелькания на главной странице попадают в top100 или, еще лучше, в top20, зарабатывают своему создателю тысячи долларов. Но стандартный сценарий таков: в первый день появления на главной -20-30 покупок, затем падение в архив и 1-2покупки в неделю (что приносит автору по одному-два бакса в день или неделю). Стабильно, но как-то не очень прибыльно. Подобная незавидная участь постигает 80% программ в AppStore.
Позитивный момент заключается в том, что существует единый магазин, который уже встроен в телефон, о котором пользователи знают, куда постоянно заходят и... покупают, покупают, покупают. Ни один другой производитель телефонов не смог привить покупателям своеобразный рефлекс, что софт надо брать не на форумах, а в магазине. Даже охочие до халявы жители нашей прекрасной страны, представьте себе, софт для Symbian воруют, а для iPhone - покупают.
Такая вот система ценностей. Если грамотно подойти к вопросу и создать программу, которую захотят купить тысячи пользователей, то можно срубить определенное количество денег.
Используемый язык похож на С++, среда разработки и документация - в порядке. Начать опытному кодеру будет легко. Своих нюансов хватает, но головной боли немного. Самое главное, не надо беспокоиться о совместимости со старыми версиями SDK и операционок (пламенный привет Symbian), с разношерстным железом, разными разрешениями экранов и миллионами способов ввода данных. Имеющиеся на рынке два (фактически даже один) телефона аппаратно чуть ли не идентичны. Посему - программить выходит реально легче.
Вердикт:
Возможно, путь мобильного девелопера имеет смысл начинать именно с яблочной мобилки. Вот только, чтобы чего-то добиться, надо уметь часто и много думать, ориентироваться на пользователя, чувствовать тренды и движения рынка. Смогешь?
Java ME
Справка:
Используемые языки низкоуровневого программирования: Java ME
Примерное количество проданных устройств: почти миллиард только в 2008 году
Количество выпущенных моделей телефонов: 80% всех выпущенных в мире телефонов
Позитив:
Совместима с большинством выпущенных телефонов
Легкая в освоении
Специалисты востребованы на рынке
Негатив:
Не работает на iPhone, Palm OS и без дополнительного ПО на Windows Mobile
Много проблем с совместимостью и поддерживаемым функционалом
Программы сложно продать
Джава вообще стоит особняком - это не операционная система, привязанная к конкретным производителям, а универсальная платформа, которую поддерживают чуть ли не все телефоны дороже $60-80 (iPhone не в счет, он от Стива Джобса). Универсальность и многогранность платформы Java MEсочетаются с универсальностью и многогранностью самого языка: чтобы написать что-то толковое, надо достаточно неплохо разбираться в вопросе. Java-кодинг для мобилок напоминает верстку HTML - делаешь велосипед, а потом создаешь для него ассорти - педали, рули и седла, чтобы каждый желающий мог воспользоваться.
Правда, есть один существенный плюс: однажды написанную Java-программу относительно легко адаптировать и для свежеиспеченных сенсорных Nokia, и для настроенных на бизнес BlackBerry, и для обычных телефонов-звонилок, и даже для чего-то совсем нового, что выйдет только через год. И все же - Джава Джаве рознь. Отсюда и много дополнительной работы по адаптации готовых программ для новых устройств.
Но все проблемы по написанию софта кажутся мелочью по сравнению с тем, как непросто уговорить пользователя его поставить и, тем более, купить. Владельцы смартфонов предпочитают нативные программы, а большинство (абсолютное) владельцев телефонов и знать не знают о возможности установки дополнительного софта. Те, кто знают - или не подозревают, где его брать, или попросту не желают этим заниматься. Централизованного и официального магазина Java-программ нет, как не существует у владельцев телефонов сформированной культуры покупать Java-софт для телефонов.
Да, Java-проги собираются на разнообразных форумах или сайтах вроде GetJar.com, но туда ходят только относительно продвинутые пользователи или же дети, желающие вытянуть максимум из подаренной бюджетной трубки, чья цель - игры и другие развлекательные программы (почти как у iPhone, кстати). Только единицы готовы платить за Java-программы. Java ME - скорее, прерогатива игр (часто -нескромного содержания), которые присылаются в обмен на SMS, отправленное на короткий платный номер.
Вердикт:
Хороший бизнес для любителей клонировать порноигрушки и развлекательные программки. Зарабатывать доллары можно через показ рекламы или контракты с оператором.
Symbian
Справка:
Используемые языки низкоуровневого программирования: Symbian C++, C, C++
Примерное количество проданных устройств: 226 млн. (вместе с японскими моделями)
Доля рынка смартфонов: 44%
Количество выпущенных моделей телефонов: 159
Позитив:
ОС распространена и весьма перспективна
Специалисты востребованы и высокооплачиваемы
Множество средств разработки и совместимых фреймворков
Негатив:
Язык труден в освоении
Сложная система сертификации программ
Ряд проблем совместимости с разными моделями
Одна из самых древних операционных систем с жутко непростой историей и доброй сотней выпущенных устройств. За более чем 15 лет развития операционку и весь сопутствующий инструментарий доделывали, переделывали, обновляли и довели до того, что все стало дико сложно. Тут и язык, максимально напоминающий старый добрый C, который за уши притянули к паттернам и идеям ООП, и переживания по поводу совместимости с разными версиями платформы, сертификатах и прочих отвлекающих деталях.
Nokia постоянно пытается поправить ситуацию - портировали фреймворк Qt, библиотеки P.O.S.I.X, базовые компоненты STL и Boost, ряд ключевых API C++ (IOStreams и иже с ним). Есть отдельные проекты, позволяющие на Symbian-смартах запускать ПО, написанное на C#, Ruby, Python. Прибавь к этому сильное комьюнити, разнообразные поощряющие кампании для разработчиков... - и получишь примерную картину противоречивого мира Symbian-девелоперов.
Что до, собственно, продаж программ, - пока об этом можно не думать. Nokia анонсировала магазин ПО, который будет встраиваться в новые смарты, но пока непонятно, кого и как туда пустят. Во всех современных девайсах с интерфейсом S60 есть сервис Download!, куда финны пускают только супер-пупер компании с высоким статусом и очень толковыми продуктами. Еще существует все тот же GetJar, специализированный Handango и встроенный в сайт Nokia магазин, но это уже совсем другой User Experience, нежели покупка софта прямо с девайса.
В любом случае, - продать простенькую игру или программу в мире Symbian не удастся. Здесь другие интересы и желания. Symbian SDK предоставляет гигантские возможности и пользователи привыкли к максимально высокому функционалу. Но и стоит местное ПО не $5, а, как минимум, $25, а то и $50-70 (бывает и такое).
Вердикт:
Symbian-девелоперам лучше развиваться в сторону работы в софтверной компании, нежели в качестве индивидуального кодера. Вот это - действительно перспективно и пахнет зелеными купюрами!
Android
Справка:
Используемые языки низкоуровневого программирования: Java
Примерное количество проданных устройств: 1 миллион
Доля рынка: менее 1%
Количество выпущенных моделей телефонов: 6
Позитив:
Удобные средства разработки
Подробная документация
Бесплатность для разработчика
Негатив:
Крайне мало совместимых моделей
Система еще достаточно сырая
Специалисты мало востребованы на рынке
Google долго-долго смотрела на Symbian, Windows Mobile, BlackBerry, Palm и Apple, изучала их ошибки и проблемы, а потом задумала создать свою платформу, лишенную недостатков и, напротив, фонтанирующую достоинствами. Подход правильный, Энди Рубин -умничка, маркетологи тоже хорошо сработали, но пока получается не все гладко. Даже на завершившейся выставке MWC (в начале марта, -Прим. ред.) показаны всего два новых Андроида, предполагаемых для коммерческого использования: от Vodafone и HTC. Причем, оба внутри абсолютно одинаковые, как будто из одной бочки разливали.
Samsung и многие другие компании пообещали выпустить аппаратуру на базе Android, однако сложно говорить о популярности устройств в будущем.
Google удалось сформировать прекрасное комьюнити, привлечь большое количество разработчиков и подготовить для них подробную документацию с множеством примеров, удобную среду разработки. Это несомненные плюсы, вот только пока сложно получить за свою работу деньги, если Android-кодер, конечно, не работает на софтверную компанию с заказчиками в далекой Америке.
Вердикт:
Разумнее пока выступить в роли наблюдателя. На бумаге (и в обещаниях менеджеров) все красиво, а вот на деле у нас только три полуодинаковых телефона от HTC и много-много тематических новостей на блогах. Даже в этом материале наши эксперты упомянули об Android, но отдаваться этой платформе не спешат.
Windows Mobile
Справка:
Используемые языки низкоуровневого программирования: C++, С#.Net
Примерное количество проданных устройств: 50млн. с начала существования, 20 млн. в прошлом году
Доля рынка: 13%
Количество выпущенных моделей телефонов: более 30 новых моделей в прошлом году
Позитив:
Позволяет работать с железом на низком уровне
Удобные средства разработки
Качественная документация
Негатив:
ОС сильно отстает от современных требований
Устройства -преимущественно азиатского происхождения
Основные пользователи -корпорации и технофрики
Такое ощущение, что платформу намеренно загнали в тупик - она не отвечает современным требованиям к скорости работы интерфейса, мультимедийности, качеству, интеграции с Web и сервисами. В эпоху ярко-красочных AMOLED-экранов WinMo поддерживает всего 65 535 цветов и безбожно тормозит даже на самом крутом железе. Свеженькая версия 6.5 имеет новый макияж да пару неконцептуальных инноваций, которые не сильно исправляют положение.
В то же время платформа предоставляет беспрецедентно низкий уровень доступа к железу. Очень часто программы, которые можно сделать для WinMo, нельзя реализовать ни на одной другой платформе. Именно поэтому все промышленные коммуникаторы и разнообразные специализированные устройства делаются на этой ОС.
А еще ОС от Microsoft используют вкупе с самым передовым железом. Когда-то только на девайсах с Windows Mobile можно было встретить VGA-экраны и Wi-Fi. Теперь в Windows-телефоны ставят экраны с сумасшедшим разрешением 800х480, c которыми могут соревноваться только монстры японского рынка.
При всем обилии функций, мощном железе и богатых возможностях конечные устройства совершенно не удовлетворяют запросам современного пользователя, привыкшего к красочному и быстрому интерфейсу iPhone. У WinMo проблема таится глубоко внутри, в кривоватом коде и медленной разработке новых версий.
Вердикт:
Windows Mobile не умер и не умрет - Редмонд еще долго будет поддерживать свою ОС и пытаться исправить положение. Потерю популярности умный кодер может использовать для реализации своих амбиций. Ведь надо же создателям новеньких HTC что-то ставить на свои дорогие игрушки?
Эпилог
Ты наверняка ждешь заключения, где умные люди отправят тебя по нужному адресу, скажут, что скачать, поставить и на чем кодить. И напрасно ждешь. Это не имеет смысла без учетов сотни вторичных факторов и условий. Цель статьи - помочь тебе сделать правильный выбор, увидеть тренды и услышать мнения экспертов. А уже выводы придется рождать самому. Дерзай!
Мнения экспертов
ScienceSoft
Отрасли: телекоммуникации, финансовая сфера, здравоохранение, безопасность, инженерия, транспорт и сбыт
Мобильные платформы: Windows Mobile, Symbian, J2ME, Brew, Android
Подробнее: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]

О заказах: сейчас, скорее, мы объясняем клиенту, для какой платформы ему лучше разрабатывать ПО, нежели наоборот. Клиент
Вернуться к началу Перейти вниз
http://up-java.gip-gip.ru
Admin
Admin
Admin


Сообщения : 13
Дата регистрации : 2010-03-12
Возраст : 32
Откуда : Ялта

Хакинг игр! Empty
СообщениеТема: Re: Хакинг игр!   Хакинг игр! EmptyСб Мар 13, 2010 8:21 pm

В ПРОЦЕССЕ
Скачиваешь весь боекомплект ET Applets v2.22 весом 461 Кб. Весит прилично из-за большого количества примеров и документации, чувак поработал на славу, грех не воспользоваться плодами его труда. Для трепанации выберем один из апплетов, к примеру, ET_TextScroll. Остальные ломаются по аналогии, так как защита на всех стоит одинаковая. Отыскиваешь класс этого апплета, ET_TextScroll.class. Запускаешь NMI's Java Code Viewer и открываешь в нем ET_TextScroll.class, выделяешь мышкой и играючи выбираешь Process -> Decompile. Засекаешь ровно полсекунды Smile и получаешь готовый исходник. Далее запускаешь JBuilder и создаешь новый проект (File -> New Project). Проект надо назвать ET_TextScroll и прописать необходимые пути, потом при компиляции JBuilder выплюнет согласно этим настройкам готовый апплет и промежуточные файлы. Далее создаешь новый класс (File -> New Class), обзываешь его тоже ET_TextScroll и копируешь в него содержимое декомпилированного ET_TextScroll.java. Ничего не меняя в коде, запускаешь на компиляцию (Ctrl+Shift+F9), чтобы проверить на наличие ошибок, которые могли появиться при декомпиляции.
ОТЛОВ ОШИБОК ДЕКОМПИЛЯЦИИ
И две ошибки декомпиляции есть. Первая: при декомпиляции NMI's Java Code Viewer почему-то не прописал корректно все исключения, но это элементарно поправить ручками. Находишь все блоки перехвата исключений catch, к примеру, catch(MalformedURLException), и переписываешь как catch(MalformedURLException e).
Вторая: после декомпиляции в методе parseNext() вместо пробела почему-то прибавляется 32. Нужно заменить выражение space += 32 на space += ' '. Эта ошибка не мешает компиляции, но все пробелы в выводимом тексте будут заменяться числом 32.
private final void parseNext() {
--- кусок кода пропущен ---
case 32: // ' '
space += ' ';
--- кусок кода пропущен ---
НЕЙТРАЛИЗАЦИЯ ЗАЩИТЫ
После этих нехитрых телодвижений компиляция проходит без проблем. Теперь переходишь к изучению кода. А вот и защита, генерация ключа по домену и сверка с заданным происходит в методе isDemoVersion(), разберем подробнее:
private final boolean isDemoVersion() { // объявление метода
URL url1 = getDocumentBase(); // определение доменного имени
if(url1.getProtocol().equalsIgnoreCase("file")) // проверка, выполняется локально или в инете
return false; // если локально, то защита отключается
char ac[] = url1.getHost().toLowerCase ().toCharArray(); // из доменного имени создается символьный массив
int i = 23093; // какое-то целое число
for(int j = 0; j < ac.length; j++) // зацикливается на длину символьного массива
i ^= ac[j] << j % 8; // хитрая формула генерации ключа (присваивание с побитовым исключающим ИЛИ, сдвиг влево и деление по модулю)
for(StringTokenizer stringtokenizer = new StringTokenizer(getStr("NumericalKey", ""), ","); stringtokenizer.hasMoreTokens()Wink // перебор заданного ключа0 ВЗЛОМ JAVA-АППЛЕТОВ
Андрей Каролик
Xakep, номер #052, стр. 052-064-5

if(i == Integer.parseInt (stringtokenizer.nextToken().trim())) // сравнение заданного и сгенерированного ключей
return false; // если ключи одинаковые, то защита отключается
return true; // если ключи разные, то защита срабатывает
} // конец метода
Снимается защита элементарно. Нужно удалить все содержимое метода isDemoVersion() и при любом обращении к этому методу передавать логическое значение false (ложь). Остальными методами ложное значение isDemoVersion() воспринимается как сигнал для отключения защиты, что тебе и требовалось Smile.
private final boolean isDemoVersion() {
return false;
}
При этом больше в коде ничего править не обязательно, но можно почистить от мусора, который теперь выполняться не будет в принципе. К примеру, рекламный текст, появляющийся при срабатывании защиты, определяется переменной freeText. Он только утяжеляет код, так как никогда не будет использоваться, поэтому можешь смело его почикать. Дальше ты можешь изменять исходник по своим нуждам, сколько душе угодно. Главное, не перестарайся Smile. После всех манипуляций опять компилируешь (Ctrl+Shift+F9), и новый фриварный(!) апплет готов. По-моему, проще не бывает, и на фига платить 30 зеленых Smile.
ЦЕЛЬ НУМЕР ДВА
Вторым я решил ломануть какой-нибудь симпатичный апплет на [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] Приглянулся мне Shifter (http://javaboutique.internet.com/Shifter/index.html). Это пазл, работающий по принципу игры "Кубик Рубика". То есть перетаскиваются не отдельные квадратики (как в пятнашках), а взаимно смещаются целиковые строки или столбцы. Сперва пазл кажется очень легким, но когда начинаешь собирать, то понимаешь, что все не так просто. Самое прикольное, что разбивать предварительно картинку не надо, апплет это делает сам. Впечатление портит назойливая ссылка на сайт автора, ею и займемся.
В ПРОЦЕССЕ
Скачиваешь бинарник, на этот раз он заархивирован в архиве Shifter.jar. Сначала с помощью NMI's Java Code Viewer разархивируешь (File -> Extract Jar Archive), а потом декомпилируешь. Получаются три файла: основной класс (Shifter.java) и два класса-обработчика манипуляций с мышкой (Shifter$MouseMotionEventHandler.java и Shifter$MouseEventHandler.java). Создаешь в JBuilder проект Shifter.jpx и в нем три класса: Shifter.java, Shifter$MouseMotionEventHandler.java и Shifter$MouseEventHandler.java, копируя в них содержимое соответствующих декомпилированных файлов. Ничего не меняя в коде, запускаешь на компиляцию (Ctrl+Shift+F9), чтобы проверить на наличие ошибок, которые могли появиться при декомпиляции.
ОТЛОВ ОШИБОК ДЕКОМПИЛЯЦИИ
Ошибка всего одна. В методе run() зачем-то прописываются два совершенно нелогичных и бесполезных выражения: Shifter = this и Shifter 1 = this. Удали их или закомментируй.
НЕЙТРАЛИЗАЦИЯ ЗАЩИТЫ
В этом примере защита демо-версии реализована в виде статической вставки ссылки на сайт автора. Покопавшись в трех классах, видим, что защита прописана в Shifter$MouseEventHandler.java в методе mousePressed() и в Shifter.java в методе paint(), разберем подробнее ВЗЛОМ JAVA-АППЛЕТОВ
Андрей Каролик
Xakep, номер #052, стр. 052-064-6

Код:
public void mousePressed(MouseEvent mouseevent) { // обработка нажатия на кнопку мыши
this$0.mouseX = mouseevent.getX(); // получение текущего положения курсора мыши по горизонтали
this$0.mouseY = mouseevent.getY(); // получение текущего положения курсора мыши по вертикали
this$0.mousePressed = true; // выставление флажка
if(this$0.mouseY > this$0.AppletH - 24 && this$0.mouseX < 120) { // если курсор находится в прямоугольной области 120х24 пикселов в левом нижнем углу
this$0.mousePressed = false; // снятие флажка
try { // обработка исключения
URL url = new URL("http://www.eigelb.at"); // задается урл автора
AppletContext appletcontext = this$0.getAppletContext(); // ссылка на окно браузера, в котором загружен апплет
appletcontext.showDocument(url, "_blank"); // загрузка урла в новом окне браузера
}
catch(MalformedURLException malformedurlexception) { } // обработка исключения
this$0.mousePressed = false; // снятие флажка
} else { // если курсор не находится в прямоугольной области 120х24 пикселов в левом нижнем углу
this$0.dragStartX = this$0.mouseX; // начальная координата по горизонтали
this$0.dragStartY = this$0.mouseY; // начальная координата по вертикали
this$0.dragTracerX = 0; // обнуление траектории по горизонтали
this$0.dragTracerY = 0; // обнуление траектории по вертикали
this$0.dragStart = true; // выставление флажка
}
}
Достаточно удалить условный оператор if (this$0.mouseY > this$0.AppletH - 24 && this$0.mouseX < 120) и первую его ветвь:
public void mousePressed(MouseEvent mouseevent) {
this$0.mouseX = mouseevent.getX();
this$0.mouseY = mouseevent.getY();
this$0.mousePressed = true;
this$0.dragStartX = this$0.mouseX;
this$0.dragStartY = this$0.mouseY;
this$0.dragTracerX = 0;
this$0.dragTracerY = 0;
this$0.dragStart = true;
}
Этим ты убрал реакцию на клик мышкой по области, где написана ссылка на сайт автора. Теперь нужно удалить саму ссылку, которая прописана в Shifter.java в методе paint():
if(Zustand == 2) {
osg2.drawImage(offscreenImage, 0, 0, this); // прорисовка изображения в буфере
osg2.setColor(FarbeLinien); // цвет рамки
osg2.drawRect(0, 0, AppletW - 1, AppletH - 1); // прорисовка рамки
if(mouseY > AppletH - 24&& mouseX < 120) // если курсор находится в прямоугольной области 120х24 пикселов в левом нижнем углу
osg2.setColor(Color.black); // тогда ссылка пишется черным цветом
else
osg2.setColor(Color.gray); // иначе ссылка пишется серым цветом
osg2.drawString("http://www.eigelb.at", 10, AppletH - 10); // прорисовка ссылки
g.drawImage(offscreenImage2, 0, 0, this); // прорисовка изображения из буфера
}
Оставить нужно следующее:
if(Zustand == 2) {
osg2.drawImage(offscreenImage, 0, 0, this);
osg2.setColor(FarbeLinien);
osg2.drawRect(0, 0, AppletW - 1, AppletH - 1);
g.drawImage(offscreenImage2, 0, 0, this);
}
Вот и все, защиты как не бывало. Спокойно компилируй исходник в новый апплет. Если лениво паковать в *.jar, то в HTML-файле перепиши ссылку <applet code="Shifter.class" archive="Shifter.jar" width="256" height="256"> на <applet code="Shifter.class" width="256" height="256">. И выложи все три класса в ту же директорию, что и HTML-файл. Играйся на здоровье :).
ЗЛОМ JAVA-АППЛЕТОВ

Андрей Каролик
Xakep, номер #052, стр. 052-064-7

ЕЩЕ ПРИМЕРЫ
Я мог бы привести еще десятки примеров, но, к сожалению, статья не резиновая. Надеюсь, ты понял основные принципы снятия защиты. А дальше практика, практика и еще раз практика.
РЕСУРСЫ
Теперь тебе совершенно по барабану, какие и откуда тянуть апплеты. Если даже апплет и "загажен", берешь его за ноги как Буратино, вытряхиваешь исходник и точечным хирургическим вмешательством удаляешь ночной бред автора. Свободу попугаям Smile. Вот тебе наиболее крупные залежи апплетов:
[Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]

P.S.
Ломать апплеты иногда требуется не только для устранения защиты. Если даже апплет бесплатный и не содержит пакостных вставок, исходник может понадобиться, чтобы усложнить задумки автора для своих целей или использовать готовые куски кода в собственных апплетах. А чтение и разбор чужого кода - самый эффективный способ быстрому обучению программированию на Java. Этим занимаются даже матерые программеры, чтобы повышать свои профнавыки. Дерзай!
ЧТО ТАКОЕ JAVA-АППЛЕТ?
Java-апплет - это программка, работающая в среде браузера (запускается в окне браузера). Представляет она собой class-файл (*.class), который получается после компиляции java-файла (*.java), написанного на объектно-ориентированном языке Java. Широкое распространение апплеты получили благодаря своей особенности: исходник компилируется в команды виртуальной машины Java (JVM, Java Virtual Machine), и получаемый байт-код не зависит от типа процессора и архитектуры компьютера, на котором исполняется. От архитектуры зависит только виртуальная машина Java, которую можно надыбать на сайте производителя (SUN Microsystems, [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] совершенно бесплатно для любой из существующих сегодня компьютерных платформ. В последних версиях браузеров уже встроена JVM для выполнения апплетов, но по умолчанию может быть опционально отключена.
Другая особенность апплетов - все стандартные функции, вызываемые в программе, подключаются только на этапе выполнения и не включаются в байт-код. Эта динамическая компоновка, с одной стороны, сильно уменьшает объем откомпилированной программы, что было и пока еще остается критично для скоростей передачи по инету. Это несомненный плюс, но, с другой стороны, интерпретация байт-кода и динамическая компоновка значительно замедляют выполнение апплетов. Спасает более мощный процессор.
В HTML-файл апплет вставляется в виде ссылки с помощью тегов <applet> и </applet>, между которыми ставятся необходимые параметры апплета. Апплет выполняется на стороне клиента. Когда пользователь открывает твою пагу с апплетом, браузер загружает файл класса и запускает его на компьютере пользователя. Жалко, что возможности апплета в браузере сильно ограничены в целях безопасности Wink
ВЗЛОМ JAVA-АППЛЕТОВ
Андрей Каролик
Xakep, номер #052, стр. 052-064-8

NMI's Java Code Viewer v5.0
(в инете есть уже v6.0, но нет кряка)
сухая масса: ~2 Мб
сайт автора: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]

Windows 9x/NT/2000/XP, условно-бесплатная
данные для взлома: [ Name: Courtney Doutherd, Country: United States, Key: 1349877817 ]&~Мобильное укрощение
Крис Касперски
Хакер, номер #105, стр. 054
Основы взлома мобильных игр
Надоело платить за мобильные игры? Заколебала череда бесконечных смертей? Хочется переделать спрайты/тексты/заставку под свой вкус? Нет ничего проще! Мобильные игры весьма компактны и потому просты для взлома и анализа, а надругаться над ними по силам даже начинающему хакеру. Эта статья поможет ему сделать первые шаги, после которых он будет оттачивать хакерское мастерство уже самостоятельно.
Популярность мобильных игр стремительно растет. Они прочно оккупировали рынок сотовых телефонов, коммуникаторов, смартфонов, карманных компьютеров и других аналогичных устройств. Большинство игр распространяется на условно-бесплатной основе, когда необходимо платить, иначе блокируют часть возможностей и/или ограничивают количество запусков. Но даже полностью бесплатные игры не лишены недостатков. Неудобное управление, быстро кончающиеся жизни - да мало ли существует причин, побуждающих хакера дорабатывать код в соответствии со своими предпочтениями? Этические проблемы взлома нас не волнуют, поэтому мы немедленно переходим к технической части, благо хвост уже зудит, чешется и рвется в бой. О взломе мобильных игр написано много, но все как-то неконкретно и не в тему. Не так-то просто обобщить свой опыт и передать его другим. Но я все же попробовал.
Мобильные платформы
Основная масса мобильных игр (по некоторым оценкам аж до ~70%) пишется на Java, а точнее, на J2ME, что расшифровывается как Java 2 Micro Edition. Это урезанная версия языка Java, ориентированная на маломощные системы и поддерживающая огромное множество мобильных устройств. Вместо живого машинного кода, сотовому телефону подсовывают так называемый «байт-код , исполняющийся на виртуальной Java-машине (Java Virtual Machine, или сокращенно JVM). Теоретически игра, написанная для одного сотового телефона, будет работать на любом другом, независимо от особенностей его аппаратного обеспечения, что очень хорошо (хотя на практике переносимость намного хуже). Расплачиваться за это приходится драматическим падением производительности в условиях и без того маломощных микропроцессоров.
Продвинутые игры (наподобие Fight Hard 3D и RiderX 3D) пишутся на чистом машинном коде и потому могут исполняться только на микропроцессорах одного семейства (например, ARM 6), что ограничивает сферу их применения. В настоящей статье они не рассматриваются. Поскольку нельзя объять необъятное, мы сосредоточимся исключительно на взломе Java-приложений, а до Fight Hard доберемся не раньше, чем я куплю соответствующий сотовый телефон.
Чем мы будет ломать
Выбор хакерского инструментария - дело сугубо личное, индивидуальное и, можно даже сказать, интимное. Поэтому не следует воспринимать приведенный ниже список как догму. Это всего лишь один из вариантов. Практически все обозначенные утилиты реализованы в двух-трех вариантах, как консольных, так и графических. Так что каждый может найти программу на свой вкус. Предлагаемая подборка включает в себя только бесплатные программы, игнорируя их коммерческие аналоги, иначе это не хакерство получилось бы, а сплошной рекурсивный спуск (чтобы сломать мобильную игру, нужно хакнуть программу, которая ее ломает).
Прежде всего нам потребуется спецификация на байт-код виртуальной Java-машины, выложенная на официальном сайте корпорации Sun (на английском языке): [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] при этом знать сам язык Java нисколько не обязательно, хотя и желательно. Во всяком случае, я несколько лет успешно хачил Java-приложения непосредственно в JVM, пока, наконец, не купил «Горький вкус Java Брюса Тейта и не разобрался с основными языковыми концепциями, которые, кстати сказать, ничуть не облегчили ни дизассемблирование байт-кода, ни его анализ.
Лучшим дизассемблером Java-программ была и остается легендарная IDA Pro, распространяющаяся на коммерческой основе за нехилые деньги, однако при желании можно обойтись и без нее, воспользовавшись штатным дизассемблером, входящим в бесплатный Java SDK, или любой другой утилитой аналогичного назначения, коих в последнее время развелось как грибов (смотри JavaBite, описанный ниже).
Чтобы не корячиться над анализом байт-кода, имеет смысл прогнать ломаемое приложение через Java-декомпилятор, выдающий вполне читабельные и структурированные листинги. Java-декомпиляторов существует много. Хороших и разных. Я рекомендую бесплатный avaDec by wl, которым пользуюсь сам и который можно скачать с [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] Еще стоит попробовать JDecompiler с [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] Он тоже неплох и бесплатен. Декомпилированный код можно хачить прямо в исходных текстах с последующей рекомпиляцией, но я этого делать не рекомендую, поскольку декомпилятор не всегда работает корректно и повторная компиляция зачастую ведет к краху программы, поэтому лучше патчить непосредственно сам байт-код.
Для модификации байт-кода (то есть «бит-хака ) подойдет любой hex-редактор, например всем известный hiew, однако лучше использовать специализированные инструменты, лучшим из которых является бесплатный JavaBite by BitArts, наглядно отображающий дерево классов, а также включающий в себя дизассемблер и ассемблер байт-кода ([Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Мобильные игры, как правило, распространяются в виде упакованных jar-файлов, создаваемых одноименной утилитой, входящей в состав Java SDK, однако это не единственно возможный вариант. Архиваторы 7ZIP (бесплатный) и WinAce (условно-бесплатный) справляются со своей задачей ничуть не хуже. Исключение составляют Java-приложения, снабженные цифровыми подписями. Ни 7ZIP, ни WinAce их создавать не умеют, да этого и не требуется. Любой сотовый телефон загрузит jar-архив и без подписи.
Иногда рядом с jar-архивом лежит jad-файл, без которого некоторые модели телефонов откажутся загружать Java-приложение, и тут приходится прибегать к помощи бесплатной утилиты JADgen, генерирующей jad-файлы на основе jar-архивов (http://softsearch.ru/programs/134-892-jadgen-download.shtml).
Некоторые хакеры для проверки работоспособности взломанных игр рекомендуют использовать эмулятор сотового телефона, другие же предпочитают живое железо, тем более что закачать приложение на телефон не проблема. Однако при этом существует возможность завесить аппарат так, что придется вынимать батарею или даже делать полный reset, удерживая определенные клавиши при включении (у каждой модели телефона свои), описание которых можно найти в сервисной документации. Впрочем, риск угробить телефон некорректным взломом очень сильно преувеличен. В 90% случаев некорректный хак пресекается жутко матерящимся Java-верификатором. В 9% случаев игра просто зависает, подвешивая за собой весь телефон. И только на 1% приходится разрушение содержимого энергонезависимой памяти и прочий бэд, так что неуверенным в себе хакерам все-таки стоит пользоваться эмулятором.
Что мы будем ломать
А ломать мы будем милую игрушку Macroman (реинкарнацию культовой компьютерной игры, выпущенной в 1979 году японской компанией Namco Тору и реализованной практически на всех 8-битных компьютерах типа ZX-Spectrum), демонстрационная версия которой распространяется бесплатно и валяется практически на любом мобильном сайте: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Поставим себе задачу обессмертить колобка, чтобы игра никогда не кончалась. Главное -разобраться с техникой и стратегией взлома, освоив основные хакерские трюки и приемы. Остальные программы ломаются аналогичным образом, и неважно, что это - вечная жизнь или снятие ограничения с количества запусков.
Короче, кончай курить, мужики! Курить мы будет потом, а сейчас глотнем пива и возьмемся за дело.
Как мы будем ломать
Пускаем мы, значит, Macroman и даем ему умереть в зубах зловредных существ (типа приведений), агрессивно бегающих по лабиринту. На экране появляется надпись: «1 Life Left («Осталась одна жизнь ). Очевидно, что код, выводящий эту строку, так или иначе связан с кодом, уменьшающим количество жизней при каждом акте поедания колобка. Во всяком случае, во всех императивных языках программирования (к которым принадлежит и Java) ситуация обстоит именно так.
Вот эту строку мы и будем искать. Но сначала распакуем jar-архив, пропустив его через 7ZIP (предварительно изменив расширение с jar на zip). И вот что мы получим в результате:
Содержимое распакованного jar-архива с ломаемой игрой
META-INF // директория с файлом манифеста в текстовом формате
IMAGES // директория с изображениями лабиринта и спрайтов в png
MACROMAN // директория с файлом MacromanMidlet.class в байт-коде
b.class \
c.class |
d.class |
e.class +- файлы классов в байт-коде
f.class |
g.class /
Берем FAR (или любой другой файл-менеджер), давим <ALT-F7> (Search), вводим маску файлов «* (все файлы) и строку для поиска «Life Left , которую и обнаруживаем через секунду поиска в файле e.class, занимающем всего 19 Кб.
Прогнав e.class через JDec(или любой другой декомпилятор), мы получаем текстовой файл e.java размером порядка 36 Кб. Открываем его в FAR'е по <F4> (Edit), давим <F7> (Search) и вновь ищем строку «Life Left , затаившуюся в недрах следующего кода:
Декомпилированный фрагмент Java-программы, найденный поиском строки «Live Left
if(ax < 0) // <-переменная ax, хранящая в себе количество жизней
{
byte4 = 2;
as1 = new String[2];
as1[0] = "Game Over";
as1[1] = "HiScore: " + aq.e;
break;
}
if(ax == 1)
{
byte4 = 1;
as1 = new String[byte4];
as1[0] = ax + " Life Left"; // искомая строка
}
Машинная логика вполне стандартна и особых пояснений не требует. Если переменная ax становится меньше нуля, мы получаем «Game Over , в противном случае на экран выводится количество оставшихся жизней.
Следовательно, чтобы взломать программу, необходимо найти код, уменьшающий переменную ax на единицу при каждом акте смерти. А как мы его найдем? Да все тем же контекстным поиском! Ищем ax, анализируя прилегающий к ней код. Довольно быстро мы выкупим строку инициализации, устанавливающую начальный счетчик жизней, равный двум (на самом деле трем, поскольку смерть наступает, только если ax меньше нуля):
Фрагмент кода, отвечающий за начальное количество жизней
private byte ax;
...
av = 0;
ax = 2; ; // инициализация счетчика жизней
f.a(this, a4);
Можно, конечно, заменить строку «ax = 2 строкой «ax = 69 (например), но это порочный путь. Во-первых, вечной жизни мы все равно не обретем, а во-вторых, еще неизвестно, как программа отреагирует на такие издевательства (поскольку количество оставшихся жизней отображается в виде колобков внизу экрана, то при слишком большом их числе поведение программы рискует стать непредсказуемым и крышесрывательным).
Ладно, идем дальше... и видим заветную команду «ax-- в методе f(), уменьшающую значение переменной ax на единицу:
Декомпилированный фрагмент метода f(), уменьшающего переменную ax (счетчик жизней) на единицу
public void f()
{
MacromanMidlet.c();
as = 3;
removeCommand(b);
if(ay <= 10)
{
addCommand(a);
addCommand(e);
}
else
{
ax--; // <- вот здесь уменьшаются наши жизни!!!
if(ax < 0)
{
addCommand(a);
addCommand(e);
if(av > aq.e)
aq.e = av;
}
else
{
addCommand(f);
}
}
c();
}
Вот это - то, что нам нужно! Остается найти байт-код, соответствующий этой конструкции языка высокого уровня. Вот тут-то нам и пригодится IDA Pro, ну или утилита JavaBite. Открыв файл e.class в любой из этих программ, переходим к методу f() и внимательно исследуем код на предмет обращений к переменной ax.
Как легко увидеть, в методе f() обращение к переменной ax встречается дважды:
Фрагмент дизассемблированного байт-кода метода f(), уменьшающего переменную ax (счетчик жизней) на единицу
met016_44: ; CODE XREF: f_1+22^j
042 aload_0 ; var016_0
089 dup
180 001 199 getfield ax B ; // читаем переменную ax, закидывая ее на стек
004 iconst_1 ; // закидываем на стек константу 1
100 isub ; // стягиваем со стека две ячейки и вычитаем их
145 int2byte ; // преобразуем в int и забрасываем на стек
181 001 199 putfield ax B ; // обновляем содержимое переменной ax
042 aload_0 ; var016_0
180 001 199 getfield ax B
156 000 047 ifge met016_106
А что если заменить команду isub (опкод 64h/100) «парной ей командой iadd (опкод 60h/96)? Эту операцию легко осуществить в любом hex-редакторе, например в hiew'е. Просто ищем последовательность «042/089/180 001 199/004/100/145/181 001 199 (окружающую инструкцию isub) и меняем 100 на 96. Тогда при каждом столкновении со злобными приведениями количество жизней будет увеличиваться на единицу и... в конце концов, мы получим незапланированное переполнение, и наступит трындец. А нам трындеца не надо! Нам надо корректный взлом.
Хорошо! Попробуем заменить инструкцию isub командой nop (опкод 00h). Кстати говоря, это можно сделать прямо в JaveBite, не прибегая к помощи hiew'а. Достаточно подвести курсор к isub, щелкнуть правой кнопкой мыши и в появившемся контекстном меню выбрать пункт Edit Instuction. Откроется диалоговое окно со списком всех возможных команд. Находим nop, жмем OK и давим <Ctrl-S> (Save Class), чтобы сохранить результаты правки на диск.
Вот только результаты эти, мягко говоря, довольно удручающие. При запуске программы Java-верификатор завершает ее выполнение в принудительном порядке. Это в x86-процессорах, с их регистровой архитектурой, инструкцию SUB можно безболезненно менять на NOP. Виртуальная машина Java «исповедует иной принцип, и аргументы команды isub предварительно забрасываются на вершину стека в расчете на то, что она стащит их оттуда. Изменение isub на nop вызывает дисбаланс стека, и, чтобы восстановить статус-кво, необходимо также занопить и команду iconst_1. Инструкцию int2byte можно не трогать, поскольку она дает нулевой побочный эффект, сохраняя стек в том состоянии, в каком он был до ее вызова.
Короче говоря, корректно хакнутый байт-код выглядит так:
Байт-код, получивший «бессмертие
met016_44: ; CODE XREF: f_1+22^j
042 aload_0 ; var016_0
089 dup
180 001 199 getfield ax B ; // читаем переменную ax, закидывая ее на стек
000 nop ; // ничего не делаем
000 nop ; // ничего не делаем
145 int2byte ; // преобразуем в int и забрасываем на стек
181 001 199 putfield ax B ; // обновляем содержимое переменной ax
Мы сохраняем изменения в класс-файле по <Ctrl-S> (или по <F9>, если мы работаем в hiew'е) и нам остается только упаковать все файлы обратно в jar-архив и залить его на сотовый телефон. Для тестирования, так сказать.
При использовании WinAce достаточно выделить все файлы (включая каталоги), в типе архива указать JavaSoft-Jar и плюхнуться на ОК. А вот среди выходных форматов, поддерживаемых архиватором 7ZIP, никакого jar'а нет! То есть он, конечно, есть, просто называется ZIP'ом. В Archive format указываем ZIP, в Compression level -Normal, поле Compression method выставляем в Deflate. Остальные параметры оставляем по умолчанию - как есть. Главное - не забыть вместо расширения zip указать jar. Ну а имя файла может быть каким угодно.
Заливаем игру на телефон
Вот мы имеем свежехакнутый файл Macroman.jar. Будем заливать его на телефон? А то! Сделать это можно разными путями. Например, по инфракрасному порту, голубому зубу, прямому кабельному соединению или выкладывая файл на свой собственный http-сервер, а потом стягивая его оттуда через GPRS. В общем, вариантов множество. Лично я предпочитаю ИК.
Итак, игра залита на телефон и... дрожащими от волнения руками (все-таки, как-никак, наш первый взлом) мы едва попадаем по клавишам, запуская игру. О чудо!!! Она работает (то есть не падает)! И самое главное -счетчик жизней навечно застыл на отметке «2 . Мы обрели бессмертие, а вместе с тем утратили весь игровой азарт и интерес Smile. Ну какой интерес играть в игры? Вот ломать их -настоящий кайф!
Заключение, или что еще можно сделать
Вот мы и совершили наш первый взлом мобильной игры! Как видишь, ничего сложного и сверхъестественного в этом нет. Не маги программы ломают. Это доступно каждому! Главное - сделать первый шаг, а там уж поле деятельности практически безгранично. Можно заменить все текстовые строки, в том числе относящиеся к копирайту компании-создателя. Не то чтобы это было законно, но показывать друзьям мобилу с надписью «Hacked by... достаточно приятно.
Более творчески настроенные кодокопатели наверняка уже загружают спрайты в графический редактор, коверкая их в готическом хакерском стиле, или меняют логотип на заставке, который также находится в png-файлах, собранных в директории image.
Конечно, мы рассмотрели простейший случай взлома незащищенной программы. Некоторые игры и приложения тем или иным образом проверяют целостность байт-кода, а также пропускаются через обфускаторы, добавляющие «мусорные инструкции, которые отвлекают внимание и затрудняют анализ, но базовая техника взлома при этом все равно остается той же. «Найти и обезвредить - вот наш девиз! Знания приходят с опытом, а опыт - со временем, проведенным за ломанием игр. Да, и еще: не слишком-то распространяйся о своих хакерских наклонностях. А то ведь и повязать могут, хотя «взлом для себя закон не запрещает, но это уже тема совсем другого разговора.
WWW
Macroman- Java-игрушка, над которой мы издеваемся на протяжении всей статьи: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
The JavaTM Virtual Machine Specification Second Edition -официальная спецификация на байт-код Java-машины (на английском языке): [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
avaDec 0.9b by wl -хороший Java-декомпилятор, распространяемый на бесплатной основе: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
JDecompiler (Java Decompiler) 1.0- еще один хороший и абсолютно бесплатный декомпилятор для Java-программ: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
IDA PRO - лучший дизассемблер всех времен и народов, поддерживающий также и байт-код виртуальной Java-машины, распространяемый за нехилые деньги: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
JavaBite- дизассемблер, ассемблер и модификатор байт-кода JVM в одном флаконе, распространяемый бесплатно с кучей разных плагинов и прочих тулз: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
JADgen- бесплатный генератор jad-файлов, требуемых некоторыми моделями телефонов: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
7ZIP- бесплатный архиватор, позволяющий создавать в том числе и jar-архивы: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Winace 2.6 - условно-бесплатный архиватор, в явном виде поддерживающий формат jar: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Creating a JAR File -штатная утилита для работы с jar-архивами от компании Sun с возможностью создания цифровых подписей и прочих прибамбасов, бесплатная: [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку]
Bluejacking «У вас осталось 10 дней (J2ME) -познавательная статья, описывающая основы взлома мобильных игр на конкретных примерах для начинающих (на русском языке): [Вы должны быть зарегистрированы и подключены, чтобы видеть эту ссылку] вы не понимаете как взламать игру то попробуйте ее купить! Ето не опечатка, купите игру, только при одном условии- на вашем счету не должно быть много денег, например в четверть стоимости игры (чем меньше тем лучше ).
Суть этого взлома заключается в том что бывают случаи заказа полных игр через отправку sms из demo-игры.
Лично я с этим вплотную не сталкивался и таким взломом не занимался, а всего-навсего читал сообщения на форумах что у кого-то удалось активировать игру за 10 копеек
Вернуться к началу Перейти вниз
http://up-java.gip-gip.ru
 
Хакинг игр!
Вернуться к началу 
Страница 1 из 1

Права доступа к этому форуму:Вы не можете отвечать на сообщения
Upgrade-JAVA :: Моддинг JAVA-
Перейти: