正在生成基于硬件的计算机ID

Generating hardware based computerID

本文关键字:硬件 计算机 ID 于硬件      更新时间:2023-10-16

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

我有两个要求:

  1. 它不能使用WMI。

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

我在Windows上使用C++。

提前感谢您的任何建议。

您可以使用第一个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 );
}

IMHO,这足以授权价值高达1000美元的软件,而所需的只是防止普通消费者与邻居共享您的软件。一个有动机的海盗可以绕过它,但有足够知识和动机的海盗并不频繁,不足以让你花更多的精力来击败他们,更重要的是,你不想给诚实的客户带来不便。

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

我也不相信堆积更多的硬件签名、磁盘驱动器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;
    }
}

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

这是一篇文章的链接,该文章描述了如何获取这些信息。

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

还要记住,虚拟机使这一点更加复杂。我认为你最好的选择是像微软那样做。

微软确实使用了类似的方法,他们获取安装了操作系统的机器的硬件指纹,并将其与注册密钥一起通信,以激活操作系统/办公套件的副本。如果您大幅升级硬件(我认为有4个硬件组件),密钥将更改,您必须联系Microsoft并提供证据来重新验证您的Windows副本。

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

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

如果这样的东西简单可靠,微软早就发现了它并获得了专利。

一些硬件专家试图保护软件,包括在每个许可的软件包中都附带一个名为的"加密狗"的东西。嘿,有价值的新客户!只需插入加密狗并运行您的新软件!

看到鲁本·戈德堡(Rube Goldberg)安排的三四个加密狗将一个插入下一个,并挂在并行端口上,每个都能启用自己的软件包,真是一场骚乱。

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

也许这种方法会对你有所帮助。http://www.codeproject.com/Articles/319181/Haephrati-Searching-for-a-reliable-Hardware-ID

相关文章: