Malware
  • La Biblia del Desarrollo de Malware para Windows
  • Introducción al Malware
    • ¿Qué es el Malware?
    • La Historia del Malware
    • Clasificación del Malware
    • Métodos de Distribución del Malware
  • Los Malwares Más Impactantes de la Historia
    • Stuxnet: El Malware que Destruyó una Planta Nuclear
    • Pegasus: El Malware Espía de Nivel Estatal
  • Introducción al Desarrollo de Malware
    • Herramientas y Lenguajes Más Comunes en el Desarrollo de Malware
    • Lenguajes Recomendados para el Desarrollo de Malware
    • Binarios Famosos de Windows y sus Lenguajes de Desarrollo
    • Fundamentos de compilacion
    • Nuestro primer "Malware"
    • Malware: Del Disco a la Memoria
  • APIs de Windows
    • Windows Internals
    • Windows on Windows (WOW)
    • Bibliotecas DLL en la Tecnología WOW64
    • Win32 APIs: El Corazón del Desarrollo de Software en Windows
      • Componentes Clave de las Win32 APIs
      • Cómo Funcionan las Win32 APIs y su relacion con el Malware
      • Uso de Win32 con C#
    • Kernel32.dll: La Biblioteca Fundamental en el Sistema Operativo Windows
      • VirtualAlloc en C#: Asignación y Gestión de Memoria
      • RtlMoveMemory: Copia de Memoria en Windows
      • CreateThread en C#: Creación y Manejo de Hilos
    • AllocationType y MemoryProtection
    • Windows Registry
  • Shell Reverse
    • Fundamentos de reverse shell
    • Desarrollando Nuestro Primer Simple Reverse Shell via TCP
      • C#
      • PowerShell
      • Python
Powered by GitBook
On this page
  • Descripción de los Argumentos de VirtualAlloc
  • Uso de VirtualAlloc en C#
  • Explicación del Código:
  • Analisis con WinDBG
  • Aplicaciones de VirtualAlloc en Malware
  1. APIs de Windows
  2. Kernel32.dll: La Biblioteca Fundamental en el Sistema Operativo Windows

VirtualAlloc en C#: Asignación y Gestión de Memoria

La función VirtualAlloc es una función fundamental de la API Win32 que permite a las aplicaciones de Windows gestionar la memoria de forma eficiente. Esta función permite a un programa reservar y comprometer memoria, lo que se traduce en asignación dinámica de memoria a través de la ejecución del programa. Además, VirtualAlloc es crucial en la creación de malware, especialmente cuando se busca ejecutar código directamente en la memoria, sin necesidad de escribirlo en el disco.

LPVOID VirtualAlloc(
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flAllocationType,
  DWORD  flProtect
);

Descripción de los Argumentos de VirtualAlloc

  1. lpAddress:

    • Es un puntero a la dirección base donde se desea reservar o comprometer memoria. Si se especifica como NULL, el sistema operativo elegirá una dirección automáticamente. Sin embargo, si se especifica una dirección base, el sistema se encargará de asegurar que esa dirección no esté en uso por otro recurso. En la mayoría de los casos, se pasa NULL para permitir que el sistema decida la ubicación de la memoria reservada.

  2. dwSize:

    • Es el tamaño, en bytes, de la memoria que se va a reservar o comprometer. Este valor debe ser un múltiplo del tamaño de la página de memoria más pequeña del sistema (típicamente 4096 bytes en los sistemas modernos). Si lpAddress es NULL, el sistema se asegurará de que el tamaño sea adecuado para la memoria de página.

  3. flAllocationType:

    • Esta es una bandera que especifica el tipo de asignación de memoria. Los valores más comunes son:

      • MEM_COMMIT: Reserva y compromete memoria, asignando la memoria físicamente en el momento de la llamada.

      • MEM_RESERVE: Reserva memoria sin comprometerla (la memoria se asigna solo cuando se compromete).

      • MEM_RESET: Reserva memoria y la marca como no inicializada, lo que significa que los datos en la memoria reservada no se conservan.

      • MEM_RESET_UNDO: Similar a MEM_RESET, pero permite deshacer los cambios en la memoria.

  4. flProtect:

    • Define los permisos de acceso que se aplican a la memoria reservada o comprometida. Algunos valores comunes incluyen:

      • PAGE_NOACCESS: La memoria no puede ser leída ni escrita.

      • PAGE_READONLY: La memoria solo puede ser leída.

      • PAGE_READWRITE: La memoria puede ser leída y escrita.

      • PAGE_EXECUTE: La memoria puede ser ejecutada.

      • PAGE_EXECUTE_READWRITE: La memoria puede ser leída, escrita y ejecutada, lo cual es crucial cuando se desea ejecutar código directamente desde la memoria (común en malware).

Uso de VirtualAlloc en C#

El siguiente código en C# demuestra cómo llamar a la función VirtualAlloc desde el entorno Windows usando P/Invoke para reservar y comprometer un bloque de memoria.

Código en C#:

using System;
using System.Runtime.InteropServices;

class Program
{
    // Declaramos la función VirtualAlloc de kernel32.dll usando DllImport
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

    static void Main()
    {
        // Definimos el tamaño de la memoria que vamos a asignar, en este caso 4096 bytes (1 página de memoria)
        uint size = 4096;

        // Llamamos a VirtualAlloc para reservar y comprometer memoria, usando flAllocationType y flProtect adecuados
        IntPtr address = VirtualAlloc(IntPtr.Zero, size, 0x1000, 0x40);

        // Verificamos si la llamada a VirtualAlloc fue exitosa
        if (address != IntPtr.Zero)
        {
            Console.WriteLine("Dirección de memoria asignada: " + address.ToString("X"));
            // Aquí se podría operar en la memoria asignada. Por ejemplo, escribir datos o ejecutar código directamente.
        }
        else
        {
            Console.WriteLine("Error al asignar memoria");
        }

        // Espera hasta que el usuario presione Enter para finalizar la ejecución del programa
        Console.ReadLine();
    }
}

Explicación del Código:

  1. Importación de la función VirtualAlloc:

    • Usamos DllImport para importar la función VirtualAlloc de la biblioteca kernel32.dll, la cual está disponible en Windows. Esta función es utilizada para realizar operaciones de asignación de memoria de bajo nivel.

  2. Llamada a VirtualAlloc:

    • En el método Main, se reserva y compromete un bloque de memoria de 4096 bytes (1 página de memoria) utilizando los valores correspondientes de las banderas de asignación y protección.

      • 0x1000: Es el valor de la bandera MEM_COMMIT, que indica que la memoria se reserva y compromete en el momento de la llamada.

      • 0x40: Es el valor de la bandera PAGE_EXECUTE_READWRITE, que permite leer, escribir y ejecutar la memoria.

  3. Verificación de Éxito:

    • La llamada a VirtualAlloc devuelve un puntero a la memoria asignada (si la operación es exitosa). Si la operación falla, devuelve NULL.

    • Si se obtiene un puntero válido, se muestra la dirección de memoria asignada. Si la asignación falla, se muestra un mensaje de error.

  4. Esperar Entrada:

    • La función Console.ReadLine() se utiliza para evitar que el programa termine inmediatamente, permitiendo al usuario observar el resultado antes de cerrar la consola.

Analisis con WinDBG

Aplicaciones de VirtualAlloc en Malware

La función VirtualAlloc es ampliamente utilizada en el desarrollo de malware, especialmente para técnicas como la inyección de código y la ejecución de código en memoria. Esto se debe a que VirtualAlloc permite reservar memoria ejecutable y sin necesidad de escribir en disco, lo que hace que las herramientas maliciosas sean más difíciles de detectar por antivirus.

  • Inyección de código: Los atacantes pueden usar VirtualAlloc para asignar un bloque de memoria ejecutable donde luego pueden inyectar su código malicioso, el cual será ejecutado directamente desde la memoria, evitando la necesidad de crear un archivo en el disco.

  • Evasión de detección: Al evitar el disco y ejecutar código en memoria, el malware tiene una mayor probabilidad de evadir antivirus y sistemas de detección de intrusos, que dependen de la inspección de archivos en disco.

PreviousKernel32.dll: La Biblioteca Fundamental en el Sistema Operativo WindowsNextRtlMoveMemory: Copia de Memoria en Windows

Last updated 5 months ago