生成基于硬件的computerID

时间:2011-05-25 21:23:42

标签: c++ windows hardware unique

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

我有两个要求:

  1. 不得使用WMI。

  2. 它必须适用于大量情况(包括没有权限或权限很少的用户)。我想过使用物理驱动器的序列,但如果用户不处于管理员模式,这似乎很难检索。

  3. 我在Windows上使用C ++。

    提前感谢任何建议。

    亲切的问候,

    Philip Bennefall

6 个答案:

答案 0 :(得分: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 );
}
恕我直言,这足以获得价值高达一千美元的许可软件,其中所有必要的是防止临时消费者与邻居分享您的软件。一个有动力的海盗可以解决这个问题,但是拥有足够知识和动力的海盗不足以让你花费更多努力去打败他们,更重要的是,你不想给你诚实的客户带来不便。

如果您的软件非常有价值,以至于激励海盗是一个真正的威胁,那么硬件加密狗的成本和不便就变得合理了。

我也不相信堆积更多硬件签名,磁盘驱动器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 ) {
    if( pinfo->Type == MIB_IF_TYPE_ETHERNET ) (
            // ignore software loopbacks and other strange things that might be present
        continue;
        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;
    }

}

答案 1 :(得分:3)

几年前我尝试过类似的事情并且失败了。我尝试使用我能读到的硬件ID的组合。大多数CPU都有一个CPUID,一个用于唯一标识和跟踪它们的唯一编号。然而问题是它并不是每个CPU都有这个ID。事实上,当我试用它时,英特尔赛扬系列没有这个ID。某些主板(主要是英特尔)也附带了一个可以使用的唯一ID。

Here是指向如何获取此信息的文章的链接。

我还使用了任何/所有MAC ID以及CPU ID&amp; MB ID作为生成唯一GUID的种子。您用作种子的硬件ID越多,执行得越好。问题是如果您升级任何硬件组件,ID会更改,软件密钥将失效。

另请注意,虚拟机会进一步复杂化。我认为你最好的办法就是做微软的工作。

Microsoft确实使用了类似的方法,即在安装操作系统的计算机上获取硬件指纹,并将其与注册密钥进行通信,以激活操作系统/ Office套件的副本。如果您显着升级硬件(我认为有4个硬件组件),密钥将会更改,您必须与Microsoft联系并提供证据以重新验证您的Windows副本。

答案 2 :(得分:2)

如果您只需要生成一次,那么GUID对于创建它的机器将是唯一的。问题是每次生成一个值时都会得到不同的值。但如果它是每台机器的一次性,GUID将起作用。

如果每台机器需要相同并且多次生成,则MAC地址是机器的通用ID(尽管您可能有多个MAC可供选择)。

答案 3 :(得分:1)

如果这样的事情简单可靠,微软很久以前就会找到并获得专利。

有人试图通过某些硬件doo-dad保护软件,包括在每个许可的软件包中发送一个名为 a 'dongle' 的东西。嘿,有价值的新客户!只需插入加密狗并运行新软件即可!

Rube Goldberg将三个或四个加密狗插入一个加入下一个并悬挂在并行端口上,每个都启用了自己的软件包,这是一个暴乱。

答案 4 :(得分:0)

许多选项之一是使用CPU ID。例如,比Windows注册表或网卡更好。您不希望用户每次更改网卡等时都会打扰您。我认为cpuid项目可以作为示例和起点。

答案 5 :(得分:0)