Módulo de Manipulación Avanzada de Memoria
Este módulo está diseñado para permitir la lectura y escritura directa en la memoria de procesos externos en sistemas Windows, utilizando llamadas a la API nativa (kernel32.dll). Es una herramienta poderosa para aplicaciones que requieren interactuar con otros procesos, como depuradores, herramientas de análisis, automatización avanzada o modificaciones en tiempo real de programas.
Descripción General
El módulo proporciona funciones para:
Abrir un proceso por su nombre y obtener un handle con permisos completos (PROCESS_ALL_ACCESS).
Resolver direcciones de memoria dinámicas mediante punteros base y una serie de offsets, soportando arquitecturas de 32 y 64 bits.
Leer y escribir datos en memoria en distintos formatos: byte, int, long, float, double y cadenas de texto (string).
Manejar cadenas con codificación ASCII o UTF-8, con opción a tamaño fijo para escritura.
Realizar todas las operaciones de forma segura, verificando que el proceso y las direcciones sean válidas antes de leer o escribir.
Componentes Clave
1. Interoperabilidad con la API de Windows
OpenProcess: Obtiene un handle para el proceso especificado con acceso total.
ReadProcessMemory y WriteProcessMemory: Permiten leer y escribir bytes en la memoria del proceso abierto.
Estas funciones están importadas con [DllImport("kernel32.dll")] para usarse desde C#.
2. Obtención del Handle del Proceso
GetHandle(string processName): Busca procesos activos por nombre y abre un handle con permisos completos. Retorna IntPtr.Zero si no encuentra el proceso.
3. Resolución de Punteros Dinámicos
ResolvePointer(IntPtr hProc, long baseAddr, int[] offsets):
Esta función permite navegar a través de una cadena de punteros para llegar a la dirección final donde se encuentra el dato. Es fundamental para acceder a estructuras de memoria complejas que usan referencias anidadas.
Soporta tanto sistemas de 32 bits como de 64 bits, adaptando la lectura de punteros según el tamaño de IntPtr.
4. Lectura y Escritura de Datos
Para cada tipo de dato soportado (byte, int, long, float, double), existen métodos públicos que:
Obtienen el handle del proceso.
Resuelven la dirección final con offsets.
Realizan la lectura o escritura usando los métodos de la API.
5. Manejo de Cadenas
ReadString y WriteString permiten leer y escribir texto en memoria, con soporte para codificación ASCII o UTF-8.
La escritura puede ajustarse a un tamaño fijo, rellenando o truncando el buffer según sea necesario.
6. Función Interna de Escritura
Write: Función privada que centraliza la lógica para escribir cualquier tipo de dato en memoria, evitando duplicación de código.
Ejemplo de Uso
csharp
// Leer un entero desde un proceso llamado "GameApp"
int score = SimpleMemory.ReadInteger("GameApp", 0x00ABCDEF, 0x10, 0x20);
// Escribir un nuevo valor float en la memoria del proceso
SimpleMemory.WriteFloat("GameApp", 0x00ABCDEF, 99.5f, 0x10, 0x20);
// Leer una cadena UTF-8 de 50 caracteres
string playerName = SimpleMemory.ReadString("GameApp", 0x00ABCDEF, 50, true, 0x10);
Consideraciones Importantes
Privilegios: Para acceder a la memoria de otros procesos, el programa debe ejecutarse con permisos administrativos.
Seguridad: Manipular memoria de procesos externos puede causar inestabilidad o fallos si no se usa con cuidado.
Compatibilidad: El módulo detecta automáticamente si el sistema es de 32 o 64 bits y ajusta la lectura de punteros.
Uso Ético: Se recomienda utilizar este tipo de técnicas solo en aplicaciones propias o con autorización expresa para evitar violaciones legales o de términos de servicio.