Informazioni su VirtualBox e CPUID
È necessario impostare il VBoxInternal/CPUM/HostCPUID
extradata della macchina virtuale. Questo renderà VirtualBox rapporto risultati personalizzati per il CPUID istruzioni per l'ospite. A seconda del valore del registro EAX, questa istruzione restituisce informazioni sul processore - cose come fornitore, tipo, famiglia, stepping, marca, dimensione della cache, caratteristiche (MMX, SSE, SSE2, PAE, HTT), ecc. Più risultati maneggi, maggiori sono le possibilità di ingannare l'ospite.
Puoi usare il vboxmanage setextradata
comando per configurare la macchina virtuale. Per esempio,
vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952
renderà CPUID restituire 50202952₍₁₆₎ nel registro EBX, quando chiamato con EAX impostato su 80000003₍₁₆₎. (D'ora in poi, i numeri esadecimali saranno scritti come 0xNN o NNh.)
Impostazione della stringa del fornitore della CPU
Se EAX è 0 (o 80000000h su AMD), CPUID restituisce il fornitore come una stringa ASCII nei registri EBX, EDX, ECX (notare l'ordine). Per una CPU AMD, assomigliano a questo:
| 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" |
(Preso da Specifica CPUID AMD , sottosezione "CPUID Fn0000_0000_E")
Se si concatenano EBX, EDX ed ECX, si otterrà AuthenticAMD
.
Se hai Bash e le tradizionali utility Unix, puoi facilmente impostare il venditore con i seguenti comandi:
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
Impostazione della stringa del marchio della CPU
Se EAX è 80000002h, 80000003h, 80000004h, CPUID restituisce 16 caratteri ASCII della stringa del marchio nei registri EAX, EBX, ECX, EDX, per un totale di 3 * 16 = 48 caratteri; la stringa è terminato con un carattere nullo . Si noti che questa funzione è stata introdotta con i processori Pentium 4. Ecco come la stringa del marchio può apparire su un processore 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" |
|-----------------|-----------------|------------------|
(Preso da Riferimento per la programmazione delle estensioni del set di istruzioni di Intel Architecture , sottosezione 2.9, "Istruzione CPUID", tabella 2-30. The è il carattere null (valore numerico 0).)
Se metti insieme i risultati, otterrai Intel(R) Pentium(R) 4 CPU 1500MHz☠
.
Se hai Bash e le tradizionali utility Unix, puoi facilmente impostare il marchio con i seguenti comandi:
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
Se hai un prompt dei comandi di Windows, puoi impostare il marchio su Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 correndo:
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 Il HostCPUID
i valori sono stati presi dal rapporto bug di VirtualBox # 7865 .