x86: Sobrepasar los 4 GB. Usar hasta 128 GB de RAM en 32 bits (Vista - Windows 7)

by jmtella 15. diciembre 2012 22:01
TIP para modificar el kernel de Windows 7 (32 bits) para que use toda la memoria instalada en nuestra maquina (hasta un máximo de 128 GB)
 
Necesario:
 
1) Un editor hexadecimal. Por ejemplo: XVI32 http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm#download
2) Windows Software Development Kit http://msdn.microsoft.com/en-us/windows/hardware/gg487428.aspx
 
El proceso es tan simple como:
 
a) Modificar unos cuantos bytes en hexadecimal en el kernel.
b) Con el software del punto 2) crearnos un certificado autofirmado para firmar el nuevo kernel (ya que al modificarlo, el certificado anterior queda invalidado así como el checksum del archivo. En ese caso, el cargador del sistema: WINLOAD denegará su carga).
c) Modificar el boot mediante el comando bcdedit para poder arrancar, bien con el kernel viejo o bien con el nuevo modificado. (multiboot)
 
 
PUNTO a)  Modificar archivo.
 
* Copiar el archivo ntkrnlpa.exe de \windows\system32 con otro nombre, a la misma carpeta. Por ejemplo ntkrnew.exe que es el vamos a modificar con el editor hexadecimal.
* Localizar con el editor la cadena:
 
7C XX 8B 45 FC 85 C0 74 YY
 
siendo XX e YY cualquier valor, es decir debemos localizar realmente la cadena intermedia 8B 45 FC 85 C0 74 y fijarnos que justo dos posiciones antes de ella hay un 7C. Esta cadena debemos encontrarla dos veces.
 
Sustituir desde 8B hasta YY por el contenido: B8 00 00 02 00 90 90 (en los dos sitios encontrados en el fichero). Y guardar el fichero.
 
PUNTO b) Crear Certificado
 
Se supone que instalamos el DDK de Microsoft citado anteriormente en: C:\Winddk\.
 
Ejecutamos en una consola con privilegios:
 
cd \windows\system32
C:\Winddk\7600.16385.0\bin\x86\makecert -r -ss my -n "CN=TuNombre"
C:\Winddk\7600.16385.0\bin\x86\signtool sign -s my -n "TuNombre" ntkrnew.exe
 
PUNTO c) Modificar boot
 
En consola con privilegios:
 
bcdedit /copy {current} /d "Windows 7 128GB"
 
Esto nos devolverá un {GUID} que vamos a usar ahora en los siguientes comandos:
 
bcdedit /set {GUID devuelto antes} pae ForceEnable
bcdedit /set {GUID devuelto antes} kernel ntkrnew.exe
bcdedit /set {GUID devuelto antes} testsigning on
 
 
NOTA:
 
Con el parche anterior, nuestro sistema ya será capaz de manejar hasta 128 GB de memoria. Recordemos que aunque el espacio de direcciones de 32 bits tien un máximo de 2 elevado a 32 direcciones (es decir 4GB), mediante PAE pueden usarse lineas extra de direcciones usando ciertos bits de uno de los registros de control con lo cual el espacio total de direcciones puede llegar a direccionar hasta 128 GB de memoria. Tipicamente, en las CPU's clásicas, solo pueden usarse 4 bits correspondientes a 4 lineas extras de direcciones y por tanto "unicamente" podremos llegar a los 64 GB de memoria.
 
Las versiones server de 32 bits no tienen esta limitación.
 
LIMITACIONES
 
El problema que surge es la capacidad de los drivers de manejar direcciones (punteros) de más de 32 bits. Los drivers que han pasado la certificacion WHQL son capaces de funcionar en modo PAE. Ahora bien, en drivers no certificados no tenemos la garantia que sean capaces de ello. Si dichos drivers usan acceso directo al hardware (típicamente MMIO) y no estan preparados para funcionar con espacios de direcciones mayores de 32 bits, fallaran al truncar direcciones reales de memoria y estar el hardware remapeado por encima del espacio de direcciones de 4 GB. Un fallo en un driver, al ejecutarse en modo Kernel, implica la caída del Kernel con la consabida pantalla azul.
 
 
DETALLES DEL PARCHE
 
Las versiones del nucleo PAE, NTKRNLPA.EXE llaman a una rutina llamada MxMemoryLicense en dos lugares del codigo. Cada secuencia llama a la función no documentada ZwQueryLicenseValue la cual comprueba, bien por fallo de llamada (valor negativo) o bien cuando el valor leido es cero.
 
La secuencia es:
 

En el momento de ejecución el registro eax contiene el estado devuelto por ZwQueryLicenseValue. La primera instrucción es para verificar el fallo de llamada (indicado por un valor negativo). El resto de las instrucciones verifican si el valor recuperado es cero.

Las dos ocurrencias de este código deben ser parcheadas de la misma forma. El parche está pensado para modificar la ejecución de la manera mas sencilla y corta posible, en este caso, mover al registro eax el codigo que representa 128GB el cual es el menor valor que elimina la restricción de licencia. Deberemos cambiar los 7 bytes comenzando en 0x8B por las siguientes instrucciones:

(el codigo 90, o nop son placeholders que indica "not operacion").

 

Comments are closed