Гуру это конечно громко сказано, но кое что по поводу этого вируса я могу сказать.
1) Дублирование
По его коду главного класса видно, что он не будет исполнять свои действия на OS Windows, а именно вот участочек кода из его главного класса, который явно об этом говорит.
if (System.getProperty("os.name").toLowerCase().contains("windows")) {
return;
}
Главный класс его можно найти рядом с основным классом плагина, он будет иметь такое же название как и главный класс, но продолжение в название будет
L10
. Пример: основной класс:
main.class
, то вирус рядом создаст класс
mainL10.class
со своим кодом.
Он работает с использованием библиотеки javassist, который создан для того, чтобы манипулировать байт-кодом класса плагина во время выполнения. То есть, во время запущенного сервера, он может изменять код внутри класса плагинов.
Именно это и происходит.
Что за дублирование происходит в главном классе вируса hostflow
Могу сразу сказать просто: заражение своим кодом другие плагины, запущенные на сервере.
Более детально:
Он путём итерации перебирает элементы списка с использованием класса:
javassist.ws.a
Что делает класс javassist.ws.a смотрите ниже в 2) Отправка данных вирусом hostflow на свои сервера.
Во время итерации: для каждого файла создается новая файловая система fileSystem2 на основе пути к файлу, далее проверяется наличие файла
.l_ignore
в данной файловой системе (в корневой папке плагина). Если файл существует, то обработка этого файла пропускается и переходит к следующему файлу.

Далее манипуляции с getRootDirectories:
Создаётся опять итератор внутри этой же папки, и для каждого файла (класса) в этой папке применяется действие:
- Создается новый CtClass на основе байт-кода файла.
- Проверяется, содержит ли класс аннотацию JavaPlugin.
- В зависимости от наличия аннотации JavaPlugin выполняются разные действия:
- Если аннотация есть, то создается новый путь path6 для нового класса.
- Проверяется наличие папки ".l1" внутри.
- В зависимости от наличия ".l1" выполняются разные действия: создается новый класс, файл или директория.
Если аннотацию
JavaPlugin не удалось найти, выполняется следующий код:

Простое объяснение: Вставляется вызов этого всего в
onEnable плагина: то есть во время запуска плагина происходит каждый раз такое действие.
Более подробно: участок кода создан для изменения кода onEnable плагина, а точнее замены onEnable.
Он создает новую копию класса (имя которого берется из
path6), вызывает метод "a" с параметром, который возвращает родительскую директорию
(getDataFolder().getParent())
.
Вот path6 о котором говорится выше
Path path6 = fileSystem2.getPath(path5.getParent().toString(), String.valueOf(ctClass2.b()) + "L10.class");
то есть он создаёт себе подобный класс, используя название главного класса плагина, но подставляет в конце
L10.class
.
Весь этот код вызывается в методе основного класса плагина
onEnable.
После замены кода в методе
onEnable, класс записывается обратно в файл path5. В результате изменения кода метода внутри файла.
Так же предусмотрена защита от повторного добавление вируса в один и тот же файл, а именно создаётся файл с названием
.l_ignore
в корневой папке плагина:

Оба эти файлы пустые, и служат только для уведомления вируса о дальнейшей манипуляции.
Что же добавляется в onEnable:
Добавляется вызов метода "a" из вирусного файла:
Пример 1

new MMOItemsL10().a(this.getDataFolder().getParent());
Пример 2

new GoBrushPluginL10().a(this.getDataFolder().getParent());
То есть при старте сервера, и запуске зажаренных плагинов будет всегда запуск методов упомянутых выше.
2) Отправка данных вирусом hostflow на свои сервера.
Что же таит вызываемый класс
javassist.ws.a
который вызывается при запуске сервера?
Он подключается при помощи веб-сокетов к
http://client.hostflow.eu:5050/ws
и отправляет данные о сервере, на котором запущен плагин:
Какие данные отправляются на сервер вируса hostflow:
- IP-адрес сервера
- Порт сервера
- Версия ядра
- Количество игроков
- Максимальное количество игроков
- Весь список плагинов.
- Включено ли online-mode на true в server.properties
- Ники игроков которые в данный момент на сервере
- Логи сервера
Но так же:
Есть интересный метод, вызываемый при получение уже ответ от вирусного сайта. Если сообщение в ответе содержит фразу: начинающуюся с
$$exec$$
, то вызывается стринговое сообщение:

Вероятно это вывод сообщений/команд в консоли, каких стоит только догадываться, так как она получает инструкции из внешнего сервера.
Как понять от какого файла пошло заражение hostflow?
Понятное дело, что при запуске заражённого плагина вирусом hostflow с остальными плагинами заразит их тоже, и они будут иметь одинаковую структуру. Но вирус hostflow продуманный, как я говорил выше, и он не заражает повторно плагины. То есть можно открыть файл заражённого плагина, и посмотреть дату добавления файлов
.l1
и
.l_ignore
И он чётко даст понять, когда этот плагин был заражён.

Следовательно, тот плагин, который был заражён раньше всех, и будет тем носителей, который принёс вирус в вашу сборку.
Далее нужно узнать откуда он был взят, и не запускали ли вы его в других сборках до переноса в текущую сборку. Возможно у вас там были так же ранее заражены плагины, и стоит копать там.
Послесловие:
Я много раз сталкивался с этим «Вирусом», но никогда его не подцеплял сам. Не нужно надеяться на волю случая. Обычное НЕ открытие файла плагина архиватором перед запуском его на сервере, может стоить вам несколько часов работы по удаление зловредных плагинов, так как hostflow заражает практически все плагины запущенные рядом с разражённым плагином.
Так же хочу сказать, что наличие библиотеки (папки в плагине) javassist
не говорит, что это плохой плагин. Javassist в некоторых случаях необходим для некоторых плагинов, так что наличие папки javassist не панацея.
Возможно я что-то упустил, если появятся вопросы, задавайте.