sábado, 20 de noviembre de 2010

Lectura de memoria entre procesos Windows

En todos los sistemas operativos modernos la memoria está protegida entre procesos.
Si un proceso accede o escribe en una posición de memoria no esperada no debe afectar a los demás procesos.

A pesar de este planteamiento, en Windows es posible leer o escribir zonas de memoria entre procesos, para ello están las funciones del API ReadProcessMemory y WriteProcessMemory.

El primer paso es encontrar el PID del proceso en el que estamos interesados y después debe obtenerse un handle con la función OpenProcess.

Para buscar el proceso destino hay varias formas, en este ejemplo se usa el nombre de la ventana visible del proceso.

#include <QtCore/QCoreApplication>
#include <windows.h>

DWORD getPIDByWindowName(WCHAR* name);

int main(int argc, char *argv[]){
QCoreApplication a(argc, argv);
BYTE buffer[300];
DWORD readed;
DWORD processID = getPIDByWindowName(TEXT("Calculadora"));
HANDLE procHandle = OpenProcess(0x0010, 0, processID);
ReadProcessMemory(procHandle, (void*)0x00951558, buffer, 50, &readed);
return a.exec();
}

DWORD getPIDByWindowName(WCHAR* name){
DWORD processID;
HWND windowHandle = FindWindowW(NULL, name);
GetWindowThreadProcessId(windowHandle, &processID);
return processID;
}

Gracias al uso de estas funciones del API se abre una nueva posibilidad de comunicación entre procesos, sin embargo, abre también un grave riesgo de seguridad. Entre otros usos, modificando la memoria de los procesos de antivirus o cortafuegos se pueden inutilizar dando una falsa sensación se seguridad.

0 comentarios: