ВЗЛОМ 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();) // перебор заданного ключа

Назад на стр. 052-064-3  Содержание  Вперед на стр. 052-064-5

Hosted by uCoz