Podstawy VirtualBox i CPUID
Musisz ustawić VBoxInternal/CPUM/HostCPUID
ekstradane maszyny wirtualnej. Spowoduje to, że VirtualBox będzie raportował niestandardowe wyniki dla instrukcji CPUID dla gościa. W zależności od wartości rejestru EAX instrukcja ta zwraca informacje o procesorze - takie jak dostawca, typ, rodzina, stopień, marka, rozmiar pamięci podręcznej, funkcje (MMX, SSE, SSE2, PAE, HTT) itp. Więcej wyników ty się przeklinasz, tym większe są szanse na oszukanie gościa.
Możesz użyć vboxmanage setextradata
polecenia, aby skonfigurować maszynę wirtualną. Na przykład,
vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952
spowoduje, że CPUID zwróci 50202952₍₁₆₎ w rejestrze EBX, gdy zostanie wywołany z EAX ustawionym na 80000003₍₁₆₎. (Od tej chwili liczby szesnastkowe będą zapisywane jako 0xNN lub NNh.)
Ustawianie ciągu dostawcy procesora
Jeśli EAX ma wartość 0 (lub 80000000h na AMD), CPUID zwraca dostawcę jako ciąg ASCII w rejestrach EBX, EDX, ECX (zwróć uwagę na kolejność). W przypadku procesora AMD wyglądają następująco:
| 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" |
(Zaczerpnięte ze specyfikacji AMD CPUID , podsekcja „CPUID Fn0000_0000_E”)
Jeśli połączysz EBX, EDX i ECX, otrzymasz AuthenticAMD
.
Jeśli masz Bash i tradycyjne narzędzia uniksowe, możesz łatwo ustawić producenta za pomocą następujących poleceń:
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
Ustawianie ciągu marki procesora
Jeśli EAX to 80000002h, 80000003h, 80000004h, CPUID zwraca 16 znaków ASCII łańcucha marki w rejestrach EAX, EBX, ECX, EDX, łącznie 3 * 16 = 48 znaków; ciąg jest zakończony znakiem zerowym . Zauważ, że ta funkcja została wprowadzona w procesorach Pentium 4. Oto jak ciąg marki może wyglądać na procesorze 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" |
|-----------------|-----------------|------------------|
(Zaczerpnięte z Rozszerzenia zestawu instrukcji architektury Intel Programowanie , podrozdział 2.9, „Instrukcja CPUID”, tabela 2-30. ☠ jest znakiem pustym (wartość liczbowa 0).)
Jeśli złożysz wyniki razem, otrzymasz Intel(R) Pentium(R) 4 CPU 1500MHz☠
.
Jeśli masz Bash i tradycyjne narzędzia uniksowe, możesz łatwo ustawić markę za pomocą następujących poleceń:
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
Jeśli masz wiersz polecenia systemu Windows, możesz ustawić markę na Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 , uruchamiając:
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 Te HostCPUID
wartości zostały zaczerpnięte z raportu VirtualBox bug # 7865 .