Saya punya tamu XP di VirtualBox, host windows 8. Tamu menunjukkan prosesor secara transparan sama dengan tuan rumah (i5 2500k). Namun sebagian besar penginstal tidak mengenali prosesor ini dan gagal melanjutkan menyatakan prosesor yang tidak didukung.
Apakah ada cara untuk membodohi tamu sehingga berpikir ini adalah prosesor lama? Jika saya ingat dengan benar VMWare memiliki fitur masking CPU, apakah ada sesuatu yang serupa di virtualbox?
windows-xp
virtualbox
cpu
virtualization
IUnknown
sumber
sumber
Jawaban:
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,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:
(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:
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:
(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:
Jika Anda memiliki prompt perintah Windows, Anda dapat mengatur merek
Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 dengan menjalankan:1 Itu
HostCPUID
nilai diambil dari laporan bug VirtualBox # 7865 .sumber
's/ //g'
--cpuid
subcommand membutuhkan nilai untuk register EAX.Berikut adalah pendekatan yang memungkinkan menyamar CPU host tepat sebagai CPU spesifik daripada mencoba menebak pengaturan yang diperlukan. Anda akan memerlukan akses ke mesin yang menjalankan VirtualBox pada CPU host tersebut sehingga Anda dapat membuangnya
cpuid
register (mungkin yang terbaik untuk memilih arsitektur yang cukup mirip dengan CPU Anda yang sebenarnya sebagai model). Jika Anda tidak memilikinya, Anda dapat bertanya-tanya (Saya sudah sukses di Reddit misalnya)Buat file "model" dari CPU yang ingin Anda tiru:
Jalankan skrip berikut untuk memuat file model (
i7_6600U
di sini) ke dalam definisi VM VBox Anda (my_vm_name
sini):Itu saja, Anda sekarang dapat menjalankan VM Anda dan menikmati CPU yang disamarkan (catatan: Anda hanya perlu menjalankan skrip di atas sekali).
Jika Anda perlu mengembalikan topeng CPU, Anda dapat menggunakan
vboxmanage modifyvm $vm --cpuidremove $leaf
untuk masing-masing daun di loop di atas (man vboxmanage
adalah temanmu).Ini telah bekerja dengan sempurna selama beberapa bulan bagi saya, menyamar CPU Danau Kaby (i7_7500U) sebagai yang Skylake (i7_6600U) pada host Ubuntu 17,04 yang menjalankan VBox 5.1.22. Pendekatan harus bekerja pada OS host apa pun, asalkan Anda dapat membuat yang setara dengan skrip bash kecil di atas untuk OS tersebut.
sumber
0000000b
dan00000017
(inklusif) dan menjalankannya satu per satu hinggavboxmanage modifyvm my_vm_name --cpuidset <line>
jadi ini bisa dengan mudah dilakukan dengan tangan karena ini sekali saja.