【问题标题】:How can I get computer specific string/code [closed]如何获取计算机特定的字符串/代码 [关闭]
【发布时间】:2021-07-18 12:58:07
【问题描述】:

无论操作系统如何,我都需要一个代码来获取计算机特定的字符串/代码。它看起来像下面的代码,我的意思是 getCPU() 给出不同的结果。我不明白为什么,我错在哪里?

我注意到的问题:

  1. 显然在重新安装后结果会发生变化
  2. 在极少数情况下,即使不重新安装,结果也会发生变化

问题出在哪里?

#include <net/if_dl.h>      
#include <net/if_types.h>      
#include <ifaddrs.h>  
#include <mach-o/arch.h>  

   unsigned short hashMacAddress( unsigned char* mac ) { 
   unsigned short hash = 0;             

   for ( unsigned int i = 0; i < 6; i++ )              
   {       
      hash += ( mac[i] << (( i & 1 ) * 8 ));           
   }       
   return hash;              
} 

    char *getMacHash() { 
            char* ret = new char[255];
            unsigned short mac1=0;
            unsigned short mac2=0;

               
     
   bool foundMac1 = false;   
       struct ifaddrs* ifaphead; 
       if ( getifaddrs( &ifaphead ) != 0 ) 
            return ret;  

     
       struct ifaddrs* ifap;     
       for ( ifap = ifaphead; ifap; ifap = ifap->ifa_next )                  
       {       
          struct sockaddr_dl* sdl = (struct sockaddr_dl*)ifap->ifa_addr;     
          if ( sdl && ( sdl->sdl_family == AF_LINK ) && ( sdl->sdl_type == IFT_ETHER ))                 
          {              
          if ( !foundMac1 )  
          {                  
             foundMac1 = true;                
             mac1 = hashMacAddress( (unsigned char*)(LLADDR(sdl))); //sdl->sdl_data) + sdl->sdl_nlen) );       
          } else {           
             mac2 = hashMacAddress( (unsigned char*)(LLADDR(sdl))); //sdl->sdl_data) + sdl->sdl_nlen) );       
             break;          
          }                  
          }    
       }       

       freeifaddrs( ifaphead );  

            sprintf(ret, "S_%d%d", mac1, mac2);

            return ret;     
    } 
                   
     #include <mach-o/arch.h>    
     unsigned short getCpuHash() {         
         const NXArchInfo* info = NXGetLocalArchInfo();    
         unsigned short val = 0;            
         val += (unsigned short)info->cputype;               
         val += (unsigned short)info->cpusubtype; 
         
         return val;             
     }   

         
    char *getCPU() {  
        char* ret = new char[255];
      unsigned short cpu;             
      cpu=getCpuHash();
      
      if (cpu>118)    
            sprintf(ret, "%dX%s", getCpuHash(), getMacHash());
      else
            sprintf(ret, "%dx%s", getCpuHash(), getMacHash());

        strcpy(ret,cleanChars(ret));

        if (strlen(ret)>50) {
            char tmp[50];
            strncpy(tmp, ret, 50);
            strcpy(ret, tmp);    
        }
      
        return cleanChars(ret);
    } ```

【问题讨论】:

  • 您到底想识别什么?你对“同一台机器”的标准是什么?
  • 你不会得到那个代码:用几个段落解释我们如何在没有任何操作系统的情况下编译然后运行 ​​C 代码,以及如何在没有任何操作系统的情况下进行 TCP/IP 传输。
  • 另外,如果您将新的以太网控制器添加到计算机会发生什么?其中一些花费几十欧元或美元....

标签: c++ c macos


【解决方案1】:

getifaddrs() 提供了一个描述本地系统网络接口的链表。不保证顺序。如果您有多个 NIC,则应先对列表进行排序,然后再创建哈希。

在大多数操作系统上,可以将任意值指定为 MAC 地址。一些固件如 U-Boot 甚至允许选择一个随机数作为 MAC 地址(参见配置参数 CONFIG_NET_RANDOM_ETHADDR)。

您可以使用根分区的 UUID 作为标识符。通常这不会更改,除非重新安装操作系统。但当然用户可以更改它。

【讨论】:

    【解决方案2】:

    最好的解决方案是使用多个硬件 ID 对机器进行指纹识别。我不认为所有操作系统都可以通过一种方法来完成。

    getCPU() 不是一个好主意。尝试使用 getifaddrs() 探索网络地址。

    您也可以生成自己的标识符,而不是读取计算机硬件ID,而是生成自己的ID并将其存储在某个地方,这样您以后就可以识别机器。我知道,安全性较低,因为用户可以复制和粘贴标识符文件,但取决于您尝试执行的操作。

    【讨论】:

      猜你喜欢
      • 2017-09-04
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多