Khái niệm cơ bản về VirtualBox và CPUID
Bạn cần thiết lập VBoxInternal/CPUM/HostCPUID
extradata của máy ảo. Điều này sẽ làm cho VirtualBox báo cáo kết quả tùy chỉnh cho hướng dẫn CPUID cho khách. Tùy thuộc vào giá trị của thanh ghi EAX, hướng dẫn này trả về thông tin về bộ xử lý - những thứ như nhà cung cấp, loại, gia đình, bước, thương hiệu, kích thước bộ đệm, tính năng (MMX, SSE, SSE2, PAE, HTT), v.v. bạn mangle, cơ hội đánh lừa khách càng cao.
Bạn có thể sử dụng vboxmanage setextradata
lệnh để cấu hình máy ảo. Ví dụ,
vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952
sẽ khiến CPUID trả về 50202952₍₁₆₎ trong thanh ghi EBX, khi được gọi với EAX được đặt thành 80000003₍₁₆₎. (Từ giờ trở đi, các số thập lục phân sẽ được viết là 0xNN hoặc NNh.)
Đặt chuỗi nhà cung cấp CPU
Nếu EAX bằng 0 (hoặc 80000000h trên AMD), CPUID trả về nhà cung cấp dưới dạng chuỗi ASCII trong các thanh ghi EBX, EDX, ECX (thông báo đơn hàng). Đối với CPU AMD, chúng trông như thế này:
| 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" |
(Lấy từ Đặc tả CPUID của AMD , tiểu mục "CPUID Fn0000_0000_E")
Nếu bạn kết hợp EBX, EDX và ECX, bạn sẽ nhận được AuthenticAMD
.
Nếu bạn có Bash và các tiện ích Unix truyền thống, bạn có thể dễ dàng đặt nhà cung cấp với các lệnh sau:
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
Đặt chuỗi thương hiệu CPU
Nếu EAX là 80000002h, 80000003h, 80000004h, CPUID trả về 16 ký tự ASCII của chuỗi thương hiệu trong các thanh ghi EAX, EBX, ECX, EDX, tổng cộng 3 * 16 = 48 ký tự; chuỗi được kết thúc bằng một ký tự null . Lưu ý rằng tính năng này đã được giới thiệu với bộ xử lý Pentium 4. Đây là cách chuỗi thương hiệu có thể nhìn trên bộ xử lý 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" |
|-----------------|-----------------|------------------|
(Lấy từ Tài liệu tham khảo lập trình mở rộng tập hợp kiến trúc Intel , tiểu mục 2.9, "Hướng dẫn CPUID", bảng 2-30. Là ký tự null (giá trị số 0).)
Nếu bạn đặt kết quả cùng nhau, bạn sẽ nhận được Intel(R) Pentium(R) 4 CPU 1500MHz☠
.
Nếu bạn có Bash và các tiện ích Unix truyền thống, bạn có thể dễ dàng đặt thương hiệu bằng các lệnh sau:
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
Nếu bạn có dấu nhắc lệnh của Windows, bạn có thể đặt nhãn hiệu thành Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 bằng cách chạy:
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 Các HostCPUID
giá trị được lấy từ báo cáo lỗi VirtualBox # 7865 .