hacktricks/reversing/common-api-used-in-malware.md

160 lines
8.2 KiB
Markdown

# API comunes utilizadas en Malware
<details>
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
**Grupo de Seguridad Try Hard**
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
***
## 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
1. Localizar el proceso para inyectar la DLL maliciosa: CreateToolhelp32Snapshot, Process32First, Process32Next
2. Abrir el proceso: GetModuleHandle, GetProcAddress, OpenProcess
3. Escribir la ruta de la DLL dentro del proceso: VirtualAllocEx, WriteProcessMemory
4. 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
1. Encontrar un hilo objetivo: CreateToolhelp32Snapshot, Thread32First, Thread32Next
2. Abrir el hilo: OpenThread
3. Suspender el hilo: SuspendThread
4. Escribir la ruta de la DLL maliciosa dentro del proceso víctima: VirtualAllocEx, WriteProcessMemory
5. 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
1. Crear un nuevo proceso: CreateProcess
2. Desmapear la memoria: ZwUnmapViewOfSection, NtUnmapViewOfSection
3. Escribir el binario malicioso en la memoria del proceso: VirtualAllocEc, WriteProcessMemory
4. 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**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en GitHub.
</details>