Phi*_*all 5 c++ windows hardware unique
我有一个关于为许可目的生成特定计算机ID的问题.优选地,该ID应该是基于硬件的,因此如果用户重新格式化则不应该改变.此外,用户改变生成ID的信息也不容易(或者甚至不可能).目前我只有两个组合,CPUID标准和功能标志以及机器中第一个物理驱动器的几何和总大小.虽然这似乎是适合大多数普通PC的,很多上网本,例如都使用完全相同的硬件制成,所以你会得到相同的ID在这种情况下,许多机器.您能否建议我可以使用其他一些硬件组件?
我有两个要求:
它不能使用WMI.
它必须在许多情况下工作(包括没有权限或权限很少的用户).我想过使用物理驱动器的序列,但如果用户不在管理员模式下,这似乎很难检索.
我在Windows上使用C++.
在此先感谢您的任何建议.
亲切的问候,
Philip Bennefall
您可以使用第一个 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)
| 归档时间: |
|
| 查看次数: |
6582 次 |
| 最近记录: |