通过C++在Windows上的唯一CPU ID

Unique CPU ID on Windows via C++

本文关键字:唯一 CPU ID C++ Windows 通过      更新时间:2023-10-16

好吧,我想得到一个唯一的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 年间隔到期之前发布新版本。因此,无论如何,客户都必须购买升级并获得新密钥。