Conceptos básicos de VirtualBox y CPUID
VBoxInternal/CPUM/HostCPUID
Debe configurar los extradatos de la máquina virtual. Esto hará que VirtualBox informe los resultados personalizados para la instrucción CPUID al invitado. Dependiendo del valor del registro EAX, esta instrucción devuelve información sobre el procesador: cosas como proveedor, tipo, familia, pasos, marca, tamaño de caché, características (MMX, SSE, SSE2, PAE, HTT), etc. Cuantos más resultados usted destroza, mayor es la posibilidad de engañar al invitado.
Puede usar el vboxmanage setextradata
comando para configurar la máquina virtual. Por ejemplo,
vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952
hará que CPUID devuelva 50202952₍₁₆₎ en el registro EBX, cuando se llame con EAX configurado en 80000003₍₁₆₎. (De ahora en adelante, los números hexadecimales se escribirán como 0xNN o NNh).
Establecer la cadena del proveedor de la CPU
Si EAX es 0 (o 80000000h en AMD), CPUID devuelve al proveedor como una cadena ASCII en los registros EBX, EDX, ECX (observe el pedido). Para una CPU AMD, se ven así:
| Register | Value | Description |
|----------|------------|--------------------------------|
| EBX | 6874_7541h | The ASCII characters "h t u A" |
| ECX | 444D_4163h | The ASCII characters "D M A c" |
| EDX | 6974_6E65h | The ASCII characters "i t n e" |
(Tomado de la especificación AMD CPUID , subsección "CPUID Fn0000_0000_E")
Si concatena EBX, EDX y ECX, obtendrá AuthenticAMD
.
Si tiene Bash y las utilidades tradicionales de Unix, puede configurar fácilmente el proveedor con los siguientes comandos:
vm='WinXP' # UUID works as well
# The vendor string needs to have 12 characters!
vendor='AuthenticAMD'
if [ ${#vendor} -ne 12 ]; then
exit 1
fi
ascii2hex() { echo -n 0x; od -A n --endian little -t x4 | sed 's/ //g'; }
registers=(ebx edx ecx)
for (( i=0; i<${#vendor}; i+=4 )); do
register=${registers[$(($i/4))]}
value=`echo -n "${vendor:$i:4}" | ascii2hex`
# set value to an empty string to reset the CPUID, i.e.
# value=""
for eax in 00000000 80000000; do
key=VBoxInternal/CPUM/HostCPUID/${eax}/${register}
vboxmanage setextradata "$vm" $key $value
done
done
Establecer la cadena de marca de la CPU
Si EAX es 80000002h, 80000003h, 80000004h, CPUID devuelve 16 caracteres ASCII de la cadena de la marca en los registros EAX, EBX, ECX, EDX, totalizando 3 * 16 = 48 caracteres; la cadena termina con un carácter nulo . Tenga en cuenta que esta característica se introdujo con los procesadores Pentium 4. Así es como se puede ver la cadena de la marca en un procesador Pentium 4:
| EAX Input Value | Return Values | ASCII Equivalent |
|-----------------|-----------------|------------------|
| 80000002h | EAX = 20202020h | " " |
| | EBX = 20202020h | " " |
| | ECX = 20202020h | " " |
| | EDX = 6E492020h | "nI " |
|-----------------|-----------------|------------------|
| 80000003h | EAX = 286C6574h | "(let" |
| | EBX = 50202952h | "P )R" |
| | ECX = 69746E65h | "itne" |
| | EDX = 52286D75h | "R(mu" |
|-----------------|-----------------|------------------|
| 80000004h | EAX = 20342029h | " 4 )" |
| | EBX = 20555043h | " UPC" |
| | ECX = 30303531h | "0051" |
| | EDX = 007A484Dh | "☠zHM" |
|-----------------|-----------------|------------------|
(Tomado de Intel Architecture Instruction Set Extensions Programming Reference , subsection 2.9, "CPUID Instruction", table 2-30. ☠ es el carácter nulo (valor numérico 0)).
Si pones los resultados juntos, obtendrás Intel(R) Pentium(R) 4 CPU 1500MHz☠
.
Si tiene Bash y las utilidades tradicionales de Unix, puede configurar fácilmente la marca con los siguientes comandos:
vm='WinXP' # UUID works as well
# The brand string needs to have 47 characters!
# The null terminator is added automatically
brand=' Intel(R) Pentium(R) 4 CPU 1500MHz'
if [ ${#brand} -ne 47 ]; then
exit 1
fi
ascii2hex() { echo -n 0x; od -A n --endian little -t x4 | sed 's/ //g'; }
eax_values=(80000002 80000003 80000004)
registers=(edx ecx ebx eax)
for (( i=0; i<${#brand}; i+=4 )); do
eax=${eax_values[$((${i} / 4 / 4))]}
register=${registers[$((${i} / 4 % 4 ))]}
key=VBoxInternal/CPUM/HostCPUID/${eax}/${register}
value=`echo -n "${brand:$i:4}" | ascii2hex`
# set value to an empty string to reset the CPUID, i.e.
# value=""
vboxmanage setextradata "$vm" $key $value
done
Si tiene un símbolo del sistema de Windows, puede establecer la marca en Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 ejecutando:
set vm=your-vm-name-or-uuid
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/eax 0x65746e49
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/ebx 0x2952286c
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/ecx 0x726f4320
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/edx 0x4d542865
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/eax 0x43203229
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x20205550
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/ecx 0x20202020
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/edx 0x20202020
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/eax 0x30303636
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/ebx 0x20402020
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/ecx 0x30342e32
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/edx 0x007a4847

1 Los HostCPUID
valores se tomaron del informe de error de VirtualBox # 7865 .