Procesos Nativos de Windows

Archivo: src/native_proceso_win.rs (604 líneas)

¿Por qué existe?

Expone a Forja la manipulación de procesos de Windows a bajo nivel: búsqueda de PID por nombre (Toolhelp32), apertura/cierre de handles (OpenProcess/CloseHandle), lectura/escritura de memoria remota (ReadProcessMemory/WriteProcessMemory), obtención de módulos cargados (como client.dll), estado de teclas (GetAsyncKeyState) y ocultar/mostrar la consola (ShowWindow). En plataformas que no son Windows todas las funciones retornan valores por defecto (0, falso o arreglo vacío) para no romper la compilación.

Arquitectura / Estructuras clave

ComponenteDescripción
PROCESSENTRY32W / MODULEENTRY32WEstructuras #[repr(C)] de la API Toolhelp32 (wide-char)
Declaraciones FFIOpenProcess, CloseHandle, GetLastError, CreateToolhelp32Snapshot, Process32FirstW/NextW, Module32FirstW/NextW, ReadProcessMemory, WriteProcessMemory, GetAsyncKeyState, GetConsoleWindow, ShowWindow, SetConsoleCtrlHandler
ConstantesTH32CS_SNAPPROCESS, TH32CS_SNAPMODULE, TH32CS_SNAPMODULE32, SW_HIDE, SW_SHOW, MAX_PATH, MAX_MODULE_NAME
ESTADO_RESTAURARMutex<Option<(handle, direccion, byte1, byte2)>>: estado global para restaurar bytes automáticamente al salir
ESTADO_TECLA_ANTERIORMutex<Option<(vk, presionada)>>: estado anterior de tecla para detección de flanco
Helperslower_u16, wstr_igual (comparación WCHAR case-insensitive), a_utf16

Funciones nativas registradas

Registradas por NativeRegistry::registrar_proceso_win():

FunciónDescripción
_proceso_obtener_pid(nombre)Devuelve el PID del primer proceso cuyo ejecutable coincide (case-insensitive), o 0
_proceso_abrir_pid(pid, acceso)Abre el proceso con OpenProcess y devuelve el handle (default: PROCESS_ALL_ACCESS 0x001FFFFF)
_proceso_ultimo_error()Devuelve el último código de error (GetLastError)
_proceso_cerrar(handle)Cierra el handle con CloseHandle
_proceso_modulo_base(pid, nombre)Dirección base de un módulo cargado en el proceso (0 si no existe)
_proceso_modulo_tamano(pid, nombre)Tamaño en bytes del módulo (0 si no existe)
_proceso_leer_bytes(handle, direccion, tamano)Lee memoria remota en bloques de 1 MB; los bloques fallidos se rellenan con 0 (siempre devuelve tamano elementos; máx. 1 GB)
_proceso_escribir_bytes(handle, direccion, bytes)Escribe el arreglo de bytes en memoria remota
_buscar_firma(bytes, firma, mascara)Busca un pattern con máscara de comodines (0 = comodín) y devuelve el offset, o -1
_tecla_presionada(vk)Devuelve si la tecla virtual (GetAsyncKeyState, bit 0x8000) está presionada
_flanco_tecla(vk)Devuelve verdadero solo en la transición no-presionada → presionada; el estado anterior se guarda en Rust (ESTADO_TECLA_ANTERIOR)
_consola_ocultar(ocultar)Oculta (SW_HIDE) o muestra (SW_SHOW) la ventana de consola actual
_imprimir_stdout(texto)Imprime a stdout con flush inmediato (el builtin escribir acumula en buffer)
_restaurar_al_salir(handle, direccion, byte1, byte2)Registra un handler de Ctrl+C/cierre (SetConsoleCtrlHandler) que restaura los bytes originales al salir

Restauración automática de bytes

handler_ctrl es un callback extern "system" registrado vía _restaurar_al_salir. Al recibir un evento de cierre, restaura los 2 bytes originales en la dirección guardada con WriteProcessMemory y retorna 0 (FALSE) para dejar que el handler por defecto continúe.

Seguridad: estas funciones permiten leer/escribir memoria de procesos externos y son un vector clásico de explotación. Solo deberían usarse en scripts de confianza y dentro del sandbox de Forja.
Portabilidad: cada función está duplicada con #[cfg(target_os = "windows")] / #[cfg(not(target_os = "windows"))]. En no-Windows devuelven 0, falso o arreglo vacío, lo que mantiene compilable y ejecutable el mismo script en todas las plataformas.