通过C++在Windows上的唯一CPU ID
Unique CPU ID on Windows via C++
好吧,我想得到一个唯一的CPU ID,这样我就可以得到每台机器的唯一标识。我确实从 windows.h 库中检查了 __cpuid(),但问题是它得到的 ID,它是所有类型的 CPU 的 ID,如果你有一个 I3 核心处理器而我有一个 I3 核心处理器,它会给出相同的"唯一 ID"。
以下是我想出的方法,用于从 __cpuid() 制作一个 CPU ID,该 ID 返回相同类型处理器上的相同信息:
std::string GetCPUID(){
int CPUInfo[4] = {-1};
__cpuid(CPUInfo, 0);
if (CPUInfo[0] < 4)
return ""; //Error on retrieving
stringstream st;
for(int i = 0; i <= 3; i++){
st << CPUInfo[i];
}
return st.str();
}
我还检查了一个名为"硬件 ID 提取器"的程序,它实际上返回一个唯一的 CPU ID 作为我想要的 GUI,所以他们提供了一个 DLL,以便我们可以提取它生成的 CPU ID,我用 DLL 尝试了所有代码并按照他们的示例,但在 Windows 7 上运行时似乎什么都不返回。 很多其他人都在抱怨这一点在 Windows 7 上通过 DLL,即使 Windows 7 上的 GUI 返回正确的 CPU ID。
在硬件 ID 提取器中显示我的工作,
这是我下载DLL的网站(我选择了C++,VB,.NET的链接):http://www.soft.tahionic.com/download-hdd_id/free-download/free%20download.html
这是要下载的DLL本身:http://www.soft.tahionic.com/download-hdd_id/free-download/DLL%20compressed/HardwareIDExtractorC.dll
这是我从硬件ID提取器(我使用的是Visual Studio 2008)获得的代码:
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
int main (){
char* (__stdcall *GetIDESerialNumber)(BYTE);
HINSTANCE DllInst = NULL;
if (DllInst == NULL) DllInst = LoadLibrary("C:\HardwareIDExtractorC.dll");
printf( "LoadLibrary error %dn", GetLastError() );
if (DllInst) {
GetIDESerialNumber = (char* (__stdcall*)(BYTE))GetProcAddress(DllInst, "GetIDESerialNumber");
//Now call the imported function
cout << "SN: " << GetIDESerialNumber(0); // 0 = first IDE hard drive in your system
}else{
printf(" - Not Loaded");
}
_getch();
return 0;
}
在Visual Studio输出中,它显示DLL是通过以下语句执行的:
'Test.exe': Loaded 'C:HardwareIDExtractorC.dll', Binary was not built with debug information.
我得到的程序输出是:LoadLibrary error 998 - Not loaded
有人知道我可以做些什么来获得 CPU ID 唯一,就像在应用程序中的硬件 ID 提取器一样?我需要获取一个CPU ID,因为如果我获得HDD信息,用户可能会格式化他们的硬盘驱动器,程序将停止工作,因为我将其设计为仅工作指定的计算机。
我正在使用Windows 7 32位旗舰版和Intel I3酷睿处理器(如果这有帮助的话)。
我希望我的问题很清楚。提前感谢!
你不能做这个工作。 英特尔在奔腾 III 设计中引入了处理器序列号,可通过 cpuid 读取。 由于隐私问题,这引起了巨大的恶臭,英特尔被迫让步。 该功能在后来的奔腾III设计中被删除,并且从未被放回去。
您将不得不使用另一个指纹来源。 不要只使用一个,收集一堆,只有在多个更改时才声明它无效。 使用NIC MAC地址,RAM大小,磁盘卷序列号之类的东西。 SO已经有成千上万的问题。
硬件 ID 提取器可靠且易于使用。我有。因为我很久以前就购买了DLL和源代码,所以我不必购买升级。我只是自己更改了代码。
汉斯感谢您的回答,您知道这个名为"硬件ID"的程序 提取器"它声称它检索了一个 CPU ID
是的。DLL 不仅提供 CPU ID 和 HDD IDE ID,还提供许多其他与硬件相关的统计信息 (ID)。我已经在多个CPU(AMD和Intel)上尝试过它,它就像一个魅力。
方案
最便宜的"保护"是序列号。这真是太糟糕了。一个无意识的客户在互联网上提供它,每个人都免费拥有您的程序!更不用说今天的"黑客"懒得破坏您的软件保护。他们将使用假信用卡购买您的软件,并将密钥发布到网络上,或者他们将使用有效的信用卡购买软件,然后他们将使用 30 天退款政策取回款项。一些疯狂的软件经销商,如Plimus(是的,远离Plimus)正在对软件供应商强制执行这一点。 经典的序列号就像恐龙一样死了。
另一个建议,基于服务器的保护,也一点也不好。被假信用卡"黑客"欺骗起来有点困难,也不会在整个互联网上泄露密钥。但是您将失去至少一半的客户,因为如今每个人都有防火墙/防病毒软件,可以阻止您的程序连接到服务器。那么那些移动的呢?或者只能随机/罕见地访问互联网?我什至不敢谈论那些在机构/公司/组织的防火墙后面工作的人。这些公司中的大多数都是由无意识的网络管理员"统治"的,他们切断了除Internet Explorer(甚至Firefox)以外的任何程序访问Internet。我去过那里。我已经做到了。相信我,这是一场噩梦!在其他情况下,要将程序连接到互联网,您必须去管理部门填写大量申请表,最后也许,也许,他们会让程序访问互联网。也许通过代理。
无论如何,为您的程序执行基于密钥的可靠保护非常容易:向客户发送密钥,但不要发送经典密钥,而是发送基于硬件的密钥。这样,密钥将仅在该特定系统中工作。您甚至可以在您的网站上发布公告:"请随时公开此密钥。我不在乎":)
只是不要依赖单个硬件 ID(例如仅 CPU),而是依赖于所有硬件 ID。允许用户更改/升级除一个之外的所有硬件组件。因此,只要他们不更改整个计算机,许可证就可以使用。由于每 3.4 年购买一台新计算机(我在 Internet 上找到了统计数据),您应该允许用户要求 3 个新密钥(许可证重新激活)。您可能会在 3.4 年间隔到期之前发布新版本。因此,无论如何,客户都必须购买升级并获得新密钥。
- 何时在引用或唯一指针上使用移动语义
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 计算排序向量的向量中唯一值的计数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 通过组合不同的类型来创建唯一的id
- 使用Unique_ptr确保工厂中的对象唯一
- c++多进程编写一个唯一的文件
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何更改唯一指针向量的可见性
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何禁用 CPU 的无序执行
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++尝试深度复制唯一指针时出现内存访问冲突
- 具有引用成员的结构是否具有唯一的对象表示形式
- 使用 RTTI 克隆唯一指针的向量
- 如何在 c++ 中迭代数组中的唯一元素
- 通过C++在Windows上的唯一CPU ID