Категория > Новости > Беззащитная Java. Ломаем Java bytecode encryption - «Новости»

Беззащитная Java. Ломаем Java bytecode encryption - «Новости»


29-04-2022, 00:00. Автор: Stephen

Мы уже обна­ружи­ли в рабочем катало­ге динами­чес­кую биб­лиоте­ку с ори­гиналь­ным наз­вани­ем JavaLoader.dll, при заг­рузке которой в дизас­сем­блер IDA и находим иско­мые фун­кции — перед нами дей­стви­тель­но JVMTIAgent, дек­рипту­ющий байт‑код при заг­рузке нуж­ного клас­са. Но как он это дела­ет?


Сно­ва покурим спе­цифи­кацию JVM Tool Interface, ссыл­ку на которую я при­вел выше. Общий прин­цип работы аген­та — уста­нов­ка собс­твен­ных поль­зователь­ских callback-обра­бот­чиков на опре­делен­ные события. В дан­ном слу­чае нас инте­ресу­ет событие JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, вызыва­емое сра­зу пос­ле заг­рузки мас­сива байт‑кода нуж­ного клас­са из фай­ла, но перед JIT-ком­пиляци­ей дан­ного клас­са. При­мер­ная реали­зация уста­нов­ки такого обра­бот­чика выг­лядит так:


JNIEXPORT jint JNICALL Agent_onload(JavaVM *vm, char *options, void *reserved) {
jvmtiEventCallbacks callbacks;
jvmtiEnv *jvmtienv = jvmti(agent);
jvmtiErrorjvmtierror;
memset(&callbacks, 0, sizeof(callbacks));
callbacks.ClassFileLoadHook = &eventHandlerClassFileLoadHook; // Новый обработчик JVMTI_EVENT_CLASS_FILE_LOAD_HOOK
jvmtierror = (*jvmtienv)->SetEventCallbacks( jvmtienv, &callbacks, sizeof(callbacks)); // Установка обработчиков
jvmtierror = (*jvmtienv)->SetEventNotificationMode(jvmtienv, JVMTI_ENABLE,
JVMTI_EVENT_CLASS_FILE_LOAD_HOOK,
(jthread)NULL); // Разрешаем обработку события JVMTI_EVENT_CLASS_FILE_LOAD_HOOK

По­копав­шись при помощи IDA в коде про­цеду­ры Agent_onload, находим соот­ветс­тву­ющее мес­то.


Ус­танов­ка обра­бот­чика события JVMTI_EVENT_CLASS_FILE_LOAD_HOOK в аген­те JavaLoader

Перейти обратно к новости