【问题标题】:How can I uniquely identify a machine in C?如何在 C 中唯一标识一台机器?
【发布时间】:2011-11-18 10:31:39
【问题描述】:

我想在 C 中唯一标识一台机器。

以下是具有序列号的来源,但不能保证它们是唯一的或存在的(如可移动硬盘或网卡)。

  • CPU:我正在使用cpuid 指令,但是,除了 Pentium 3 之外的任何处理器都没有实现序列号,即不相关。我可以使用处理器签名,但这对于每个处理器来说并不是唯一的。
  • 硬盘:?
  • BIOS:?
  • 主板:?
  • MAC 地址:通过系统函数调用。

对于所有的问号,我如何获得 C 中的序列号? 如果您回答系统相关的解决方案,请同时提供 Windows/*nix。 另外,对于 Windows,请不要使用 WMI。

谢谢!

【问题讨论】:

  • 您想监视您的程序的用户?
  • 拥有序列号如何暗示间谍活动?
  • 仅仅是因为您可以追踪个人行为。想象一下,您在 Web 浏览器中实现了这一点。然后,这可以用于跟踪从特定机器使用该浏览器进行的所有 Web 访问,无论它以哪种 Web 身份呈现。因此,这很容易被滥用于侵犯隐私权。
  • 啊,这就是你犯错误的地方。此代码是客户端可执行文件。不需要序列号,如果这是它的目的,程序本身可以通过键盘记录跟踪所有计算机的使用情况。
  • 不,我不认为我犯了“错误”。我很清楚cookies的概念。 Cookies(至少原则上)可以被用户删除,礼貌的软件会询问我们是否允许他们存储一个。将 cpuid 用于此类事情是恶意的,因为我不能轻易更改我的 cpuid,因为我可以删除 cookie。

标签: c windows linux identification


【解决方案1】:

一般来说,您需要识别组件的组合,并了解组件可以并且会随着时间的推移而变化。您需要容差算法来做出明智的猜测,即更改何时代表您之前确定的机器的更新,或您以前从未见过的新机器。

当您需要确定您正在处理哪台机器并与您之前看到的机器的快照进行比较时,一种简单的方法是枚举您列出的所有组件。如果任何与序列号匹配的东西,您可以非常安全地假设您正在处理同一台机器(当然,有人可能将硬盘驱动器转移到新机器上......但是,这是简单的 方法。商业级启发式方法要复杂得多。)。

专门用于软件激活的这种方法的使用受到一项正在积极实施的专利的保护,因此请小心您正在做的事情。如果您确实想这样做以保护您的软件,最好使用商业解决方案。有些是相当实惠的。谷歌“软件激活”选项。

这里有一些获取特定系统信息的参考资料(并非所有都是特定的 C 食谱,但 C 可以在每种情况下使用)。

硬盘窗口 http://www.codeproject.com/KB/cs/hard_disk_serialno.aspx

硬盘 Linux http://www.webmasterworld.com/forum40/957.htm

BIOS 窗口 http://msdn.microsoft.com/en-us/library/aa394077(v=vs.85).aspx

BIOS Linux http://www.dufault.info/blog/a-better-way-to-find-your-bios-version-in-linux/

MAC 地址窗口 C++: Get MAC address of network adapters on Vista?

MAC 地址 Linux http://www.linuxquestions.org/questions/programming-9/linux-determining-mac-address-from-c-38217/

【讨论】:

  • 至于windows链接,我特别说明,没有WMI。至于linux bios链接,是版本,不是序列号。
  • @Eric J。感谢您提及现有专利!知道什么时候到期吗?
  • @supertwang:那是Uniloc持有的以216结尾的专利。不确定到期。见en.wikipedia.org/wiki/Uniloc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 2010-11-27
  • 2016-09-09
  • 2022-11-16
  • 2012-09-13
相关资源
最近更新 更多