本帖最后由 th_gsb 于 2009-07-22 09:32:25 编辑

解决方案 »

  1.   

    你可以这样
    1.获取CPU序列号(这个现在的CPU都有序列号了)
    2.进行base64编码--进行md5加密
    3.生成dat文件,请求licence文件然后你的注册机就进行反向的生成licence文件
      

  2.   

    1.CPU序列号,MAC地址,硬盘序列号,多个号码组合
    2.MD5,CRC16等计算
    3.可以自己建立对应关系
      

  3.   

    首先谢谢1楼的朋友。
    对于获取CPU序列号,我之前也在网上查过了。听说同一批次的CPU序列号是一样的。
    对于MD5加密我不太懂,这样加密后就可以把那么长的硬盘号变成6位的申请码了吗?
      

  4.   

    首先感谢您提供的思路!
    对于多个号码组合我以前想过,可是假如硬盘号10位,CPU号10位,MAC地址10位,组合后岂不是30位了,之后怎么变成6位的申请号啊?
      

  5.   

    用这些加壳软件保护下,功力好的话自己写
    VMProtect
    Themida/WinLicense
    ASProtect
    Armadillo
    ZProtect
    TTProtect
    NoobyProtect
      

  6.   

    6位申请号? 用8位吧 硬盘号 16进制正好8位 这个号是唯一的了
    加密 有很多算法  DES MD5 应该就够用了  要是LZ 不放心 在混合加密下
      

  7.   

    基本上就是获取 硬盘、CPU 的序列号。/**
     * 获取硬盘序列号 www.vidun.com
     */
    BOOL __stdcall vw_get_hdisk_serialnumber( LPTSTR lpszSerialNumber, DWORD dwSize )
    {
    BOOL  bRet = FALSE;
    TCHAR szNameBuf[ 12 ];
    DWORD dwSerialNumber;
    DWORD dwMaxLen; 
    DWORD dwFileFlag;
    TCHAR szSysNameBuf[ 10 ];

    bRet = ::GetVolumeInformation
    (
    "c:\\",
    szNameBuf,
    sizeof(szNameBuf), 
    & dwSerialNumber, 
    & dwMaxLen,
    & dwFileFlag,
    szSysNameBuf,
    sizeof(szSysNameBuf)
    );
    if ( bRet )
    {
    _sntprintf( lpszSerialNumber, dwSize-sizeof(TCHAR), "%x", dwSerialNumber );
    }
    return bRet;
    }/**
     * 获取 CPUID www.vidun.com
     */
    BOOL __stdcall vw_get_cpuid( LPTSTR lpszCPUID, DWORD dwSize )
    {
    //
    // lpszCPUID - [out] cpuid 返回值
    // dwSize - [in]  返回值缓冲区大小
    // RETURN - TRUE / FALSE
    //
    // 备注:
    // _asm cpuid 指令可以被一下 CPU 识别:
    // - Intel 486 以上的 CPU
    // - Cyrix M1 以上的 CPU
    // - AMD Am486 以上的 CPU
    // if ( NULL == lpszCPUID || 0 == dwSize )
    {
    return FALSE;
    } BOOL  bException = FALSE;
    TCHAR szOEMInfo[ 13 ] = {0};
    INT nFamily;
    INT nEAXValue, nEBXValue, nECXValue, nEDXValue;
    INT nALValue;
    ULONG ulIdPart1 = 0;
    ULONG ulIdPart2 = 0;
    ULONG ulIdPart3 = 0;
    ULONG ulIdPart4 = 0; __try
    {
    //
    // get OEM info
    //
    // (1)判断CPU厂商,先让 EAX = 0,再调用 cpuid
    //
    _asm
    {
    mov eax, 0
    cpuid
    mov DWORD PTR szOEMInfo[0], ebx
    mov DWORD PTR szOEMInfo[4], edx
    mov DWORD PTR szOEMInfo[8], ecx
    mov BYTE PTR szOEMInfo[12], 0
    }

    //
    // get family number
    //
    // (2)CPU 到底是几 86,是否支持 MMX
    // 先让 EAX = 1,再调用 cpuid
    // EAX 的 8 到 11 位就表明是几 86
    // 3 - 386
    // 4 - i486
    // 5 - Pentium
    // 6 - Pentium Pro Pentium II
    // 2 - Dual Processors
    // EDX 的第 0 位: 有无 FPU
    // EDX 的第 23 位: CPU 是否支持 IA MMX,很重要啊!如果你想用那 57 条新增的指令,先 
    // 检查这一位吧,否则就等着看Windows的“该程序执行了非法指令,将被关闭”吧 。
    //
    // (3)专门检测是否 P6 架构
    // 先让 EAX = 1,再调用 CPUID
    // 如果 AL = 1,就是 Pentium Pro 或 Pentium II
    //
    // (4)专门检测 AMD 的 CPU 信息
    // 先让 EAX = 80000001H,再调用 CPUID
    // 如果 EAX = 51H,是 AMD K5
    // 如果 EAX = 66H,是 K6
    // K7 是什么标志,只有等大家拿到 K7 的芯再说了。
    // EDX 第 0 位: 是否有 FPU(多余的!谁用过没 FPU 的 K5,K6?)
    // EDX 第 23 位,CPU 是否支持 MMX
    //
    _asm
    {
    mov eax, 1
    cpuid
    mov nEAXValue, eax
    mov nEBXValue, ebx
    mov nECXValue, ecx
    mov nEDXValue, edx
    }
    nFamily = ( 0xf00 & nEAXValue ) >> 8; _asm
    {
    mov eax, 2
    cpuid
    mov nALValue, eax
    }

    //
    // get cpu id
    //
    // CPU 的序列号用一个 96bit 的串表示,格式是连续的 6 个 WORD 值:XXXX-XXXX-XXXX-XXX-XXXX-XXXX。
    // WORD是16个bit长的数据,可以用unsigned short模拟:
    // typedef unsigned short WORD;
    // 获得序列号需要两个步骤,首先用 eax = 1 做参数,返回的 eax 中存储序列号的高两个 WORD。
    // 用 eax = 3 做参数,返回 ecx 和 edx 按从低位到高位的顺序存储前 4 个 WORD 即可得到 cpuid
    //
    _asm
    {
    mov eax, 01h
    xor edx, edx
    cpuid
    mov ulIdPart1, edx
    mov ulIdPart2, eax
    }
    _asm
    {
    mov eax, 03h
    xor ecx, ecx
    xor edx, edx
    cpuid
    mov ulIdPart3, edx
    mov ulIdPart4, ecx
    }
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
    bException = TRUE;
    } _sntprintf
    (
    lpszCPUID, dwSize-sizeof(TCHAR),
    _T("%s-%d-%08x%08x%08x%08x"),
    szOEMInfo, nFamily,
    ulIdPart1, ulIdPart2, ulIdPart3, ulIdPart4
    );
    _tcslwr( lpszCPUID ); return bException ? FALSE : TRUE;
    }
      

  8.   

    同意一楼的做法,不过说到读硬盘。cpu的话,好像都不是很行,干脆认网卡吧。MD5出来的是32位长,你要6位长也没问题,随便hash一下就行了的
      

  9.   

    楼主QQ多少?希望能多沟通下!
      这次我也是第一次要给一个开发的软件绑定硬件来注册!在下QQ:382333514
      

  10.   

    希望我们能互相学习。
    由于公司不能上QQ等聊天工具,所以只能下班后与你沟通,QQ:23805194