今天在写工作文档时,有网上好友问我关于CPUID被禁止取序列号后该怎么办?于是立即由single-core变为duo-core,呵呵,大脑不用升级就可自动完成,且无新成本发生。
网上其实也说到了禁止取序列号的代码:应该是下面这几句:
MOV ECX, 119H
RDMSR
OR EAX, 0020 0000H
WRMSR
我简单说明这几句,第二和第四分别是读写MSR寄存器的指令,第一句则表明了要访问的MSR的地址。119H对应该的MSR寄存器叫做BBL_CR_CTL MSR寄存器;第三句则是对第21位置1。在BBL_CR_CTL的bit21被置以后,processor number这一功能会被禁止,直至系统reset。要说明的是此bit21是write-once属性的,即仅可以在reset后被写入一次,这是在硬件上就做好的,所以一旦此位被修改,再写就不可能了。
对一些软件为什么要去置此位就不说了,大多也是安全或加密什么的。但是至少有一点,用户也许要使用processor number,这样就无法去读取了。
最简单的方法是不让修改此位的软件运行,更简单说就是检查一下当前正在运行的程序,看其执行文件中是否包含了相应代码的机器码,当然了,如果必要还要检查其加载的模块。下面是相应的机器码(注意,此代码不一定与“干这事的那个人”的代码完全相符。):
B9 19 01 00 00 mov ecx,119h
0F 32 rdmsr
0D 00 00 20 00 or eax,200000h
0F 30 wrmsr