Ломаем наяву EGOiST/TSRh (icq: 8507375) Хакер, номер #088, стр. 088-074-3 [сравнительно] Предыдущий вариант - самый распространенный. Следующий пример игр имеет вид "недодемок". С того же сайта качаем игру Stack!. Проделываем все те же телодвижения, что и в прошлом примере: распаковываем, декомпилируем. Если заглянуть при игре в About, то видно упоминание о двухминутном ограничении, а также присутствует огромная надпись "DEMO" на игровом поле. Эта надпись еще и мигает, тем самым мешает сосредоточиться: о чем думали разработчики? В исходниках ищем строку "-DEMO-", нашлась в d.java и только в одном месте, что уже радует. магическая надпись if((m_bgI / 100 & 7) < 4) { m_GGraphics.setColor(0xffffff); m_GGraphics.drawString("-DEMO-", ((m_baI * m_aYI + m_pI) - m_GGraphics.getFont().stringWidth("-DEMO-")) / 2, a.m_bsI / 2, 20); } Блоком if контролируется мигание надписи. Тут-то и видно, что игра является именно демой, так как просто обойти эту надпись "легальными" методами нельзя. Как я говорил, надпись мигает, а значит, переменная m_bgI где-то нехило изменяется. Пробегись поиском по коду. Я думаю, ты заметил такое сравнение: "if(m_bgI > 0x1d4c0)". Число 0x1d4c0 записано в шестнадцатеричной системе, то есть равно 120000. А 120000 не что иное, как 2 минуты в миллисекундах, то есть это сравнение и влияет на завершение игры после 2-х минут. Но главное, что переменная m_bgI участвует во всех махинациях с деморежимом. секретный отсчет while(!m_SZ) { long l1 = System.currentTimeMillis(); if(b.m_cZ) { if(m_bhI != 0) { b._bIV(m_bhI); m_bhI = 0; } } else { m_bgI += 100; } a._dvV(); System.gc(); l1 = System.currentTimeMillis() - l1; try { if(l1 < (long)80) Thread.sleep((long)80 - l1); else Thread.sleep(20L); } catch(Exception _ex) { } Thread.yield(); } В функции run() к m_bgI прибавляется 100. Для получения эффекта мигания и для отсчета 2-х минут (при этом поток тормозится примерно на такое же время). Ты уже, наверное, наметил, что надо пропатчить? Чтобы убить триал, достаточно вместо 100 прибавлять 0. Двухминутный триал исчезнет, но надпись так и будет висеть, только не мигая и не так портя нам игру. Хм, но оставлять надпись тоже неправильно. Для показа надписи в блоке if было сравнение с числом 4, а так как надпись уже не мигает (то есть условие постоянно выполняется), достаточно поменять условие на противоположное (чтобы оно уже никогда не выполнялось). Этим и займемся. Я опять предлагаю использовать деобфусцированные классы, чтобы не терять время. Загружаем d.class в JavaBite. Итак, надо изменить 100 на 0 в прибавлении. Этот кусок кода находится в функции run() - ее и открываем. Обладателей небыстрых процессоров можно отправлять пить кофе. Поиска непредусмотрено, поэтому придется повозиться, чтобы найти этот небольшой кусочек. Нашелся он на строке 05BC. Загрузим число в стек "bipush 100" и добавим его к переменной "iadd". Меняй bipush 100" на "bipush 0". Теперь надо пропатчить показ надписи. Этот код находится в функции _aGraphicsV() - туда и следуем. На строке 0204 в стек загружается число 4 (iconst_4), перед этим идут вычисления с переменной m_bgI, а вот дальше есть сравнение "if_icmpge 023B". То же самое, что и "jge" в x86 ассемблере. Опять же надо изменить сравнение на прямо противоположное. Соответственно, заменяй на "if_icmple 023B". Осталось заменить классы в архив, и все - работает как положено. Можно еще сделать точно так же с надписью о том, что игра демо в about'е, но это уже на твоей совести. Почти то же самое представляют собой мидлеты с триалом на количество дней. Давай посмотрим на программу Biorhythm. Как всегда, сначала идет декомпиляция. Смотрим в g.java: |