ГлавнаяРегистрацияСтатистикаФорум
Навигация
Вход на сайт
Логин
Пароль
 
Фразы
A.n.T.i.K.
Делаю новый мод GD,слушаю EminEm!, Беларусь,Минск!

Неважно откуда ты,главное ты здесь!



Наши проекты
project3
project3


Опрос на сайте

Age Of Empires 3
Larry: Love For Sail
Shadowalker
Lost Planet: Trag Zero
UFO: Aftershock
Sims 2: Castaway
Spiderwick
Nowhere


Популярные статьи
» Tomb Raider 8: Underworld (от Eidos Mobile)
» 3D Racing Evolution
» Thief Run (от Glu Mobile)
» Flatout Mobile
» С Днём Рождения,Spid3r
» Snowboard Hero
» Zone of Alienation
» Ferrari GT: Evolution HD (от Gameloft)
» ONE Долгожданный релиз!
» Dogfight 1916' (от Global Fun/ Wireless Sharks Ltd.)

Архив новостей
Ноябрь 2008 (46)
Октябрь 2008 (36)
Сентябрь 2008 (33)
Август 2008 (30)
Июль 2008 (37)
Июнь 2008 (50)
Май 2008 (37)
Апрель 2008 (42)
Март 2008 (49)
Февраль 2008 (41)
Январь 2008 (31)
Декабрь 2007 (39)
Ноябрь 2007 (25)
Октябрь 2007 (32)
Сентябрь 2007 (31)
Август 2007 (18)

Статистика


Главная страница » Статьи » Программирование » Взлом Tanks Mobile
Взлом Tanks Mobile Статьи » Программирование
Автор статьи:  BlackFan
Редактор:  SlaDER

Рассмотрим возможность взлома J2me-игр на примере Tanks Mobile

Инструменты:

  • WinRAR (или другой архиватор который умеет работать с zip архивами), думаю что есть у всех.
  • Декомпилятор, я использую Java Decompiler.
  • Блокнот или любой другой текстовый редактор.
  • Сама игра… Tanks Mobile можно скачать с tanchiki.ru
    Разархивируем игру и смотрим содержимое:
  1. *.map – карты игры
  2. *.pngкартинки
  3. *.mid – музыка
  4. *.class – скомпилированный исходный код игры ( то что нам нужно)
Декомпилируем файлы *.class в Java Decompiler с включенной функцией «Deobfuscate»
Получаем файлы *.java ( исходный код игры), которые можно открыть любым текстовым редактором.
Рассмотрим содержимое этих файлов. В файле k.java находим такой кусок кода:

 

 if(m_aI == 1){

            q.m_bSprite.setFrame(2);

            q.m_bSprite.setPosition(getWidth() - 22, getHeight() - 20);

            q.m_bSprite.paint(g);

            q._aStringI("Благодарим вас за регистрацию! Приятной игры!"

                            , g, getWidth() - 15, getWidth() / 2, (getHeight() / 2 + q.m_agI) - 5, 1, true, true);

            return;

        }

        if(m_aI == 2){

            q.m_bSprite.setFrame(3);

            q.m_bSprite.setPosition(3, getHeight() - 20);

            q.m_bSprite.paint(g);

            q._aStringI("Неверный ключ. Обратитесь за помощью на сайт www.tanchiki.ru"

                            , g, getWidth() - 15, getWidth() / 2, (getHeight() / 2 + q.m_agI) - 5, 1, true, true);

            return;

        } 



То, что разработчики держали строки типа «Благодарим вас за регистрацию! Приятной игры!» в самом коде, очень облегчило нам задачу поиска, но так будет далеко не во всех играх. Чтобы регистрация прошла необходимо, чтобы переменная m_aI = 1

Ищем все, что связано с изменением этой переменной в файле k.java.
 И находим такой кусок кода:


_L6:
        int i = Integer.parseInt(m_aString);
        boolean flag = false;
        if(q.m_afI == 3)
        {
            long l;
            String s;
            long l1;
            l1 = (l1 = Integer.parseInt((s = String.valueOf(l = q.m_aeI)).substring(0, 1))
                       + Integer.parseInt(s.substring(1, 2)) + Integer.parseInt(s.substring(2, 3))
                       + Integer.parseInt(s.substring(3, 4)) + Integer.parseInt(s.substring(4, 5))
                       + Integer.parseInt(s.substring(5, 6)) + Integer.parseInt(s.substring(6, 7))) * 321L + 213L & 255L;
            if((s = String.valueOf(l = (l = (l = (l = (l = (l ^= 0x1c91bfL) ^ l1) ^ l1 << 8) ^ l1 << 16) << 3)
                                   * 3L + 2129L).substring(0, 7)).substring(0, 4).compareTo(m_aString.substring(1, 5)) == 0)
                flag = true;
        }
        if(flag)
        {
            m_aI = 1;
            q._aStringIV("temp", 2, i);
            q.m_eZ = true;
        } else
        {
            m_aI = 2;
        }
        this;
          goto _L8


Переменная m_aI=1, если flag==true. А переменная flag принимает значение true, если выполняется довольно громоздкая и непонятная проверка ( разработчики постарались wink).

В строчках:

       int i = Integer.parseInt(m_aString);


и


        l1 = (l1 = Integer.parseInt((s = String.valueOf(l = q.m_aeI)).substring(0, 1))
                            + Integer.parseInt(s.substring(1, 2)) + Integer.parseInt(s.substring(2, 3))
                            + Integer.parseInt(s.substring(3, 4)) + Integer.parseInt(s.substring(4, 5)) 
                            + Integer.parseInt(s.substring(5, 6)) + Integer.parseInt(s.substring(6, 7))) * 321L + 213L & 255L;


видим 2 неизвестные переменные:


       m_aString
       q.m_aeI


Сначала разберемся с q.m_aeI, так как l1 участвует в проверке кода.
Открываем q. java и ищем переменную m_ aeI. Мы находим ее только в строчке:


public static int m_aeI = 0;


Но этого недостаточно, так как получается, что в k.java вызывается переменная из q.java, которая равна нулю… Следовательно, ищем изменение этой переменной в остальных классах.
В i.java находим такие строчки:


       int k;
       if((k = q._aStringII("temp", 1, 0)) == 0){
                k = q._aIII(0xf462b, 0x98967f);
                k = 0x1c9c380 + k;
                q._aStringIV("temp", 1, k);
       }
      q.m_aeI = k % 0x989680;
      q.m_afI = (k - k % 0x989680) / 0x989680;
      obj = String.valueOf(k);
      obj = ((String) (obj)).substring(0, 4) + " " + ((String) (obj)).substring(4, 8);


Смотрим, какое значение получает переменная k при q._aIII(0xf462b, 0x98967f). Открываем q.java и ищем функцию _aIII


public static int _aIII(int i, int x){
        int i1;
        return (i1 = Math.abs(m_aRandom.nextInt())) % (x - i) + i;
    }


Исходя из этого переменной k задается случайное значение…
Проанализировав получаемые значения k, а так же исходя из этих строчек:


        obj = String.valueOf(k);
        obj = ((String) (obj)).substring(0, 4) + " " + ((String) (obj)).substring(4, 8);


и


        q.m_bString = "T" + obj + " " + s;


Получаем, что k это первые 8 цифр из 12-значного кода, которые генерируется в игре при первом запуске.

Теперь объединяем все воедино и пишем подбор ключа

Используемые переменные:

Kod – первые 8 цифр из кода, который генерируется при запуске игры
Kod1 – дополнительная переменная

             Klych – ключ который необходим для регистрации


   //вначале считываем код в переменную kod
   //далее идет объединенные части из разных классов, которые мы раскопали
        Kod1 = Kod % 0x989680;
        obj = String.valueOf(Kod);
        long l;
        String s;
        long l1;
        boolean progress=true;
        String Klych ="10000000";
        while(progress){
                    Klych = String.valueOf(Integer.parseInt(Klych)+1);
                    l1 = (l1 = Integer.parseInt((s = String.valueOf(l = Kod1)).substring(0, 1))
                    + Integer.parseInt(s.substring(1, 2)) + Integer.parseInt(s.substring(2, 3))
                    + Integer.parseInt(s.substring(3, 4)) + Integer.parseInt(s.substring(4, 5))
                    + Integer.parseInt(s.substring(5, 6)) + Integer.parseInt(s.substring(6, 7))) * 321L + 213L & 255L;
                            if((s = String.valueOf(l = (l = (l = (l = (l = (l ^= 0x1c91bfL) ^ l1) ^ l1 << 8) ^ l1 << 16) << 3)
                                            * 3L + 2129L).substring(0,7)).substring(0,4).compareTo(obj.substring(1, 5)) == 0){
                                            progress=false;
                            //вывод переменной Klych
       }
   }


Для ускорения перебора можно вынести:


       l1 = (l1 = Integer.parseInt((s = String.valueOf(l = Kod1)).substring(0, 1)) + ... + 213L & 255L;
 


и


         String.valueOf(l = (l = (l = (l = (l = (l ^= 0x1c91bfL) ^ l1) ^ l1 << 8) ^ l1 << 16) << 3) * 3L + 2129L).substring(0, 7);


за цикл,так же можно установить "шаг перебора" равным 1000.

Получаем следующий код:

          Kod1=Kod % 0x989680;
          long l;
          String s;
          String Klych  ="10000000";
          long l1;
          boolean progress=true;
                      l1 = (l1 = Integer.parseInt((s = String.valueOf(l = Kod1)).substring(0, 1))
                                    + Integer.parseInt(s.substring(1, 2)) + Integer.parseInt(s.substring(2, 3))
                                    + Integer.parseInt(s.substring(3, 4)) + Integer.parseInt(s.substring(4, 5)) 
                                    + Integer.parseInt(s.substring(5, 6)) + Integer.parseInt(s.substring(6, 7))) * 321L + 213L & 255L;
                      s = String.valueOf(l = (l = (l = (l = (l = (l ^= 0x1c91bfL) ^ l1) ^ l1 << 8) ^ l1 << 16) << 3) * 3L + 2129L).substring(0, 7);
          while(progress){
                      Klych = String.valueOf(Integer.parseInt(buf)+1000);
                         if ( s.substring(0, 4).compareTo(Klych.substring(1, 5)) == 0){
                                       //вывод Klych
                                      progress=false; 
                         }
          }


Теперь этот код можно перенести на любой другой язык программирования или оставить в J2ME.
Вместе со статьей идут два Key-Gen'а в котором он реализован… ( J2ME и VB.NET)
Вот так, просто анализируя код мы создали свой генератор ключей

Генераторы ключей для Tanks Mobile 3.0:
Внимание! У вас нет прав, для просмотра скрытого текста.
 
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.

Другие новости по теме:

  • Отображаем картинку (Программирование на J2me)
  • Реализация графического меню. Часть 1 (Программирование на J2me)
  • Hello, World! (Программирование на J2me)
  • Zone of Alienation
  • С чего начать? (Программирование на J2me)


  • #1 написал: SlaDER (24 августа 2007 15:19)
    Если сгенерированный ключ не подойдет, то переустановите игру и используя новый код попытайтесь снова.


    ___________________________
    Юзербар (userbar)
    #2 написал: BlackFan (27 августа 2007 00:26)
    Надеюсь хоть кто-нибуть что-нибуть поймет :)


    ___________________________
    Юзербар (userbar)
    #3 написал: xxxqwerx (27 августа 2007 18:34)
    Спасибо, работает smile


    ___________________________
    #4 написал: Syslic (18 сентября 2007 22:31)
    на сименсах не пашет!!!!!! там когда код наберешь, то на галочку уже никак не нажмешь, может кинете кракнутый Jar, на мыло bio_forever@rambler.ru


    ___________________________
    #5 написал: BlackFan (19 сентября 2007 13:38)
    Крякнутого jar нету, либо скачивай второй генератор для компа, либо напиши здесь свой код регистрации... я ключ напишу для него


    ___________________________
    Юзербар (userbar)
    #6 написал: Syslic (19 сентября 2007 22:47)
    да скочал я оба генератора, и ключи она выдают одинаковые проблема в другом:
    первое я записал код на листик(ОК)
    2-е ввел в строчке регистрации уже на самой мобиле(регистрация-ввести код)
    3- нужно нажать галочку - вот тут то и проблема, т.к. в игре у меня галока это 3, выбор это 5 так вот нажатие на любые кнопки ничего не дает, единственное это нажать на кнопкут звонка, тогда перекидывается в предыдущее менюшко, надеюсь нормально написал.

    слушай а нельзя просто отключить проверки регистрации перед восьмой миссией?
    или вообще парочку миссий убрать, и сразу 10-ую?


    ___________________________
    #7 написал: EvilTH (29 октября 2007 22:29)
    Спасибо за "глюч"(шутка) все подошло,просто при переустановке получилось,что игра не переустановилась,и даже не стерла старую,а просто установилась как совсем другая игра!Вот такие глюки со смартами бывают wink


    ___________________________
    #8 написал: Санек (21 декабря 2007 02:29)
    генератор для компа не работает выдает какую то ошибку


    ___________________________
    #9 написал: SlaDER (22 января 2008 14:49)
    Санек поставь FW 2.0 или 3.5. С XP идет 1.1


    ___________________________
    Юзербар (userbar)
    #10 написал: sfgsfhsjj (5 февраля 2008 20:26)
    Привет всем! BlackFan и SlaDER Вы бы не могли мне ответить на вопрос? Там в игре есть "Обменный пункт" с ним можно что-нибудь сделать? Я имею введу чтобы он СМС не отправлял, а монетки и звезды добавлялись.


    ___________________________
    #11 написал: BlackFan (5 февраля 2008 20:32)
    sfgsfhsjj, ну это уже совсем не интересно получается :)
    Можно попробовать отправлять смски, когда у тебя нехватает денег на отправку, но вот некоторые операторы могу снять деньги которые ты наотсылал когда у тебя они будут на счете


    ___________________________
    Юзербар (userbar)
    #12 написал: sanek999 (12 апреля 2008 19:22)
    в новой версии 4.0 непрокатывает кейген
    прогеры отнеслись с юмором к вашему кейгену wink регестрацтю засчитывает , но после 7 уровня по центру экрана слово из 3-х букв и надпись что нелегальный ключ


    ___________________________
    #13 написал: SlaDER (13 апреля 2008 08:41)
    sanek999, администратор нашего сайта BlackFan, как раз и помогал сделать новую защиту.


    ___________________________
    Юзербар (userbar)
    #14 написал: BlackFan (13 апреля 2008 13:29)
    Я просто пару советов дал :) Которыми кстати практически не воспользовались wink


    ___________________________
    Юзербар (userbar)
    #15 написал: Prohojii (27 апреля 2008 14:01)
    BlackFan, а как избавиться от этой "красивой" надписи? :)


    ___________________________
    #16 написал: BlackFan (28 апреля 2008 00:22)
    Prohojii, купить игру :)


    ___________________________
    Юзербар (userbar)
    #17 написал: kondr1 (14 мая 2008 15:45)
    Я купил игру а вместо кода прислали - (танчики)(монеты).Че делать?


    ___________________________
    #18 написал: SlaDER (15 мая 2008 08:19)
    Пиши разработчикам, мы то что можем сделать)


    ___________________________
    Юзербар (userbar)
    #19 написал: jjazz (19 мая 2008 12:00)
    никак не разберусь!!мозгов маловато recourse

    надо было более ясно написать,а то я никак не поиму что с чем сложить.


    ___________________________
    #20 написал: jarumi (3 июня 2008 17:33)
    не пашет кряк у мну, помогите с ключиком, пожалуйста:
    T3623 8004 7552


    ___________________________
    #21 написал: Vityok (22 июня 2008 10:54)
    А Ралли Мастер Про сможешь взломать, чтобы игра не конектилась к интернету?


    ___________________________
    #22 написал: crazymob (16 июля 2008 20:32)
    Спасибо за инструкцию. Будем пробовать.


    #23 написал: ArtemNKMZ (27 июля 2008 20:33)
    Спасибо большое все работает?Я рад что есть люди которые хотят и умеют помогать другим.


    ___________________________
    #24 написал: Slavin (15 августа 2008 21:51)
    а почему никак не скачать кейгены? перебрасывает на гл страницу...


    ___________________________
    #25 написал: ammiakk (16 августа 2008 01:31)
    Цитата: Slavin
    а почему никак не скачать кейгены? перебрасывает на гл страницу...

    выруби фаерволл


    ___________________________
    Юзербар (userbar)
    #26 написал: Slavin (16 августа 2008 14:33)
    о, спасибо большое:)
    так и не могу сесть и норм свой Аутпост настроить..)если вообще реально такую защиту лишь когда надо убирать...

    по крякам - спасибо тоже!:) на версию 2.3 подошло:)


    ___________________________
    #27 написал: Nzt 54 (17 сентября 2008 12:35)
    чет я не могу найти такой строчки, может редакция прознала про взломали изменила файлики? тута вышла новая версия 4.0может потому и защиту поменяли?... recourse


    ___________________________
    Информация
    Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
    Главная страница | Регистрация | Добавить новость | Новое на сайте | Статистика | Форум Copyright © 2007 - 2008. Alibom.net All Rights Reserved | Дизайнер: SlaDER