Obtener valores de la memoria en PowerShell utilizando la clase Marshal

Hay que tener en cuenta que cuando un proceso se ejecuta, el sistema operativo le asigna un espacio de direcciones y lo añade a una tabla de procesos. El espacio de direcciones de cada proceso contiene las instrucciones y datos del programa, además tiene una pila que lleva la cuenta de las llamadas a procedimientos. En el siguiente script de ejemplo podemos ver información sobre la memoria de ese proceso que se está ejecutando y que es PowerShell, en él que se almacenan valores en variables (datos del programa).

# StringToHGlobalAnsi: Copia el contenido de un String administrado en la memoria no administrada, convirtiéndolo en formato ANSI mientras realiza la copia.
# PtrToStringAnsi: Asigna un String administrado y copia en él total o parcialmente una cadena ANSI (en Windows) o UTF-8 (en Unix) no administrada.

$a = "hola"

# Dirección del primer carácter de la cadena no administrada. Dirección, en memoria no administrada, donde se copió la cadena o 0 si $a es null.
$ptra = [Runtime.InteropServices.Marshal]::StringToHGlobalAnsi($a); $ptra

1..10000 | %{
    # Obtener el valor de una variable en base a una dirección Ptr más un variable contador
    [Runtime.InteropServices.Marshal]::PtrToStringAnsi($ptra.ToInt64()+$_)
}