Обратная разработка Amadey Loader с помощью x64dbg: динамическое разрешение API, повышение привилегий токена, перехват клавиатуры, захват буфера обмена и злоупотребление командной строкой для подготовки стилера.
Образец Amadey Loader был загружен в x64dbg. В точке входа загрузчик выполняет динамическое разрешение API через jmp-трамплины, указывающие на GetProcAddressForCaller и VirtualAlloc. Представленное ниже окно дампа раскрывает расшифрованные строки и имена API, используемые кейлоггером и процедурами закрепления загрузчика.
jmp qword ptr ds:[] – динамический поиск API, позволяет избежать статических импортов. jmp qword ptr ds:[] – выделяет RWX-память для распакованной полезной нагрузки / шелл-кода. SetWindowsHookExW / CallNextHookEx / UnhookWindowsHookEx – цепочка хуков кейлоггера (WH_KEYBOARD_LL) GetForegroundWindow / GetWindowTextW / GetWindowThreadProcessId – захватывает заголовок активного окна при каждом нажатии клавиши. GetKeyState / GetAsyncKeyState – опрос необработанного состояния клавиш. GetUserObjectInformationW / wndProc /UnregisterClassW – обработка класса окна для скрытого окна кейлоггера. GetTickCount / timeGetTime / GetSystemTimeAsFileTime – процедуры работы со временем, используемые для интервалов beacon-сигналов и буферизации нажатий клавиш.
Динамическое разрешение API: GetProcAddressForCaller обходит анализ статических импортов, что позволяет обойти обнаружение на основе сигнатур. Подтверждение кейлоггера: цепочка SetWindowsHookExW + CallNextHookEx — это классический низкоуровневый хук клавиатуры, используемый для перехвата каждого нажатия клавиши в масштабе всей системы. Контекстно-зависимое журналирование: GetForegroundWindow + GetWindowTextW захватывают заголовок активного окна, придавая контекст каждому нажатию клавиши (имена пользователей, пароли, чаты). Выделение RWX: VirtualAlloc используется для распаковки и выполнения полезной нагрузки следующего этапа в памяти, не оставляя артефактов на диске. Соответствие поведению Amadey: этот набор API согласуется с известным поведением Amadey по краже учётных данных и кейлоггингу.

Более внимательный взгляд на ту же сессию x64dbg показывает, что Amadey Loader разрешает вторую партию Windows API, ориентированных на повышение привилегий, манипуляцию токенами и перечисление процессов. Трамплин VirtualAlloc в верхней части дизассемблированного кода используется для выделения памяти под таблицу разрешённых API, а представленное ниже окно дампа раскрывает намерение загрузчика повысить привилегии до уровня SYSTEM перед выполнением своей полезной нагрузки.
OpenProcessToken / DuplicateTokenEx / ImpersonateLoggedOnUser – дублирование токенов и имперсонация для повышения привилегий. LookupPrivilegeValueW / AdjustTokenPrivileges – включает SeDebugPrivilege и другие чувствительные привилегии. GetTokenInformation / SetTokenInformation – читает и изменяет токен текущего процесса. OpenProcess / Process32FirstW / Process32NextW – перечисление процессов для поиска высокоценных целей (например, lsass.exe, процессов антивирусов). CreateFileW / CreateToolhelp32Snapshot / Module32FirstW – используются для файловых операций и перечисления модулей. RegCreateKeyExW / RegSetValueExW / Закрепление: RegCreateKeyExW + RegSetValueExW в ключах Run позволяют Amadey автоматически запускаться после перезагрузки. GetProcAddress / LoadLibraryW / GetModuleHandleW – динамическое разрешение API. CreateProcessW / ShellExecuteExW / WinExec – запускает полезные нагрузки следующего этапа. IsDebuggerPresent / CheckRemoteDebuggerPresent – проверки на наличие отладчика.
Имперсонация токена: DuplicateTokenEx + ImpersonateLoggedOnUser позволяют Amadey работать с более высокими привилегиями (часто SYSTEM), обеспечивая полный контроль над системой. Злоупотребление SeDebugPrivilege: LookupPrivilegeValueW + AdjustTokenPrivileges включают SeDebugPrivilege, который необходим для внедрения в защищённые процессы, такие как lsass.exe. Выбор целей среди процессов: Process32FirstW / Process32NextW используются для перечисления и выбора высокоценных целей (AV, браузеры, хранилища учётных данных). Антиотладка: IsDebuggerPresent + CheckRemoteDebuggerPresent активно обнаруживают среды анализа и завершают работу или изменяют поведение. Цепочка выполнения: CreateProcessW / ShellExecuteExW подтверждают роль Amadey как загрузчика — он сбрасывает и выполняет полезную нагрузку следующего этапа (например, Lumma Stealer, Vidar или программу-вымогатель).

Третий вид того же сеанса x64dbg показывает, как Amadey Loader разрешает API для файлового ввода-вывода, управления таймерами и обработки ввода/клавиатуры. Вместе со строками из дампа это указывает на полезную нагрузку, которая ведёт себя как гибрид кейлоггера и стилера — перехватывает ввод, записывает логи и очищает таймеры, чтобы уменьшить свой след.
jmp qword ptr ds:[] – записывает перехваченные данные / сброшенную полезную нагрузку на диск. jmp qword ptr ds:[] – асинхронная запись в файл (используется для скрытной записи логов). jmp qword ptr ds:[] – операция разрозненной записи (используется для фрагментированного сброса полезной нагрузки). jmp qword ptr ds:[] – удаляет очереди таймеров, чтобы стереть следы, связанные с таймингом. SetSystemTime / SetLocalTime – потенциальная манипуляция временными метками. SetWindowsHookEx / CallNextHookEx / UnhookWindowsHookEx – цепочка клавиатурных хуков. GetForegroundWindow / GetWindowTextW / GetClassNameW – перехватывает контекст активного окна. GetSystemInfo / EnumWindows / EnumChildWindows – перечисление окружения.
Подтверждение кейлоггера (усилено): Комбинация SetWindowsHookEx, CallNextHookEx, ToUnicodeEx и GetForegroundWindow — это классическая реализация кейлоггера, которая регистрирует как нажатия клавиш, так и окно, в котором они были введены. Поведение стилера: WriteFile + WriteFileEx + WriteFileGather указывают на то, что перехваченные данные (нажатия клавиш, учётные данные) записываются на диск фрагментированными асинхронными блоками, чтобы избежать обнаружения. Антифорензическая очистка: DeleteTimerQueue и SetSystemTime помогают загрузчику стирать собственные артефакты тайминга и потенциально изменять временные метки файлов. Синтетический ввод: SendInput + RegisterHotKey предполагают, что полезная нагрузка также может внедрять нажатия клавиш — полезно для закрепления в системе или удалённого запуска действий. Паттерн полезной нагрузки Amadey: Этот набор API подтверждает, что загрузчик готовится развернуть полезную нагрузку кейлоггера/стилера (обычно Vidar, Lumma или аналогичную).
