Сегодня займемся тем, о чем еще не писалось (на
русском языке точно, а на английском я нашел аж 1). Будем ломать
Java аплеты.
Что нам для этого понадобится:
Softice, Ida 4.15 (полный естественно), hex редактор, procdump.
Сначала о теории.
Виртуальные машины это что-то типа интерпретаторов, но по-круче.
Это программы которые имитируют выполнение программы на программной
модели какого-нить процессора. Т.е. прога строится на командах
этого виртуального процессора. Таким образом стандартные апи отлетают
в далекие края. Потому что команды этого процессора выглядят хз
как. Там могут быть какие-угодно опкоды, которые интерпритируются
в команды виртуального процессора. Это жеж какой ужас будет если
все проги будут делаться на виртуальных машинах... Вот так все
сложно и страшно. Никто переходить на виртуальные машины пока
не собирается, потому что все виртуальные машины страшно тормозят.
Естественно, пока туда-сюда код интерпритируется, потом его надо
выполнить в системе команд нашего реального проца и преобразовать
результаты для передачи виртуальному. Вот так от. Зачем они тогда
ваще нужны? Тока изза мультиплатформенности. Т.е. пишется тока
виртуальная машина под нужную ось, а проги для нее везде одинаковые.
Ща у нас есть виртуальные машины Java и VB.
Итак я покажу самый примитив, тошо явы я не знаю, на скока получилось
смарите сами.
Будем ломать ABCMenuMan от Wyka-Warzecha (http://www.wyka-warzecha.com).
Там куча ограничений на нем, но пока, что я покажу как ломать
самый явный из них - задержку при загрузке.
Приступим. Открываем ABCMenuMan.class в Ida. Задержка должна быть
на 100% в самом аплете. Нужно тока ее найти... Для начала не плохо
бы узнать какой функцией она реализуется. Должно быть что-то связанное
с временем. Но еще вопрос : Где искать имя этой функции? Запускаем
sample.htm чтобы аплет запустился. Берем процдамп и смотрим чо
там у нас использует explorer...
Кучу DLL связаных с java. Но нам пока важна тока msjava.dll. Поики
среди функции в этой dll не привели ни к чему - функций связаных
с задержкой, типа delay не было :(. Но зато была задержка для
потока java_lang_thread_sleep. Но ведь аплет-то и есть поток explorer'a
созданый виртуальной машиной... Ставим bрx на java_lang_thread_sleep
(экспорт из msjava.dll загрузить не забудьте). Теперь запускаем
sample.htm. Сработает айс. Жмем F11 и видим(адрес не буду совпадать):
015F:01DC5B6B PUSH DWORD PTR [EBP+14]
015F:01DC5B6E PUSH DWORD PTR [EBP+10]
015F:01DC5B71 PUSH 00000000
015F:01DC5B76 CALL [EDX+24] - call java_lang_thread_sleep
Ставим bpx на 01DC5B6B и делаем bd* , потому что будет будет куча
вызовов. Закрываем sample.htm, be* и снова запускаем.
Айс сработает на 01DC5B6B теперь смотрим чо загоняется в стек
перед call.
PUSH DWORD PTR [EBP+14] - тут ноли
PUSH DWORD PTR [EBP+10] - тут число 17EB (нормальный вид, а не
так как в памяти).
Теперь смотрим в IDA ищем java.lang.thread.sleep. Находи вот это:
met006_83:
ldc2w 6123
invokestatic void java.lang.Thread.sleep(long)
Хм, чо это за 6123... А скока это в hex? 6123=17EB! Круто. Это
и есть задержка.
Теперь все что нам остается это открыть ABCMenuMan.class в Hex
редакторе, найти EB 17 и заменить на 00 00.
А теперь когда мы все так прочувствовали, даю второй , гораздо
более простой метод: Берем DJ Java Decompiler и декомпилим этот
class файл. Потом правим код и в нем же перекомпиливаем обратно
юзая Jbuilder
Этот способ хорош, но это уже другой аплет выходит, а не крэк.
Автор: Hex
|