ВЗЛОМ JAVA-АППЛЕТОВ Андрей Каролик Xakep, номер #052, стр. 052-064-4 В ПРОЦЕССЕ Скачиваешь весь боекомплект ET Applets v2.22 весом 461 Кб. Весит прилично из-за большого количества примеров и документации, чувак поработал на славу, грех не воспользоваться плодами его труда. Для трепанации выберем один из апплетов, к примеру, ET_TextScroll. Остальные ломаются по аналогии, так как защита на всех стоит одинаковая. Отыскиваешь класс этого апплета, ET_TextScroll.class. Запускаешь NMI's Java Code Viewer и открываешь в нем ET_TextScroll.class, выделяешь мышкой и играючи выбираешь Process -> Decompile. Засекаешь ровно полсекунды :) и получаешь готовый исходник. Далее запускаешь 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();) // перебор заданного ключа |