Bases de VirtualBox et CPUID
Vous devez définir les VBoxInternal/CPUM/HostCPUID
extradata de la machine virtuelle. Cela fera que VirtualBox rapportera les résultats personnalisés de l' instruction CPUID à l'invité. En fonction de la valeur du registre EAX, cette instruction renvoie des informations sur le processeur - des choses comme le fournisseur, le type, la famille, la progression, la marque, la taille du cache, les fonctionnalités (MMX, SSE, SSE2, PAE, HTT), etc. vous mangle, plus les chances de tromper l'invité sont élevées.
Vous pouvez utiliser la vboxmanage setextradata
commande pour configurer la machine virtuelle. Par exemple,
vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952
fera CPUID retourner 50202952₍₁₆₎ dans le registre EBX, quand appelé avec EAX réglé à 80000003₍₁₆₎. (Désormais, les nombres hexadécimaux seront écrits comme 0xNN ou NNh.)
Définition de la chaîne du fournisseur de CPU
Si EAX est 0 (ou 80000000h sur AMD), CPUID renvoie le vendeur sous forme de chaîne ASCII dans les registres EBX, EDX, ECX (notez la commande). Pour un processeur AMD, ils ressemblent à ceci:
| 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" |
(Tiré de la spécification AMD CPUID , sous-section "CPUID Fn0000_0000_E")
Si vous concaténez EBX, EDX et ECX, vous obtiendrez AuthenticAMD
.
Si vous avez Bash et les utilitaires Unix traditionnels, vous pouvez facilement définir le fournisseur avec les commandes suivantes:
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
Définition de la chaîne de marque du processeur
Si EAX est 80000002h, 80000003h, 80000004h, CPUID renvoie 16 caractères ASCII de la chaîne de marque dans les registres EAX, EBX, ECX, EDX, totalisant 3 * 16 = 48 caractères; la chaîne se termine par un caractère nul . Notez que cette fonctionnalité a été introduite avec les processeurs Pentium 4. Voici à quoi peut ressembler la chaîne de marque sur un processeur 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" |
|-----------------|-----------------|------------------|
(Tiré de la référence de programmation des extensions de jeu d'instructions d'architecture Intel , sous-section 2.9, "Instruction CPUID", tableau 2-30. ☠ est le caractère nul (valeur numérique 0).)
Si vous mettez les résultats ensemble, vous obtiendrez Intel(R) Pentium(R) 4 CPU 1500MHz☠
.
Si vous avez Bash et les utilitaires Unix traditionnels, vous pouvez facilement définir la marque avec les commandes suivantes:
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 vous disposez d'une invite de commande Windows, vous pouvez définir la marque sur Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 en exécutant:
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 Les HostCPUID
valeurs sont extraites du rapport de bogue VirtualBox # 7865 .