Ingeniería inversa de Amadey Loader con x64dbg: resolución dinámica de API, escalada de privilegios de token, hooks de keylogger, captura del portapapeles y abuso de la línea de comandos para la preparación del stealer.
La muestra de Amadey Loader se cargó en x64dbg. En el punto de entrada, el loader realiza una resolución dinámica de API mediante thunks jmp que apuntan a GetProcAddressForCaller y VirtualAlloc. La vista de volcado a continuación revela cadenas descifradas y nombres de API utilizados por las rutinas de keylogger y persistencia del loader.
jmp qword ptr ds:[] – búsqueda dinámica de API, evita las importaciones estáticas. jmp qword ptr ds:[] – asigna memoria RWX para el payload desempaquetado / shellcode. SetWindowsHookExW / CallNextHookEx / UnhookWindowsHookEx – cadena de hooks del keylogger (WH_KEYBOARD_LL) GetForegroundWindow / GetWindowTextW / GetWindowThreadProcessId – captura el título de la ventana activa con cada pulsación de tecla. GetKeyState / GetAsyncKeyState – sondeo del estado bruto de las teclas. GetUserObjectInformationW / wndProc /UnregisterClassW – manejo de la clase de ventana para la ventana oculta del keylogger. GetTickCount / timeGetTime / GetSystemTimeAsFileTime – rutinas de temporización utilizadas para los intervalos de beacon y el almacenamiento en búfer de las pulsaciones de teclas.
Resolución dinámica de API: GetProcAddressForCaller evita el análisis de importaciones estáticas, derrotando la detección basada en firmas. Confirmación del keylogger: La cadena SetWindowsHookExW + CallNextHookEx es el clásico hook de teclado de bajo nivel utilizado para interceptar cada pulsación de tecla en todo el sistema. Registro con contexto: GetForegroundWindow + GetWindowTextW capturan el título de la ventana activa, dando contexto a cada pulsación de tecla (nombres de usuario, contraseñas, chats). Asignación RWX: VirtualAlloc se utiliza para desempaquetar y ejecutar el payload de la siguiente etapa en memoria, sin dejar ningún artefacto en disco. Coincidencia con el comportamiento de Amadey: Este conjunto de API es coherente con el conocido comportamiento de robo de credenciales y keylogging de Amadey.

Un examen más detallado de la misma sesión de x64dbg revela que Amadey Loader resuelve un segundo lote de API de Windows centradas en la escalada de privilegios, la manipulación de tokens y la enumeración de procesos. El thunk de VirtualAlloc en la parte superior del desensamblado se utiliza para asignar memoria para la tabla de API resuelta, mientras que la vista de volcado a continuación expone la intención del loader de escalar a un acceso de nivel SYSTEM antes de ejecutar su payload.
OpenProcessToken / DuplicateTokenEx / ImpersonateLoggedOnUser – duplicación de tokens y suplantación para la escalada de privilegios. LookupPrivilegeValueW / AdjustTokenPrivileges – habilita SeDebugPrivilege y otros privilegios sensibles. GetTokenInformation / SetTokenInformation – lee y modifica el token del proceso actual. OpenProcess / Process32FirstW / Process32NextW – enumeración de procesos para localizar objetivos de alto valor (p. ej., lsass.exe, procesos de AV). CreateFileW / CreateToolhelp32Snapshot / Module32FirstW – utilizados para operaciones de archivos y enumeración de módulos. RegCreateKeyExW / RegSetValueExW / Persistencia: RegCreateKeyExW + RegSetValueExW bajo las claves Run permiten que Amadey se inicie automáticamente tras el reinicio. GetProcAddress / LoadLibraryW / GetModuleHandleW – resolución dinámica de API. CreateProcessW / ShellExecuteExW / WinExec – lanza los payloads de la siguiente etapa. IsDebuggerPresent / CheckRemoteDebuggerPresent – comprobaciones anti-depuración.
Suplantación de tokens: DuplicateTokenEx + ImpersonateLoggedOnUser permiten a Amadey ejecutarse con privilegios elevados (a menudo SYSTEM), otorgando control total sobre el sistema. Abuso de SeDebugPrivilege: LookupPrivilegeValueW + AdjustTokenPrivileges habilitan SeDebugPrivilege, que es necesario para inyectar en procesos protegidos como lsass.exe. Selección de objetivos de proceso: Process32FirstW / Process32NextW se utilizan para enumerar y elegir objetivos de alto valor (AV, navegadores, almacenes de credenciales). Anti-depuración: IsDebuggerPresent + CheckRemoteDebuggerPresent detectan activamente entornos de análisis y terminan o alteran el comportamiento. Ejecución en cadena: CreateProcessW / ShellExecuteExW confirman el rol de Amadey como cargador — deposita y ejecuta el payload de la siguiente etapa (p. ej., Lumma Stealer, Vidar o ransomware).

Una tercera vista de la misma sesión de x64dbg muestra a Amadey Loader resolviendo API para E/S de archivos, gestión de temporizadores y manejo de entrada/teclado. Junto con las cadenas del volcado, esto apunta a un payload que se comporta como un híbrido de keylogger/stealer — capturando entrada, escribiendo registros y limpiando temporizadores para reducir su huella.
jmp qword ptr ds:[] – escribe datos capturados / payload depositado en disco. jmp qword ptr ds:[] – escritura de archivo asíncrona (usada para el volcado sigiloso de registros). jmp qword ptr ds:[] – operación de escritura dispersa (usada para depósitos de payload fragmentados). jmp qword ptr ds:[] – elimina colas de temporizadores para borrar rastros basados en temporización. SetSystemTime / SetLocalTime – posible manipulación de marcas de tiempo. SetWindowsHookEx / CallNextHookEx / UnhookWindowsHookEx – cadena de hooks de teclado. GetForegroundWindow / GetWindowTextW / GetClassNameW – captura el contexto de la ventana activa. GetSystemInfo / EnumWindows / EnumChildWindows – enumeración del entorno.
Confirmación de keylogger (reforzada): La combinación de SetWindowsHookEx, CallNextHookEx, ToUnicodeEx y GetForegroundWindow es una implementación de keylogger de manual que registra tanto las pulsaciones de teclas como la ventana en la que se escribieron. Comportamiento de stealer: WriteFile + WriteFileEx + WriteFileGather indican que los datos capturados (pulsaciones de teclas, credenciales) se escriben en disco en fragmentos asíncronos y fragmentados para evitar la detección. Limpieza anti-forense: DeleteTimerQueue y SetSystemTime ayudan al cargador a borrar sus propios artefactos de temporización y potencialmente modificar las marcas de tiempo de los archivos. Entrada sintética: SendInput + RegisterHotKey sugieren que el payload también puede inyectar pulsaciones de teclas — útil para persistencia o para desencadenar acciones de forma remota. Patrón de payload de Amadey: Este conjunto de API confirma que el cargador se prepara para desplegar un payload de keylogger/stealer (comúnmente Vidar, Lumma o similar).