基于硬盘号和CPU序列号的软件加密技术

        CPU序列号是一个建立在处理器内部的、唯一的、不能被修改的编号。它由96位数字组成。高32位是CPU ID,用来识别CPU类型。低64位每个处理器都不同,唯一地代表了该处理器。CPU号可以用来识别每一个处理器。为了适应这一新特征,Intel在处理中增加了两条指令(“读取”和“禁止”)和一个寄存器位(模式指定寄存器位:Model Specific Register一“MSR”)。读取指令扩展了CPUID读取指令。当执行读取指令时可以得到96位的处理器序列号。禁止指令可以禁止对处理器序列号的读取。为了配合CPU序列号的读取和禁止,设置了MSR位。当MSR位为“0”时可以读取CPU序列号;当MSR为“1”时只能读取高32位(即CPU ID)而低64位全为零,只能通过reset CPU才能启用MSR。

实现代码:

void CWaterSaveDlg::OnBnClickedButton6()
{
    // TODO: 在此添加控件通知处理程序代码
    unsigned long s1,s2;
    unsigned char vendor_id[]="------------";//CPU提供商ID
    CString str1,str2,str3;
    // 以下为获得CPU ID的汇编语言指令
    _asm    // 得到CPU提供商信息 
    {  
        xor eax,eax   // 将eax清0
            cpuid         // 获取CPUID的指令
            mov dword ptr vendor_id,ebx
            mov dword ptr vendor_id[+4],edx
            mov dword ptr vendor_id[+8],ecx  
    }
    str1.Format("CPU提供商ID:%s",vendor_id);

    _asm    // 得到CPU ID的高32位 
    { 
        mov eax,01h    
            xor edx,edx
            cpuid
            mov s2,eax
    }
    str2.Format("%08X-",s2);

    _asm    // 得到CPU ID的低64位
    { 
        mov eax,03h
            xor ecx,ecx
            xor edx,edx
            cpuid
            mov s1,edx
            mov s2,ecx
    }
    str3.Format("%08X-%08X\n",s1,s2);
    str2="CPU序列号:" + str2 + str3;
    MessageBox(str2);
}

posted on 2015-04-12 19:39  大宴天下  阅读(2890)  评论(0编辑  收藏  举报