生成基于硬件的computerID

Phi*_*all 5 c++ windows hardware unique

我有一个关于为许可目的生成特定计算机ID的问题.优选地,该ID应该是基于硬件的,因此如果用户重新格式化则不应该改变.此外,用户改变生成ID的信息也不容易(或者甚至不可能).目前我只有两个组合,CPUID标准和功能标志以及机器中第一个物理驱动器的几何和总大小.虽然这似乎是适合大多数普通PC的,很多上网本,例如都使用完全相同的硬件制成,所以你会得到相同的ID在这种情况下,许多机器.您能否建议我可以使用其他一些硬件组件?

我有两个要求:

  1. 它不能使用WMI.

  2. 它必须在许多情况下工作(包括没有权限或权限很少的用户).我想过使用物理驱动器的序列,但如果用户不在管理员模式下,这似乎很难检索.

我在Windows上使用C++.

在此先感谢您的任何建议.

亲切的问候,

Philip Bennefall

rav*_*int 4

您可以使用第一个 MAC 地址,该地址由硬件制造商分配,永远不会改变。

像这样的东西:

/** 

  return string containing first MAC address on computer

 requires adding Iphlpapi.lib to project

*/
string GetMac()
{
    char data[4096];
    ZeroMemory( data, 4096 );
     unsigned long  len = 4000;
    PIP_ADAPTER_INFO pinfo = ( PIP_ADAPTER_INFO ) data;
    char sbuf[20];
    string sret;

    DWORD ret = GetAdaptersInfo( pinfo, &len );
    if( ret != ERROR_SUCCESS )
        return string("**ERROR**");

    for(int k = 0; k < 5; k++ ) {
        sprintf(sbuf,"%02X-",pinfo->Address[k]);
        sret += sbuf;
    }
    sprintf(sbuf,"%02X",pinfo->Address[5]);
    sret += sbuf;

    return( sret );
}
Run Code Online (Sandbox Code Playgroud)

恕我直言,这对于价值高达一千美元的软件许可来说已经足够了,所需要的只是防止临时消费者与邻居共享您的软件。积极主动的海盗可以绕过它,但拥有足够知识和动机的海盗并不频繁,不值得您花费更多努力来击败他们,更重要的是,您不想给诚实的客户带来不便。

如果您的软件非常有价值,以至于有动机的盗版者构成了真正的威胁,那么硬件加密狗的成本和不便就变得合理了。

我也不相信堆积更多的硬件签名、磁盘驱动器 ID、主板配置等。安全性的提高是微乎其微的,而出现问题的可能性却大大增加,因此您最终会浪费时间来支持具有不寻常设置的客户,并惹恼那些简单地放弃您的未知号码。

使用 MAC 地址实现一个简单的系统,似乎总是有效。接受偶尔的盗版者可能会因为破坏您的许可证而受到惩罚。将您的精力集中在改进您的软件上,以便您将获得更多诚实的客户。

一个系统可能有多个网卡(例如以太网和无线),并且用户可以更改显示顺序(用户为什么要这样做?)。为了处理这个问题,许可证需要与系统上任何位置的网卡相匹配,需要如下代码:

/**

  The MAC addresses of ethernet network cards present on computer

  @param[out] vMAC vector of strings containing MAC addresses in XX-XX-XX-XX-XX-XX format

  returns empty vector on error

  See discussion of this 
  http://stackoverflow.com/questions/6131123/generating-hardware-based-computerid/6131231#6131231

*/

void cLicenser::GetMac( vector < string >& vMac )
{
    vMac.clear();
    char data[4096];
    ZeroMemory( data, 4096 );
    unsigned long  len = 4000;
    PIP_ADAPTER_INFO pinfo = ( PIP_ADAPTER_INFO ) data;

    DWORD ret = GetAdaptersInfo( pinfo, &len );
    if( ret != ERROR_SUCCESS )
        return;

    while ( pinfo )
    {
        // ignore software loopbacks
        if( pinfo->Type != MIB_IF_TYPE_LOOPBACK )
        {
            char sbuf[20];
            string sret;
            for(int k = 0; k < 5; k++ )
            {
                sprintf(sbuf,"%02X-",pinfo->Address[k]);
                sret += sbuf;
            }
            sprintf(sbuf,"%02X",pinfo->Address[5]);
            sret += sbuf;
            vMac.push_back( sret );
        }
        pinfo = pinfo->Next;
    }

}
Run Code Online (Sandbox Code Playgroud)