Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Мы уже обнаружили в рабочем каталоге динамическую библиотеку с оригинальным названием JavaLoader.
, при загрузке которой в дизассемблер 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
, находим соответствующее место.
|
|