在一些特殊的场景中,经常会接触到一些古老、复杂、昂贵的专业软件,虚拟机是这类软件的一个很好的归宿。最近在迁移一个包含专业软件的虚拟机至其他电脑时,发现其授权系统检测到硬件变更导致软件不再工作。毕竟虚拟机是一个简单的虚拟化平台,于是就简单研究了一下VMware修改一些硬件参数的方法,在此做一个简单的记录。
注意:本文仅提供一种VMware的使用方法,与虚拟机去虚拟化无关,不涉及其他应用软件,也不鼓励用于绕过任何商业软件的授权限制,请尊重知识产权。
一、修改CPUID
通过wmic cpu get processorid
可以在目标CPU的系统下获取ProcessorId,图中所示为Azure虚拟机,因此ID均为0。
如下所示,首先使用工具(如67Tools)将十六进制的ProcessorId转换为二进制并从中间断开,随后按照规则填入cpuid.1
参数中。将修改好的四行参数填入当前虚拟机所在目录下面的.vmx
中,ProcessorId即修改成功。
1 2 3 4 5 6 7 8 9 10 11 |
# 获取CPUID 178BFBFF00A50F00 # 十六进制转换二进制 0001011110001011111110111111111100000000101001010000111100000000 # 将64位长度的CPUID从中间分为两个32位 00010111100010111111101111111111 00000000101001010000111100000000 # 前一段填入ecx和edx,后一段填入eax和ebx cpuid.1.eax = "00000000101001010000111100000000" cpuid.1.ebx = "00000000101001010000111100000000" cpuid.1.ecx = "00010111100010111111101111111111" cpuid.1.edx = "00010111100010111111101111111111" |
二、修改CPU型号
首先,通过wmic cpu get name
在目标CPU的系统下获取完整的CPU型号。建议使用命令来获取,英特尔的命名更为复杂一些,还有主频包含在内。
对获取到的名称四个字符一组进行分段,其中的空格同样计为一个字符,最后一组末尾不满四个字符则以空格补齐。然后使用字符转二进制工具(如67Tool),每一组获得四段对应四个字符的二进制数据。
如图所示,四组二进制数据按照首位转置的顺序,依次填入cpuid
参数中。
填充好一行后,按照以上的规则继续填充下一行,直至CPU型号所有内容均变换并填入。CPU型号数据填充后剩余的空行则以0010:0000
这样的空格进行填充,完整的示例如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# AMD Ryzen 5 7530U with Radeon Graphics cpuid.80000002.eax="0010:0000:0100:0100:0100:1101:0100:0001" cpuid.80000002.ebx="0110:0101:0111:1010:0111:1001:0101:0010" cpuid.80000002.ecx="0010:0000:0011:0101:0010:0000:0110:1110" cpuid.80000002.edx="0011:0000:0011:0011:0011:0101:0011:0111" cpuid.80000003.eax="0110:1001:0111:0111:0010:0000:0101:0101" cpuid.80000003.ebx="0101:0010:0010:0000:0110:1000:0111:0100" cpuid.80000003.ecx="0110:1111:0110:0101:0110:0100:0110:0001" cpuid.80000003.edx="0111:0010:0100:0111:0010:0000:0110:1110" cpuid.80000004.eax="0110:1001:0110:1000:0111:0000:0110:0001" cpuid.80000004.ebx="0010:0000:0010:0000:0111:0011:0110:0011" cpuid.80000004.ecx="0010:0000:0010:0000:0010:0000:0010:0000" cpuid.80000004.edx="0010:0000:0010:0000:0010:0000:0010:0000" |
将修改好的四行参数填入当前虚拟机所在目录下面的.vmx
中,处理器型号即修改成功。修改成功后效果如图,此时显示的处理器型号不再与宿主机一致。
三、冻结时间
虚拟机可通过time.synchronize
参数锁定当前时间,该方法在未来32位时间溢出后可能会很有用。需要注意的是使用此方法锁定时间后,虚拟机每次启动均会从锁定的时刻开始计时,即关机后会丢失已流逝的时间。如果是对时间有要求的软件,还需搭配快照进行状态的恢复。在以下参数中,默认情况下首行的Tools.syncTime
参数已指定为FALSE
,重复添加会导致虚拟机启动时报错。
1 2 3 4 5 6 7 |
# Tools.syncTime = "FALSE" time.synchronize.continue = "FALSE" time.synchronize.restore = "FALSE" time.synchronize.resume.disk = "FALSE" time.synchronize.shrink = "FALSE" time.synchronize.tools.startup = "FALSE" rtc.startTime = 1723420800 |
其中其中需要修改的rtc.startTime
使用的是时间戳,可通过以下的在线工具进行转换。将修改好的参数填入当前虚拟机所在目录下面的.vmx
中,虚拟机时间即完成锁定。在实际操作中发现有时由于时区原因虚拟机的目标时间与时间戳存在一定差异,请根据实际情况对时间戳的时间进行增减。
北京时间:beijing-time.org
UTC时间:onlineconversion.com
四、其余修改项
对于不需要联网的软件,博主一般仅保留内存、处理器、硬盘、显示器四项必要的组件。这样操作的话,在复制的过程中仅有CPU会随宿主的变化发生改变,硬盘ID并不会发生改变。
对于其余可在.vmx
中可以修改的内容,本文仅作简单的记录,不再进行详细的测试。在复制虚拟机至其他平台后,首次开机提示的【我已移动虚拟机】和【我已复制虚拟机】应选择前者,这样一些信息不会发生变化。
1 2 3 4 5 6 |
# 获得虚拟机网卡MAC地址 wmic nicconfig get macaddress # 获得虚拟机BIOS序列号 wmic bios get serialnumber # 获得虚拟机硬盘序列号 wmic diskdrive get serialnumber |
此外,虚拟机可通过快照和自动恢复快照的功能,实现每次开机复原虚拟机中文件为原始状态。
五、结语
用虚拟机解决授权问题的实例在专业软件领域并不罕见,这类软件由于安装、授权流程较为困难,若软硬件发生故障导致授权丢失重装会非常困难,虚拟机的快照和易迁移特性很大程度上弥补了这些不便。
任何技术均有两面性,请在不违法的合理范围内使用。
*个人整理,转载无需注明出处
大佬,本机为AMD的cpu,进行这样修改了之后,打开虚拟机会提示
不存在功能“cpuid.SS”,但实际情况下应当存在。
模块“FeatureCompatLate”启动失败。
需要删除cpuid.1.eax = “……”
cpuid.1.edx = “…..”才能正常进行进入,但这样就没法修改CPUid,请问如何解决的呢
第一次知道vmware可以这么玩
Σ(゚∀゚ノ)ノ
楼主,我根据我虚拟机progessid生成的二进制,对楼主的修改后填入了vmx文件,cpu型号用楼主的信息,但是填写后虚拟开机就蓝屏呢 ,另外楼主的进程转二进制后是否前面加了三个0,才补齐的?
一般我们都建议客户重新买,不过好像有迁移工具能做到类似的动作机器码mac啥的都和源机一样
vmware不是有漫天的激活码吗
你说呢???