Основи VirtualBox та CPUID
Потрібно встановити VBoxInternal/CPUM/HostCPUID
додаткові дані віртуальної машини. Це дозволить VirtualBox звітувати власні результати для інструкції CPUID . Залежно від значення реєстру EAX, ця інструкція повертає інформацію про процесор - такі речі, як постачальник, тип, сімейство, ступінчастість, бренд, розмір кеша, функції (MMX, SSE, SSE2, PAE, HTT) тощо. Більше результатів ти мандриш, тим вище шанси обдурити гостя.
Ви можете використовувати vboxmanage setextradata
команду для налаштування віртуальної машини. Наприклад,
vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952
зробить CPUID повернення 50202952₍₁₆₎ в регістр EBX, коли його виклик з EAX встановлено на 80000003₍₁₆₎. (Відтепер шістнадцяткові числа записуватимуться як 0xNN або NNh.)
Встановлення рядка постачальника процесора
Якщо EAX дорівнює 0 (або 80000000h на AMD), CPUID повертає постачальника як рядок ASCII в регістри EBX, EDX, ECX (зверніть увагу на порядок). Для процесора AMD вони виглядають так:
| 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" |
(Взято із специфікації CPUID AMD , підрозділ "CPUID Fn0000_0000_E")
Якщо ви об'єднаєте EBX, EDX і ECX, ви отримаєте AuthenticAMD
.
Якщо у вас є Bash і традиційні утиліти Unix, ви можете легко встановити постачальника за допомогою таких команд:
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
Встановлення рядка торгової марки CPU
Якщо EAX становить 80000002h, 80000003h, 80000004h, CPUID повертає 16 символів ASCII рядка марки в регістри EAX, EBX, ECX, EDX, загальною сумою 3 * 16 = 48 символів; рядок завершується нульовим символом . Зауважте, що ця функція була введена разом з процесорами Pentium 4. Ось так може виглядати рядок бренда на процесорі 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" |
|-----------------|-----------------|------------------|
(Взяте з довідника з програмування розширень набору з архітектури Intel , підрозділ 2.9, "Інструкція CPUID", таблиця 2-30. ☠ - нульовий символ (числове значення 0).)
Якщо ви зведете результати, ви отримаєте Intel(R) Pentium(R) 4 CPU 1500MHz☠
.
Якщо у вас є Bash і традиційні утиліти Unix, ви можете легко встановити бренд за допомогою таких команд:
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
Якщо у вас є командний рядок Windows, ви можете встановити бренд на Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1, виконавши:
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 У HostCPUID
значенні було взято з VirtualBox Повідомлення про помилку # 7865 .