【问题标题】:C++ get Processor IDC++ 获取处理器 ID
【发布时间】:2011-08-05 06:19:40
【问题描述】:

这个话题没问题。 How to get Processor and Motherboard Id?

我想使用 C++ 代码获取处理器 ID,而不是使用 WMI 或任何第三方库。

或计算机上证明是唯一的任何东西。 一件事是以太网 ID,但它在某些机器上又是可移动的。我想主要用于许可目的。

处理器 ID 在所有主要处理器上是否唯一且可用?

【问题讨论】:

标签: c++ windows processor


【解决方案1】:

如果您使用的是 Visual Studio,Microsoft 在 <intrin.h> 标头中提供了 __cpuid instrinsic。链接的 msdn 站点上的示例。

【讨论】:

  • 那是 CPU 类型。几乎不是独一无二的;可能有数十亿个重复。例如。从链接页面,您可以获得“Genuine Intel(R) CPU 2.80GHz”以及一些位标志。
【解决方案2】:

嗯……

有一些特殊的库可以根据安装的硬件生成唯一 ID(因此对于指定的计算机,此 ID 始终相同)。大部分取主板 ID + HDD ID + CPU ID 并混合这些值。

谁重新发明轮子?为什么不使用这些库?有什么严重的原因吗?

【讨论】:

【解决方案3】:

我最近遇到了类似的问题,我做了以下事情。首先我获得了一些独特的系统识别值:

我采用这些值并以任意但确定的方式组合它们(阅读下面的更新!)(添加、异或、除和保留余数等)。像字符串一样迭代这些值并发挥创造力。最后,您将获得一个字节文字,您可以将其转换为字母和数字的 ASCII 范围,以获得一个独特的、“可读”的、看起来不像噪音的代码。

另一种方法可以简单地将这些值连接起来,然后通过对它们进行异或运算来“掩盖”它们(并且可能再次转换为字母)。

我是说它是唯一的,因为至少有一个输入应该是唯一的(MAC 地址)。当然,您需要对数论有所了解才能避免破坏这种独特性,但无论如何它应该已经足够好了。

重要更新:自从这篇文章以来,我学到了一些关于密码学的知识,我认为组成任意组合(基本上是你自己的哈希)几乎肯定是个坏主意。实践中使用的散列函数被构造为表现良好(如碰撞概率低)并且难以破解(构造一个与另一个具有相同散列值的值的能力)。构建这样的函数是一个非常困难的计算机科学问题,除非你有资格,否则你不应该尝试。正确的方法是将您可以收集的有关硬件的任何信息(即我在帖子中列出的信息)连接起来,并使用加密哈希或数字签名来获得可验证且安全的输出。也不要自己实现加密算法;有很多漏洞陷阱需要大量知识才能避免。使用知名且受信任的库来实现算法。

【讨论】:

  • 好@Tamás 但 VolumeInformation 不可靠。如果您格式化硬盘,那么它将被更改并且旧生成的许可证将无法使用。另一个想法是有很多工具可以根据我们的需要更改volumeID。计算机名称也可配置,并且有工具可以模拟/覆盖 MAC 地址。在这种情况下,客户可以轻松破坏许可证。
  • 可能丢失了mac地址,然后对其进行哈希处理,保存哈希值,并与它进行比较。
【解决方案4】:

你可以使用命令行。

wmic cpu list full

wmic baseboard list full

或WMI接口

#include <wmi.hpp>
#include <wmiexception.hpp>
#include <wmiresult.hpp>

#include <../src/wmi.cpp>
#include <../src/wmiresult.cpp> // used

#pragma comment(lib, "wbemuuid.lib")

struct Win32_WmiCpu
{

    void setProperties(const WmiResult& result, std::size_t index)
    {
        //EXAMPLE EXTRACTING PROPERTY TO CLASS
        result.extract(index, "ProcessorId", (*this).m_cpuID);
    }

    static std::string getWmiClassName()
    {
        return "Win32_Processor";
    }

    string m_cpuID;
    //All the other properties you wish to read from WMI

}; //end struct Win32_ComputerSystem
   
struct Win32_WmiMotherBoard
{

    void setProperties(const WmiResult& result, std::size_t index)
    {
        //EXAMPLE EXTRACTING PROPERTY TO CLASS
        result.extract(index, "SerialNumber", (*this).m_mBId);
    }

    static std::string getWmiClassName()
    {
        return "Win32_BaseBoard";
    }

    string m_mBId;

}; //end struct Win32_ComputerSystem


try
{
    const Win32_WmiCpu cpu = Wmi::retrieveWmi<Win32_WmiCpu>();
    strncpy_s(ret.m_cpu, cpu.m_cpuID.c_str(), _TRUNCATE);
}
catch (const Wmi::WmiException& )
{
}
try
{
    const Win32_WmiMotherBoard mb = Wmi::retrieveWmi<Win32_WmiMotherBoard>();
    strncpy_s(ret.m_mb, mb.m_mBId.c_str(), _TRUNCATE);
}
catch (const Wmi::WmiException& )
{
}

【讨论】:

    猜你喜欢
    • 2013-12-17
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2020-06-03
    • 1970-01-01
    • 2017-02-24
    • 2012-03-10
    相关资源
    最近更新 更多