Dasar-dasar VirtualBox dan CPUID
Anda perlu mengatur VBoxInternal/CPUM/HostCPUID
extradata dari mesin virtual. Ini akan membuat VirtualBox melaporkan hasil khusus untuk CPUID instruksi untuk tamu. Bergantung pada nilai register EAX, instruksi ini mengembalikan informasi tentang prosesor - hal-hal seperti vendor, tipe, keluarga, loncatan, merek, ukuran cache, fitur (MMX, SSE, SSE2, PAE, HTT), dll. Semakin banyak hasil Anda mangle, semakin tinggi peluang untuk menipu tamu.
Anda dapat menggunakan vboxmanage setextradata
perintah untuk mengkonfigurasi mesin virtual. Sebagai contoh,
vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952
akan membuat CPUID mengembalikan 50202952₍₁₆₎ dalam register EBX, ketika dipanggil dengan EAX diatur ke 80000003₍₁₆₎. (Mulai sekarang, angka heksadesimal akan ditulis sebagai 0xNN atau NNh.)
Mengatur string vendor CPU
Jika EAX adalah 0 (atau 80000000h pada AMD), CPUID mengembalikan vendor sebagai string ASCII dalam register EBX, EDX, ECX (perhatikan urutannya). Untuk CPU AMD, mereka terlihat seperti ini:
| 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" |
(Diambil dari Spesifikasi AMD CPUID , ayat "CPUID Fn0000_0000_E")
Jika Anda menggabungkan EBX, EDX dan ECX, Anda akan mendapatkannya AuthenticAMD
.
Jika Anda memiliki Bash dan utilitas Unix tradisional, Anda dapat dengan mudah mengatur vendor dengan perintah berikut:
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
Mengatur string merek CPU
Jika EAX adalah 80000002h, 80000003h, 80000004h, CPUID mengembalikan 16 karakter ASCII dari string merek dalam register EAX, EBX, ECX, EDX, dengan total 3 * 16 = 48 karakter; string itu diakhiri dengan karakter nol . Perhatikan bahwa fitur ini diperkenalkan dengan prosesor Pentium 4. Inilah bagaimana string merek dapat terlihat pada prosesor 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" |
|-----------------|-----------------|------------------|
(Diambil dari Intel Architecture Instruction Set Referensi Pemrograman Ekstensi , ayat 2.9, "Instruksi CPUID", tabel 2-30. ☠ adalah karakter nol (nilai numerik 0).)
Jika Anda menyatukan hasilnya, Anda akan mendapatkannya Intel(R) Pentium(R) 4 CPU 1500MHz☠
.
Jika Anda memiliki Bash dan utilitas Unix tradisional, Anda dapat dengan mudah mengatur merek dengan perintah berikut:
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
Jika Anda memiliki prompt perintah Windows, Anda dapat mengatur merek Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 dengan menjalankan:
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 Itu HostCPUID
nilai diambil dari laporan bug VirtualBox # 7865 .