Memoria Winows
Pequeño recordatorio del manejo de memori en windows
Memoria virtual y paginación!
Estado de la página
Las páginas que residen dentro del espacio de direcciones virtuales de un proceso pueden estar en uno de 3 estados:
FREE - La página no está comprometida ni reservada. La página no es accesible para el proceso. Está disponible para ser reservado, comprometido o simultáneamente reservado y comprometido. Intentar leer o escribir en una página gratuita puede generar una excepción de violación de acceso.
Reservado - La página ha sido reservada para uso futuro. El rango de direcciones no puede ser utilizado por otras funciones de asignación. La página no es accesible y no tiene almacenamiento físico asociado. Está disponible para ser comprometido.
Comprometido - Los cargos de memoria se han asignado a partir del tamaño total de la RAM y los archivos de paginación en el disco. La página es accesible y el acceso está controlado por una de las constantes de protección de memoria. El sistema inicializa y carga cada página confirmada en la memoria física solo durante el primer intento de leer o escribir en esa página. Cuando finaliza el proceso, el sistema libera el almacenamiento de las páginas confirmadas.
Opciones de protección de página
Una vez confirmadas las páginas, es necesario configurar su opción de protección. Se puede encontrar la lista de constantes de protección de memoria aquí pero a continuación se enumeran algunos ejemplos.
PAGE_NOACCESS- Deshabilita todo acceso a la región comprometida de páginas. Un intento de leer, escribir o ejecutar la región comprometida dará como resultado una violación de acceso.PAGE_EXECUTE_READWRITE- Habilita lectura, escritura y ejecución.Se desaconseja encarecidamente su uso y generalmente es un IoC porque es poco común que la memoria sea escribible y ejecutable al mismo tiempo.
PAGE_READONLY- Permite el acceso de solo lectura a la región comprometida de páginas. Un intento de escribir a la región comprometida da como resultado una violación de acceso.Protección de la memoria
Prevención de la ejecución de datos (DEP) - DEP es una función de protección de memoria a nivel de sistema introducida en Windows XP SP2 y Windows Server 2003 SP1. Con DEP habilitado, el código no se puede ejecutar desde regiones de memoria que no estén marcadas explícitamente como ejecutables, como aquellas protegidas con
PAGE_READONLY.- Aleatorización del diseño del espacio de direcciones (ASLR) - ASLR es una técnica de protección de memoria utilizada para prevenir la explotación de vulnerabilidades de corrupción de memoria. ASLR organiza aleatoriamente las posiciones del espacio de direcciones de las áreas de datos clave de un proceso, incluida la base del ejecutable y las posiciones de la pila, el montón y las bibliotecas### Espacio de memoria x86 vs x64
Al trabajar con procesos de Windows, es importante tener en cuenta si el proceso es x86 o x64. Los procesos x86 tienen un espacio de memoria más pequeño de 4 GB (0xFFFFFFFF) mientras que x64 tiene un espacio de memoria mucho mayor de 128 TB (0xFFFFFFFFFFFFFFFF)
Ejemplo de asignación de memoria
// Allocating a memory buffer of *100* bytes
// Method 1 - Using malloc()
PVOID pAddress = malloc(100);
// Method 2 - Using HeapAlloc()
PVOID pAddress = HeapAlloc(GetProcessHeap(), 0, 100);
// Method 3 - Using LocalAlloc()
PVOID pAddress = LocalAlloc(LPTR, 100);
el valor pAddress recibira como referencia la direccion base de bloque de memoria que fue asignado, usando este puintero se puede realizar varias acciones como:
- leer
- escribir
- ejecutar
HeapAlloc utiliza el HEAP_ZERO_MEMORY indicador que hace que la memoria asignada se inicialice a cero. Luego, la cadena se copia a la memoria asignada usando memcpy.
El último parámetro en memcpy es el número de bytes a copiar. A continuación, vuelva a verificar el búfer para verificar que los datos se escribieron correctamente.
1
memcpy([Destino], [Origen], #bytes)
Liberando memoria asignada
Asignación con
mallocrequiere el uso de lafreefunción.- Asignación con
HeapAllocrequiere el uso de laHeapFreefunción.1
HeapFree(GetProcessHeap(), 0, pAddress);
- Asignación con
LocalAllocrequiere el uso de laLocalFreefunción.

