Автор: verissimo

 

                                    Простейший взлом программы GoogleParser 1.3, написанной

                                    на языке Ява (Java, Джава). Для новичков.

                                              

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

Статья написана новичком, к тому же не программистом в расчете на таких же новичков, так что не судите строго.

Что будем ломать: GoogleParser 1.3. Программа предназначена для сбора гиперссылок из поисковой машины Google. Нужен вам, например, список адресов сайтов по тематике «варез» - вписываете слово «варез» в файл queries.txt и запускаете программу. На выходе получите список этих сайтов. Программа в определенной степени раритет и так просто ее уже не достать, но в конце статьи я дам ссылку, откуда ее можно будет скачать.

 

Часть I. Патч.

 

Что понадобится для взлома: 1) DJ Java Decompiler - можно взять на cracklab.ru, в разделе «Скачать – Декомпиляторы», 2) JavaBite – дизассемблер и редактор .class файлов (ссылка в конце статьи), 3) архиватор WinRar – можно найти в интернете самостоятельно.

Для того, чтобы программы, написанные на Яве, работали, надо установить на свой компьютер так называемую виртуальную машину Java Runtime Environment (JRE). Бесплатно скачать можно здесь http://java.sun.com/javase/downloads/index.jsp

Устанавливаем JRE на свой компьютер. Разархивируем в какой-нибудь каталог архив с GoogleParser 1.3. Получаем такую примерно картинку

Рис. 1

Кликаем два раза на файл с расширением .jar. Если программа запускается, то все нормально, если же вместо этого попадаем внутрь файла .jar (это обычный .zip архив, только с другим расширением), то меняем настройки нашего архиватора и/или файлового менеджера так, чтобы файлы с расширением .jar не ассоциировались с архивами. После запуска программы получаем примерно такую картинку (цифры в окошке могут быть другими):

Рис. 2

 

Итак, что мы видим? Мы должны выслать код автору, а он нам пришлет ключ, естественно за деньги. В программе нет никаких менюшек для регистрации, так что без файла с ключом не обойтись. На разных машинах цифры, которые надо выслать автору будут разными, поэтому одним ключевым файлом на все машины не обойтись – это называется привязка к конкретной машине.

Приступим к взлому. Сначала уясним себе, что программа на Яве состоит из модулей, называемых классам, а в классах полно функций (в Яве их обычно называют «методами») то есть строк типа ImyaFunktsii() после которых, между фигурными скобками, идут команды самой функции. Классы - это файлы, имеющие расширение .class. Откуда их взять в нашем конкретном случае? Для этого мы должны разархивировать файл GoogleParser-1.3.jar, то есть просто запустить WinRar и открыть в нем данный файл. После разархивации получим каталог GoogleParser-1.3, а в нём ещё три каталога – com, META-INFO и org. Пройдя по пути com\mangoseotools\googleparser находим классы, из которых состоит вся программа. Картинка выглядит так:

Рис. 3

Теперь надо найти нужный нам класс, то есть класс, в котором находится защитный код программы. Для этого возвратимся немного выше, в каталог GoogleParser-1.3, а из него спустимся в каталог META-INFO. В этом каталоге имеется файл MANIFEST.FM откроем этот файл с помощью любого текстового редактора и найдем строку “Main-Class: com.mangoseotools.googleparser.GoogleParser”. Строка эта означает, что при запуске программы первым в память загружается класс GoogleParser.class, а из него уже вызываются все прочие классы. Мы крэкеры начинающие и поэтому в поисках защиты будем просматривать класс за классом, но в определенном порядке. Сначала откроем в DJ Java Decompilere класс, с которого начинается загрузка, т. е. GoogleParser.class. Увидим текст, который можно немного понять, если знать английский язык, даже если сам не программист. Будем искать слова, которые по смыслу могли бы относится к защите программы (например, слово “key”, то есть «ключ»). Ничего подходящего по смыслу не находим. Следовательно, надо просматривать следующий класс. Какой же? В самом начале файла GoogleParser.class находим строку “public class GoogleParser extends GoogleParserFrame” что в переводе на русский означает следующее «публичный класс GoogleParser вызывает класс GoogleParserFrame». Следовательно, вторым по порядку будем просматривать GoogleParserFrame.class. Почти сразу же находим в нем строку   if(checkKey())”, то есть по-русски «если функция («проверка ключа») то надо сделать то-то и то-то», и ниже строки if(checkKey())” между фигурными скобками находим то, что вызывается при функции «проверка ключа» имеющей значение «истина» и при ином значении (после слова else – «иначе»). Видим, что после слова else идет куча всяких строк, среди которых строка  «code.add(((java.awt.Component) (new GPLabel("Send this code via icq 253-880-089"))));» то есть строка именно с тем текстом, который появляется при запуске программы (см. рис. 2).

Итак, участок кода, отвечающий за защиту, почти найден. Взломать можно уже и здесь, но для этого надо уметь отлавливать ошибки, возникающие при декомпиляции и соответственно перекомпилировать класс обратно. Изменение кода, делающее программу работоспособной делается просто: участок кода, имеющий вид

 

if(checkKey())

        {

            initOk();

        } else

        {

            GPPanel code = new GPPanel();

            GPTextField codeField = new GPTextField(20);

            codeField.setText(new String(((String) (Math.abs(googleCH(stringOrd(pr.getProperty("user.name"))))))));

            code.setLayout(((java.awt.LayoutManager) (new FlowLayout())));

            code.add(((java.awt.Component) (new GPLabel("Send this code via icq 253-880-089"))));

            code.add(((java.awt.Component) (codeField)));

            c.add(((java.awt.Component) (code)), "Center");

        }

 

заменяется на код

 

if(checkKey())

        {

            initOk();

        } else

        {

            initOk();

        }

 

то есть мы делаем так, что при любом значении функции «проверка ключа» будь то «истина» или «ложь» вызывается одна и та же функция initOk(), название которой в переводе на русский гласит «инициализация о’кей» или «инициализация прошла успешно». После этого отредактированный класс надо скомпилировать заново и вновь собрать файл GoogleParser-1.3.jar, исправив ошибки декомпиляции. Для этого нужны некоторые навыки программирования, которыми  я не обладаю и которыми, думаю, не обладают многие из новичков. Поэтому я пошел по другому пути – отыскал функцию checkKey() и отредактировал всего один байт с помощью программы JavaBite (название программы основано на игре слов – bite «кусать» и byte «байт» произносятся одинаково). Прелесть данной программы в том, что она позволяет получить готовый к использованию класс, не нуждающийся в перекомпиляции. Однако та наглядность кода, которая имеется при использовании DJ Java Decompiler’а, частично пропадает и появляется необходимость выучить пару команд виртуальной машины Ява и соответствующие мнемонические обозначения.

Установим сначала JavaBite. Для этого распакуем куда-нибудь архив с программой, создадим там новый ярлык для файла jbloader.exe и вынесем этот ярлык (shortcut), куда нам удобно, например на рабочий стол Windows. Запускать JavaBite будем двойным кликом мышки по этому ярлыку.

Теперь отыщем функцию checkKey(), сначала с помощью DJ Java Decompiler’а. Функция  обнаруживается в том же самом классе, в котором находится функция if(checkKey()), то есть в файле GoogleParserFrame.class. Функция имеет следующий вид:

 

private boolean checkKey()

    {

        try

        {

            Properties pr = System.getProperties();

            if(Math.abs(googleCH(stringOrd(pr.getProperty("user.name")))) >>> 3 == Integer.parseInt(readFile()))

                return true;

        }

        catch(Exception exception) { }

        return false;

    }

 

            Прочитаем этот текст, как  простой английский текст, лишь немного опираясь на азы программирования. Что мы поймем? То, что данная функция логическая (boolean), а, следовательно, может принимать только два значения «истина» и «ложь», чему в тексте кода соответствуют две строки “return true” (возвратить истину) и “return false” (возвратить ложь). Слово “return” в большинстве книг по программированию переводится именно как «возвратить (какое-либо значение функции)». Это немного не по-русски, но оставим так, как есть. Будем только иметь в виду, что «возвратить значение» означает не «получить какое-либо значение и вернуть его в неизменном виде», а означает «передать значение функции, полученное в результате её работы в ответ на запрос (вызов) из какого-либо места программы», причем запрос (вызов) может никак не влиять на значение функции, т. е. может и не передавать функции никаких данных для обработки.

            Как мы видели выше, функция checkKey() вызывается функцией if(checkKey()) (условным оператором «если») и в случае, если функция checkKey() не имеет значения «истина», то программа не работает и выскакивает окошко с информацией для регистрации (см. рис 2). Значит, нам надо изменить код программы таким образом, чтобы функция checkKey() всегда отдавала значение «истина», то есть “return false” надо заменить ещё на одну строку “return true”.

            Запустим JavaBite и откроем в этой программе файл GoogleParserFrame.class (меню Classes -> Add Java Class). В левом окне JavaBitea нажмем на квадратик с плюсиком и получим примерно такую картинку:

            Рис. 4

 

 

            Красной стрелкой указано место, где искать функцию checkKey() (функции написанные автором программы называются «методами», а стандартные, являющиеся принадлежность самого языка программирования, называются просто функции. В этом состоит терминологическое различие между «методами» и «функциями» в Яве и некоторых других языках).

            Идём дальше. Нажимаем на квадратик с крестиком возле слова “Methods”. Получаем такую картинку:

           


            Рис. 5

 

            Кликаем мышкой на слове checkKey и получаем следующую картинку:

            Рис. 6

 

            Смотрим правое окно программы, там, где красные стрелки. Что бросается в глаза?

Наличие двух слов ireturn. Логично предположить, что это команды “return true” (возвратить истину) и “return false” (возвратить ложь), которые мы уже видели при просмотре файла GoogleParserFrame.class декомпилятором DJ Java Decompiler. Соответственно самая нижняя, напротив числа 0028 это “return false”, а та, что повыше, напротив номера 0022 - “return true”.  Однако тут, в JavaBite, имеем код виртуальной машины и после ireturn не следует никаких ни “true”, ни “true”, и вообще подобных слов нигде в правом окне JavaBitea не встречается. Где же найти эти “true” и “false”? Придется вспомнить (а для тех, кто не знал – узнать), что boolean (характеристика функции checkKey) переводится не только как «логический», но и как «булев».  С чего бы это? А с того, что именно английский математик Джордж Буль придумал «булеву алгебру», представляющую собой  символьную запись операций обычной формальной логики. При этом в целях «математизации» такие понятия логики как «истина» и «ложь» были заменены на числовые значения, 1 и 0 соответственно. В таком виде булева алгебра и перекочевала в программирование. Следовательно, надо искать не “true” и “false”, а 1 и 0. Взяв в руки справочник по виртуальной машине Ява, находим (путем перебора всех слов из правого окна JavaBitea подходящие инструкции, а именно iconst_1 и iconst_0. Данные инструкции означают «положить на вершину стека целую постоянную», единицу и ноль соответственно. Немного о стеке. Стек, условно говоря, это обойма с патронами, только вместо патронов в обойму вставляются различные числа, представляющие собой или инструкции  процессора или данные для этих инструкций, а сама обойма представляет собой участок памяти ЭВМ. Как из обоймы последним выходит патрон, вложенный туда первым, а первым выходит патрон, вложенный последним, точно в таком же порядке из стека выходят данные и инструкции для процессора. Теперь глянем еще раз в справочник по виртуальной машине, на этот раз по поводу ireturn. Узнаем, что данная инструкции отдает (возвращает) в место вызова число, находящееся в стеке прямо под ней, то есть в нашем случае 1 или 0 (iconst_1 и iconst_0 – см. рис. 6). Становится понятно, что “iconst_1 ireturn” соответствует “return true”, а “iconst_0 ireturn” соответствует “return false. Нам надо заменить “false” на “true”, что равносильно замене “iconst_0  на “iconst_1.  Делаем это в JavaBite. Кликаем мышкой один раз на строке с “iconst_0, тем самым выделяя её. Затем нажимаем на правую кнопку мыши и в контекстном меню выбираем “Edit instruction”. На картинке это выглядит так:

            Рис. 7

 

            Нажимаем на кнопочку с треугольником на которую указывает красная стрелка, в выпадающем меню выбираем iconst_1 и жмем кнопку ОК. Всё, класс отредактирован. Жмем Alt + S и пропатченный нами класс сохранен под тем же именем. Можем открыть его в DJ Java Decompiler’е и убедиться, что в функции checkKey теперь имеется две строки “return true” и ни одной строки “return false”. Осталось заменить пропатченным файлом GoogleParserFrame.class одноимённый класс в GoogleParser-1.3.jar. Для этого используем WinRar, но сначала для удобства скопируем пропатченный GoogleParserFrame.class в тот каталог, где у нас находится GoogleParser-1.3.jar. Все остальные файлы, полученные после разархивации GoogleParser-1.3.jar можно стереть с диска – они нам больше не нужны. Откроем GoogleParser-1.3.jar в WinRar’e и пройдем по пути GoogleParser-1.3.jar\com\mangoseotools\googleparser туда, где лежат классы. Свернем WinRar в панель быстрого запуска, нажав на кнопку с минусом в правом верхнем углу окна WinRar’a  и перейдем в каталог где у нас лежит пропатченный класс и файл GoogleParser-1.3.jar. Получим примерно такую картинку:

            Рис. 8

 

или такую картинку

            Рис. 9

 

Кликаем мышкой один раз на файле GoogleParserFrame.class, а затем нажав на правую кнопку и не опуская её перетаскиваем файл GoogleParserFrame.class и отпускаем его на свернутый WinRar. После этого WinRar выдаст надпись «Heкoтopыe извлeчeнныe из GoogleParser-1.3.jar фaйлы измeнилиcь, либo были coздaны нoвыe фaйлы. Xoтитe дoбaвить иx в apxив?» Ответить утвердительно, нажав соответствующую кнопку. Кликаем два раза на GoogleParser-1.3.jar и получаем примерно такую картинку:

 

 

Рис. 10

 

Всё, парсер Гугля пропатчен и готов к работе.

 

                                                           Часть II. Кейген.

 

            В чём преимущество генератора ключа (key generator, keygen, keymaker, ключеделка) перед патчем (patch – заплатка)? Патч – это изменение кода программы и если программа достаточно сложная, то можно легко ошибиться и пропатченная программа не будет работать, будет работать лишь с частью функции или выдавать при работе какие-либо ошибки, являющиеся следствием неправильного патча. К тому же патч обычно годится только для одной версии программы и при выходе следующей версии в большинстве случаев оказывается бесполезен. Генератор ключа никак не затрагивает код нужной программы и в большинстве случаев генерирует ключи, подходящие для нескольких версий. Что такое ключ? Ключ – это некоторая последовательность символов, хранящаяся обычно в специальном файле или в реестре, которая свидетельствует о легальности используемой копии программы и обеспечивает её полную работоспособность. Алгоритм проверки подлинности ключа всегда находится в самой программе и поэтому при достаточных знаниях этот алгоритм всегда можно извлечь из кода и на его основе составить другой алгоритм и соответствующий программный код, который будет генерировать ключ, не отличимый от подлинного. В большинстве случаев ключ создается программой на основе другой последовательности символов, также генерируемой программой и называемой серийным номером. Серийный номер зависит либо от характеристик ЭВМ, либо от вводимых пользователем некоторых индивидуальных для него сведений (часто это имя или ник и адрес электронной почты). Серийный номер, генерируемый на основании ввода пользователем личных данных, часто по своей функции является ключом, хотя продолжает именоваться серийным номером.

Рассмотрим подробнее уже найденную нами функцию проверки ключа checkKey()  в исследуемой программе GoogleParser-1.3. Для этого опять воспользуемся DJ Java Decompiler’ом, в котором откроем уже известный нам файл GoogleParserFrame.class. Что мы видим? Ответ «истина» передается к месту вызова только если выполняется условие

 

if(Math.abs(googleCH(stringOrd(pr.getProperty("user.name")))) >>> 3 == Integer.parseInt(readFile()))

 

Попытаемся прочитать эту строку опираясь только на знание английского языка. Получим что-то вроде «если куча непонятного в скобках три раза больше, тройка равна целому, извлеченному из прочитанного файла». Что мы из этого узнали? То, что ключ хранится в каком-то файле и представляет собой целое число. Теперь надо узнать в каком же именно файле хранится ключ. Для этого ищем функцию readFile() (прочитать файл). Функция обнаруживается опять таки в файле GoogleParserFrame.class и выглядит следующим образом:

 

 

 

 

 

 

private String readFile()

    {

        String fileContent = "0";

        try

        {

            BufferedReader in = new BufferedReader(((java.io.Reader) (new FileReader("key.key"))));

            String line;

            while((line = in.readLine()) != null)

            {

                fileContent = fileContent + line;

                fileContent = fileContent + "\n";

            }

            in.close();

        }

        catch(Exception exception) { }

        fileContent = fileContent.trim();

        return fileContent;

    }

 

Из всего текста данной функции нам нужно только название файла. Очевидно, что это key.key, поскольку именно перед key.key стоит функция FileReader (читатель файла в переводе), а также потому, что key.key имеет формат, характерный для названий файлов, т. е. «имя-точка-расширение».

Поскольку никаких каталожных путей для файла key.key не указано, то должен он находиться в одном каталоге с программой, т. е. в одном каталоге (директории) с файлом GoogleParser-1.3.jar. Итак, вот что мы уже знаем о ключе: ключ представляет собой целое число, находящееся в файле key.key. Осталось выяснить, что это за число. Снова возвращаемся к строке

 

if(Math.abs(googleCH(stringOrd(pr.getProperty("user.name")))) >>> 3 == Integer.parseInt(readFile()))

 

Берем теперь функцию GoogleParserFrame(), находящуюся в том же файле GoogleParserFrame.class

 

 

public GoogleParserFrame()

    {

        часть кода не приводится как не представляющая интереса

        if(checkKey())

        {

            initOk();

        } else

        {

            GPPanel code = new GPPanel();

            GPTextField codeField = new GPTextField(20);

            codeField.setText(new String(((String) (Math.abs(googleCH(stringOrd(pr.getProperty("user.name"))))))));

            code.setLayout(((java.awt.LayoutManager) (new FlowLayout())));

            code.add(((java.awt.Component) (new GPLabel("Send this code via icq 253-880-089"))));

            code.add(((java.awt.Component) (codeField)));

            c.add(((java.awt.Component) (code)), "Center");

        }

        validate();

        repaint();

    }

 

Что мы видим? Что и в функции checkKey() и в функции GoogleParserFrame() имеется одна и та же последовательность символов, а именно

 

(Math.abs(googleCH(stringOrd(pr.getProperty("user.name"))))

 

причем в функции checkKey() данная последовательность включена в функцию проверки ключа, а в  функции GoogleParserFrame() данной последовательности предшествуют слова codeField.setText(new String(((String), что в переводе звучит примерно как «поле кода – вписать текст, новую строку». Вероятно, что строка кода (Math.abs(googleCH(stringOrd(pr.getProperty("user.name"))))  генерирует именно то число, которое мы видели при запуске программы в окне с просьбой прислать это число по аське (см. рис. 2). Исходя из этого предположения, вернемся к строке

 

if(Math.abs(googleCH(stringOrd(pr.getProperty("user.name")))) >>> 3 == Integer.parseInt(readFile()))

 

Видим, что для того, чтобы число 1806155026 (у вас будет другое число, показываемое непропатченным парсером при запуске) совпало с ключём, полученным из файл key.key над ним надо еще провести операцию, обозначенную как >>> 3. Без знаний программирования тут не обойтись и придется покопаться в справочнике. Из справочника или учебника по Яве узнаем, что выражение «>>> 3» означает двоичный сдвиг вправо на три разряд. Что это значит? Это значит, что некоторое число (в моем случае это 1806155026, а у вас будет другое) преобразуется в двоичную систему счисления, затем из двоичного представления отбрасываются три цифры справа и полученное число вновь преобразуется в обычный для нас, десятичный, вид. Все эти операции можно осуществить на встроенном в ОС Windows калькуляторе, предварительно переключив его в режим инженерных расчетов (View -> Scientific). Берем число 1806155026 (вы вставляете свое число) и копируем его в окошко калькулятора. Затем вставляем точку в кружок в надписью Bin (радиокнопка «двоичное представление»). Получаем число 1806155026 в двоичном представлении – 1101011101001111011110100010010. Нажимаем Ctrl+C, открываем Notepad, жмём Ctrl+V, затем три раза нажимаем на Backspace, жмём Ctrl+A, затем Ctrl+C, снова открываем окно калькулятора, ставим точку в кружок в надписью Bin, жмём Ctrl+V и ставим точку в кружок в надписью Dec (радиокнопка «десятичное представление») получаем десятичное число, которое, по-видимому, и является ключом. Я получил 225769378, у вас будет другое число. Проверяем - ключ ли это. Открываем Notepad и копируем туда 225769378 первой строкой. Сохраняем файл под именем key.key и помещаем этот файл в один каталог с непропатченным GoogleParser-1.3.jar. Если все сделано правильно, то парсер должен запуститься и должна появиться картинка такая же, как и на рис. 10. Следовательно, ключ мы нашли правильно. Итак, порядок (алгоритм) создания ключа будет выглядеть следующим образом: 1) запускаем парсер и копируем куда-нибудь показываемое парсером число (см. рис. 2); 2) осуществляем двоичный сдвиг данного числа вправо на три двоичных знака; 3) полученное после сдвига десятичное число помещаем первой строкой в файл key.key; 4) файл key.key копируем в каталог, где находится парсер GoogleParser-1.3.jar. Остается этот алгоритм автоматизировать, то есть написать маленькую программку, кейген. Без знаний программирования тут уже не обойтись, но знания нужны самые минимальные. Расскажу как и на чём кейген для этого парсера писал я, а вы можете повторить мой путь или же изучить другой язык программирования и написать кейген на нём.

Написал я кейген на скриптовом языке autohotkey (бесплатно скачать можно отсюда - http://www.autohotkey.com/download/AutoHotkeyInstall.exe - размер 1,75 мегабайта), поскольку это был единственный язык программирования, который я когда-либо использовал. Программы там пишутся в обычном текстовом редакторе, можно в Notepad’e и сохраняются  с расширением .ahk после чего их можно запускать. При желании программу можно скомпилировать в .exe файл. У данного языка хорошая справка с многочисленными примерами, правда только на английском языке. Названия команд несут смысловую нагрузку (для знающих английский язык) и поэтому относительно легко запоминаются. Начал я написание генератора ключа с трёх команд – оператора присваивания, команды двоичного сдвига и команды записи в файл. Первый вариант кейгена состоял всего из двух строк и выглядел так

 

key := 1806155026>>3 ; переменной key присваивается значение, полученное двоичным                                                                                         сдвигом числа 1806155026 на 3 знака вправо

 

FileAppend, %key%, key.key ; запись полученного значения в файл key.key

 

Файл key.key затем копировался средствами операционной системы в папку с парсером и парсер работал. Если мне надо было сгенерировать код для другой машины, то в текстовом редакторе я менял 1806155026 на нужное мне число и снова запускал этот примитивный кейген. Поскольку перед генерированием нового ключа каждый раз надо было удалять старый файл key.key (иначе новый ключ правильно не создавался) я ввёл ещё одну команду – удаление файла. Кейген стал выглядеть так:

 

key := 1806155026>>3 ; переменной key присваивается значение, полученное двоичным сдвигом числа на 3 знака                                      вправо

 

IfExist, key.key                    ; проверка существования файла key.key

FileDelete, key.key              ; если файл key.key существует, то он удаляется

 

Sleep, 500                                             ; пауза в полсекунды чтобы успеть удалить файл key.key

 

FileAppend, %key%, key.key          ; запись полученного значения в файл key.key

 

Утомительно редактировать каждый раз кейген в текстовом редакторе, чтобы создать ключ для новой машины. Поэтому надо написать интерфейс с полем для ввода данных. Для этого имеется специальная программка smartgui. Скачать можно отсюда -  http://www.autohotkey.com/download/smartgui.zip  (размер 276 килобайт). Интерфейс кейгена был незатейлив – две кнопки, окошко для ввода числа и пара надписей.

Код интерфейса получился таким:

 

Gui, Add, Edit, x34 y35 w196 h26, 

Gui, Add, Text, x35 y19 w194 h16,Введите код`, показанный парсером

Gui, Add, Button, x36 y69 w57 h23, Generate

Gui, Add, Button, x101 y69 w57 h23, Cancel

Gui, Show, x282 y110 h113 w290, Mango Google Parser 1.3 keygen

 

А внешний вид - таким:

 

            Рис. 11

 

Осталось совместить алгоритм генерации ключа с интерфейсом. Для этого пришлось ввести ещё одну переменную, code, в которой бы хранилось число, вводимое в кейген. Код кейгена стал таким:

 

Gui, Add, Edit, x34 y35 w196 h26 vcode         ; в переменную code  помещается значение, введенное в кейген

Gui, Add, Text, x35 y19 w194 h16,Введите код, показанный парсером

Gui, Add, Button, x36 y69 w57 h23, Generate

Gui, Add, Button, x101 y69 w57 h23, Cancel

Gui, Show, x282 y110 h113 w290, Mango Google Parser 1.3 keygen

Return

 

ButtonGenerate: ;при нажатии на кнопку Generate выполняются команды между фигурными скобками, т. е. происходит генерация ключа

{

Gui, Submit

key := code>>3 ; переменной key присваивается значение, полученное двоичным сдвигом значения переменной code на 3 знака вправо

 

IfExist, key.key                    ; проверка существования файла key.key

FileDelete, key.key              ; если файл key.key существует, то он удаляется

 

Sleep, 500                             ; пауза в полсекунды чтобы успеть удалить файл key.key

 

FileAppend, %key%, key.key ; запись полученного значения в файл key.key

ExitApp ; кейген выгружается из памяти после генерирования ключа

}

 

ButtonCancel: ; при нажатии на кнопку Cancel кейген выгружается из памяти

GuiClose: ; при нажатии на кнопку c крестиком кейген выгружается из памяти

ExitApp ; кейген выгружается из памяти

 

 

            Вышеприведённый код исполняет все шаги алгоритма генерации ключа, кроме самого последнего – копирования файла key.key в каталог с парсером. Копирование можно осуществить средствами операционной системы, а можно и дописать кейген, чтобы он сам копировал ключ в выбранный нами каталог (папку). Для этого понадобится ещё две команды и кейген станет выглядеть так:

 

Gui, Add, Edit, x34 y35 w196 h26 vcode         ; в переменную code  помещается значение, введенное в кейген

Gui, Add, Text, x35 y19 w194 h16,Введите код`, показанный парсером

Gui, Add, Button, x36 y69 w57 h23, Generate

Gui, Add, Button, x101 y69 w57 h23, Cancel

Gui, Show, x282 y110 h113 w290, Mango Google Parser 1.3 keygen

Return

 

ButtonGenerate: ;при нажатии на кнопку Generate выполняются команды между фигурными скобками, т. е. происходит                              генерация ключа

{

Gui, Submit

key := code>>3 ; переменной key присваивается значение, полученное двоичным сдвигом значения переменной code на 3                         знака вправо

 

IfExist, key.key                    ; проверка существования файла key.key

FileDelete, key.key              ; если файл key.key существует, то он удаляется

 

Sleep, 500                                             ; пауза в полсекунды чтобы успеть удалить файл key.key

 

FileAppend, %key%, key.key ; запись полученного значения в файл key.key

 

FileSelectFolder, Folder, , , Выберите папку, куда надо скопировать ключ ; Выбор каталога куда надо скопировать ключ

 

FileCopy,  %A_WorkingDir%\key.key, %Folder%\key.key, 1 ; копирование ключа в выбранный каталог (папку)

 

ExitApp ; кейген выгружается из памяти после генерирования ключа

}

 

ButtonCancel: ; при нажатии на кнопку Cancel кейген выгружается из памяти

GuiClose: ; при нажатии на кнопку c крестиком кейген выгружается из памяти

ExitApp ; кейген выгружается из памяти

 

Вот и всё. Надеюсь, что эта статья оказалась для кого-то полезной.

 

Инструменты, парсер и саму статью вы найдете на narod.ru по адресу:

 

JavaBite редактор и дизассемблер классов языка Ява

GoogleParser 1.3

DJ JAVA Decompiler - декомпилятор языка Ява

Статья о взломе парсера Гугля

 

С narod.ru можно качать только браузером – не забывайте.

 

Хостинг от uCoz