Native JNI Library Extractor

Native_Library_Dropper Вредоносное ПО (Malware) MEDIUM +5 очков

🎮 Влияние на механику 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. Основное ограничение статического анализа заключается в том, что легитимные моды оптимизации и работы с периферией (графические шейдеры, аудиомодули) также распаковывают скомпилированные библиотеки при запуске, что может приводить к ложным срабатываниям без анализа происхождения пакета.