基於硬盤號和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);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM