Native JNI Library Extractor
Влияние на механику Minecraft
Интерфейс Java Native Interface (JNI) позволяет программам на Java вызывать скомпилированный код C, C++ или Rust. Базовые библиотеки Minecraft (такие как LWJGL для графики и OpenAL для звука) используют нативные модули. Кроме того, некоторые легитимные моды оптимизации (управление памятью, уменьшение задержки ввода) поставляют нативные библиотеки для конкретных платформ.
Native_Library_Dropper выявляет классы, которые извлекают бинарные файлы во временный каталог и загружают их через System.load(). Хотя такой механизм используется и в легитимном системном коде, нативные библиотеки могут использоваться для выполнения машинного кода непосредственно в адресном пространстве процесса. Машинный код исполняется вне виртуальной машины JVM, что позволяет напрямую взаимодействовать с памятью и системными вызовами операционной системы.
Поскольку распаковка нативных библиотек встречается как в оптимизационных дополнениях, так и в нежелательном ПО, правило классифицировано со средней степенью критичности (оценка 5) и требует отдельного анализа содержимого самой библиотеки.
Анализируемые функции и API
Files.createTempFile / Files.write
Создание временного файла на диске для записи байтов библиотеки.
System.load / System.loadLibrary
Загрузка нативной библиотеки машинного кода (.dll, .so, .dylib) в память JVM.
Реализация в моде (Исходный код)
package com.example.nativeloader;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
public class NativeLibraryUnpacker {
public static void loadEmbeddedLibrary() {
try {
String os = System.getProperty("os.name").toLowerCase();
String libResource = os.contains("win") ? "/natives/render_accel.dll" : "/natives/librender_accel.so";
Path tempFile = Files.createTempFile("native_cache_", ".tmp");
tempFile.toFile().deleteOnExit();
try (InputStream in = NativeLibraryUnpacker.class.getResourceAsStream(libResource)) {
if (in != null) {
byte[] data = in.readAllBytes();
Files.write(tempFile, data);
System.load(tempFile.toAbsolutePath().toString());
}
}
} catch (Throwable ignored) {
// Обработка ошибок загрузки библиотеки
}
}
}
Сигнатура байткода и статический детект
Детектор анализирует ссылки на методы на уровне класса и требует одновременного наличия двух групп вызовов:
- Методы создания или записи временных файлов:
java/nio/file/Files.createTempFileилиjava/nio/file/Files.write. - Методы загрузки нативного кода:
java/lang/System.loadилиjava/lang/System.loadLibrary.
Такое сочетание выявляет классы, создающие временные файлы на диске и загружающие динамические библиотеки в адресное пространство процесса Java. Основное ограничение статического анализа заключается в том, что легитимные моды оптимизации и работы с периферией (графические шейдеры, аудиомодули) также распаковывают скомпилированные библиотеки при запуске, что может приводить к ложным срабатываниям без анализа происхождения пакета.