Что показывает VirusTotal
Среди них Kaspersky, MaxSecure, несколько эвристических движков. Kaspersky обычно относит подобные файлы к not-a-virus:HEUR:RiskTool или HackTool: то есть само по себе не вредонос, но софт, который автоматизирует чужую игру, и вендор считает нужным предупредить пользователя.
Microsoft Defender, ESET, BitDefender, Sophos, Symantec пропускают. У реальных стилеров и RAT картина обычно обратная: 40+ детектов, включая топовых вендоров.
Разбор ниже описывает каждый слой отдельно, с параметрами, содержимым и тем, что оказалось на самом дне.
Разбор по слоям
-
L1Внешняя оболочка: MPRESS packer
Файл упакован MPRESS, публичным packer'ом на базе LZMA (доступен с 2007 года). Никакой антианалитики или защиты от отладки. Распаковка полностью статическая, без запуска.
.MPRESS1 vaddr=0x1000 size=0x16a4000 entropy=7.99 .MPRESS2 vaddr=0x16a5000 size=0xe8c (unpacker stub) .rsrc vaddr=0x16a6000 size=0x36bec (иконки, манифест)
MPRESS используется и в чистом софте, и во многих семействах malware. Сам по себе индикатором вредоносности не является, но эвристики антивирусов на него реагируют.
-
L2Кастомный LZMA внутри MPRESS
MPRESS использует свой вариант LZMA с параметром lc=7, из-за чего готовые LZMA-декодеры не подходят. Декодер восстановлен по дизассемблированному коду распаковщика и реализован на Python.
progress: 4.4% (1048576/23740416) t=1.1s progress: 8.8% (2097166/23740416) t=2.2s ... progress: 97.2% (23068693/23740416) t=24.0s decoded len: 23740416
-
L3Ahk2Exe контейнер и встроенный интерпретатор
Внутри распакованного образа два ресурса стандартного формата Ahk2Exe:
RCDATA/AUTOHOTKEY.EXE 1 307 136 bytes (интерпретатор) RCDATA/>AUTOHOTKEY SCRIPT< 20 960 218 bytes (обёртка)
Интерпретатор совпадает с официальным AutoHotkey Unicode 64-bit v1.1.33.10 по импортам, timestamp (2021-08-28) и структуре секций. Не модифицирован. Обёртка-скрипт содержит стандартный ScriptGuard шаблон (защита компилированных AHK-скриптов от копирования) и большой блок зашифрованных данных.
-
L4Финальный шифр с ключом от AutoHotkey.exe
Внутри обёртки лежит 7 МБ зашифрованных данных в текстовом формате u<число>u<число>.... Ключ инициализируется первыми 1.3 МБ файла AutoHotkey.exe на диске: если кто-то заменит интерпретатор, расшифровка провалится. Расшифровка перехвачена эмуляцией CPU (Unicorn Engine) в изолированной песочнице без доступа к системе.
key = [0x6f, 0x71, 0x75, 0x77] // ASCII "oquw" for i in range(iters): key[i&3] = key[i&3] * 0x83 + ahk_exe_bytes[i] for each dword in payload: ecx = key[i&3] * 0x83 + i key[i&3] = ecx dw = rol(dw, 1) - ecx dw = rol(dw, 1) - ecxНа выходе 3.5 МБ AHK-исходника в UTF-16. Читаемый код с комментариями на русском, без обфускации.
Стилер vs этот файл
- CreateRemoteThread, инъекция в чужой процесс
- WriteProcessMemory, запись в чужую память
- VirtualAllocEx, выделение памяти в чужом процессе
- CryptUnprotectData, расшифровка DPAPI и паролей Chrome
- CredEnumerate, чтение Credential Manager
- SamConnect, LsaOpenPolicy, доступ к SAM и LSA
- Чтение %APPDATA%\Roaming\Telegram\tdata
- Чтение %APPDATA%\discord\Local Storage
- Чтение cookies браузеров и wallet.dat кошельков
- Персистентность через реестр или планировщик задач
- PixelSearch, поиск цвета на экране игры
- MouseClick и Send, эмуляция ввода
- BitBlt и GetDC, снимки региона экрана
- GdipCreateBitmap..., сравнение картинок через GDI+
- POST /count, отправка счётчиков успешного фарма
- POST /key, проверка HWID по белому списку
- URLDownloadToFile с github.com, автообновление
- IniRead и IniWrite, сохранение настроек
- Целевое окно жёстко зашито: ahk_exe GTA5.exe
- GUI на GDI+ с иконками и меню трея
Сетевая активность
Отправляется JSON с ключом, полученным из серийника физического диска (через DeviceIoControl IOCTL 0x560000). Ответ дешифруется AES-CBC с зашитым ключом AFBForever010423, значение 1 или 0. Никакие пароли, токены, файлы, содержимое буфера обмена или окон не передаются.
POST со счётчиками {ferm, les, mine, afk} и тем же ключом HWID, зашифровано AES-CBC. Используется для рейтинга пользователей внутри проекта.
GET, сравнивает актуальный номер версии со встроенным. При несовпадении скачивает новый бинарь с GitHub.
Через URLDownloadToFile качается AutoFishBot.exe из репозитория автора. В репозитории лежит только бинарь и README, исходников AHK-скрипта там нет: репо используется как канал доставки, не как открытый исходный проект.
Ссылка открывается в браузере по кнопке из GUI. Через Telegram-бота проекта пользователь получает код активации, которым разово регистрирует свой HWID на сервере createcaef.online. Данных о пользователе бот в TG не забирает.
За что антивирусы флагают
Здесь важно быть честным. Часть детектов, включая Kaspersky, срабатывает не наугад: три технических признака в файле реально совпадают с поведением опасного софта. Плюс есть смысловая причина, по которой Kaspersky относит подобные утилиты к RiskTool/HackTool.
Тот же packer встречается у RedLine, Vidar, AsyncRAT. Автоматически повышает подозрительность у эвристики: любой упакованный x64 бинарь без цифровой подписи получает базовый штраф.
Бот запускает AutoHotkey.exe /force \\.\pipe\AHK… и передаёт расшифрованный скрипт через named pipe. Это техника, применяемая частью malware для запуска расшифрованного кода без сохранения на диск. Здесь она используется как защита исходников AHK-скрипта от копирования.
7 МБ зашифрованных данных внутри exe с кастомным алгоритмом и ключом от содержимого другого файла. Классический признак крипта у malware. Расшифрованный результат оказался обычным AHK-скриптом, но статический анализатор этого не знает.
Даже когда антивирус разобрался, что вредоносного действия нет, часть вендоров (в первую очередь Kaspersky) относит такие утилиты к категории RiskTool или HackTool: софт для автоматической игры за пользователя. Это уже не false positive в чистом виде, а политика вендора относительно чит-софта.
Из расшифрованного кода
#IfWinActive, ahk_exe GTA5.exe
;-------------------------------------------------------
; Апельсины
StartsFerm:
{
Rab2 (Rab2 := !Rab2) ? "on" BotOn("Ferm") : "off" BotOff("Ferm")
if (Rab2 = 1) {
GoSub, DATAFerm
fcount = 0
SetTimer, Fermloop, -1
}
}
TipsPaul:
Run, https://yoomoney.ru/to/4100118341509342
Return
TipsDazzziee:
Run, https://boosty.to/autofishbot
Return
Rickroll:
Run, https://www.youtube.com/watch?v=dQw4w9WgXcQ
Return
If (Version != VersionWebText) {
try {
URLDownloadToFile,
https://github.com/PaulTwelve/AutoFishBot-MajesticRP/raw/main/AutoFishBot.exe,
AutoFishBot.exe
} catch {
Error(GetMes("Не удалось установить обновление."))
}
}
Lic(Key) {
Http.Open("POST", web "/key", false)
Http.SetRequestHeader("Content-Type", "application/json")
try Http.Send("{""key"":""" Key """}")
catch {
Error(GetMes("Не удалось проверить активацию."))
}
iv := SubStr(Http.ResponseText, 1, 16)
body := SubStr(Http.ResponseText, 17)
try lic := Crypt.Decrypt.String("AES", "CBC", body, "AFBForever010423", iv)
Return (lic = 1 ? 1 : 0)
}
Как проверить самому
Весь разбор сделан статически, плюс один блок расшифровки прогнан через эмулятор CPU (Unicorn Engine) в изолированной песочнице, без выхода в сеть и без запуска исходного бинаря. Инструменты свободные, шаги воспроизводимы.
- Разбор PEpefile 2024.8.26
- ДизассемблерCapstone 5.0.9
- Эмулятор CPUUnicorn Engine 2.1.4
- Распаковщик MPRESS/LZMAcustom, 220 строк Python
- Расшифровка payloadcustom, 40 строк Python
Вердикт
Игровой бот для GTA5, распространяется бинарём без исходников. Опасности для системы не создаёт: не крадёт пароли, не устанавливает персистентность, не выходит за пределы своей задачи. Часть антивирусов флагает его за упаковку и pipe injection, часть (Kaspersky) относит к категории HackTool, потому что это чит-софт по определению. Реальный риск здесь не для машины, а для игрового аккаунта: за использование бота сервер MajesticRP может забанить.