Common API used in Malware
Grupo de Seguridad Try Hard
Genérico
Redes
Raw Sockets | WinAPI Sockets |
---|---|
socket() | WSAStratup() |
bind() | bind() |
listen() | listen() |
accept() | accept() |
connect() | connect() |
read()/recv() | recv() |
write() | send() |
shutdown() | WSACleanup() |
Persistencia
Registro | Archivo | Servicio |
---|---|---|
RegCreateKeyEx() | GetTempPath() | OpenSCManager |
RegOpenKeyEx() | CopyFile() | CreateService() |
RegSetValueEx() | CreateFile() | StartServiceCtrlDispatcher() |
RegDeleteKeyEx() | WriteFile() | |
RegGetValue() | ReadFile() |
Encriptación
Nombre |
---|
WinCrypt |
CryptAcquireContext() |
CryptGenKey() |
CryptDeriveKey() |
CryptDecrypt() |
CryptReleaseContext() |
Anti-Análisis/VM
Nombre de la Función | Instrucciones de Ensamblaje |
---|---|
IsDebuggerPresent() | CPUID() |
GetSystemInfo() | IN() |
GlobalMemoryStatusEx() | |
GetVersion() | |
CreateToolhelp32Snapshot [Verificar si un proceso está en ejecución] | |
CreateFileW/A [Verificar si un archivo existe] |
Sigilo
Nombre | |
---|---|
VirtualAlloc | Asignar memoria (empaquetadores) |
VirtualProtect | Cambiar permisos de memoria (empaquetador dando permiso de ejecución a una sección) |
ReadProcessMemory | Inyección en procesos externos |
WriteProcessMemoryA/W | Inyección en procesos externos |
NtWriteVirtualMemory | |
CreateRemoteThread | Inyección de DLL/proceso... |
NtUnmapViewOfSection | |
QueueUserAPC | |
CreateProcessInternalA/W |
Ejecución
Nombre de la Función |
---|
CreateProcessA/W |
ShellExecute |
WinExec |
ResumeThread |
NtResumeThread |
Varios
GetAsyncKeyState() -- Registro de teclas
SetWindowsHookEx -- Registro de teclas
GetForeGroundWindow -- Obtener el nombre de la ventana en ejecución (o el sitio web desde un navegador)
LoadLibrary() -- Importar biblioteca
GetProcAddress() -- Importar biblioteca
CreateToolhelp32Snapshot() -- Listar procesos en ejecución
GetDC() -- Captura de pantalla
BitBlt() -- Captura de pantalla
InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- Acceder a Internet
FindResource(), LoadResource(), LockResource() -- Acceder a los recursos del ejecutable
Técnicas de Malware
Inyección de DLL
Ejecutar una DLL arbitraria dentro de otro proceso
Localizar el proceso para inyectar la DLL maliciosa: CreateToolhelp32Snapshot, Process32First, Process32Next
Abrir el proceso: GetModuleHandle, GetProcAddress, OpenProcess
Escribir la ruta de la DLL dentro del proceso: VirtualAllocEx, WriteProcessMemory
Crear un hilo en el proceso que cargará la DLL maliciosa: CreateRemoteThread, LoadLibrary
Otras funciones a utilizar: NTCreateThreadEx, RtlCreateUserThread
Inyección de DLL Reflectante
Cargar una DLL maliciosa sin llamar a las llamadas normales de la API de Windows. La DLL se mapea dentro de un proceso, resolverá las direcciones de importación, corregirá las reubicaciones y llamará a la función DllMain.
Secuestro de Hilo
Encontrar un hilo de un proceso y hacer que cargue una DLL maliciosa
Encontrar un hilo objetivo: CreateToolhelp32Snapshot, Thread32First, Thread32Next
Abrir el hilo: OpenThread
Suspender el hilo: SuspendThread
Escribir la ruta de la DLL maliciosa dentro del proceso víctima: VirtualAllocEx, WriteProcessMemory
Reanudar el hilo cargando la biblioteca: ResumeThread
Inyección PE
Inyección de Ejecución Portátil: El ejecutable se escribirá en la memoria del proceso víctima y se ejecutará desde allí.
Vaciamiento de Proceso
El malware desmapeará el código legítimo de la memoria del proceso y cargará un binario malicioso
Crear un nuevo proceso: CreateProcess
Desmapear la memoria: ZwUnmapViewOfSection, NtUnmapViewOfSection
Escribir el binario malicioso en la memoria del proceso: VirtualAllocEc, WriteProcessMemory
Establecer el punto de entrada y ejecutar: SetThreadContext, ResumeThread
Enganche
La SSDT (Tabla de Descriptores de Servicios del Sistema) apunta a funciones del kernel (ntoskrnl.exe) o controlador GUI (win32k.sys) para que los procesos de usuario puedan llamar a estas funciones.
Un rootkit puede modificar estos punteros a direcciones que él controla
IRP (Paquetes de Solicitud de E/S) transmiten fragmentos de datos de un componente a otro. Casi todo en el kernel utiliza IRPs y cada objeto de dispositivo tiene su propia tabla de funciones que se pueden enganchar: DKOM (Manipulación Directa de Objetos del Kernel)
La IAT (Tabla de Direcciones de Importación) es útil para resolver dependencias. Es posible enganchar esta tabla para secuestrar el código que se llamará.
Enganches de EAT (Tabla de Direcciones de Exportación). Estos enganches se pueden hacer desde el userland. El objetivo es enganchar funciones exportadas por DLLs.
Enganches Inline: Este tipo es difícil de lograr. Esto implica modificar el código de las funciones en sí. Tal vez colocando un salto al principio de esto.
Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud en GitHub.
Última actualización