Chinaunix首页 | 论坛 | 博客
  • 博客访问: 195835
  • 博文数量: 40
  • 博客积分: 2265
  • 博客等级: 大尉
  • 技术积分: 434
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-23 17:01
文章分类

全部博文(40)

文章存档

2014年(1)

2013年(2)

2012年(6)

2011年(5)

2010年(26)

我的朋友

分类: C/C++

2012-07-06 16:45:19

   由于软件的特殊性,需要将机器码写到软件中用于鉴权。所以这几天找了一些linux下获取CPUID和MAC地址的代码,均测试通过。下面是代码:
linux获取CPUID

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(int argc, char* argv[])
  4. {
  5.    unsigned long s1,s2,s3,s4;
  6.  char string[128];
  7.  char szCpuId[1024];
  8.  char p1[128], p2[128];
  9.  unsigned int eax = 0;
  10.         unsigned int ebx,ecx,edx;

  11.  asm volatile
  12.  ( "cpuid"
  13.         : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
  14.         : "0"(0)
  15.  );
  16.  snprintf(szCpuId, 5, "%s", (char *)&ebx);
  17.         snprintf(szCpuId+4, 5, "%s", (char *)&edx);
  18.         snprintf(szCpuId+8, 5, "%s", (char *)&ecx);

  19.  asm volatile
  20.  ( "movl $0x01 , %%eax ; \n\t"
  21.   "xorl %%edx , %%edx ;\n\t"
  22.   "cpuid ;\n\t"
  23.   "movl %%edx ,%0 ;\n\t"
  24.   "movl %%eax ,%1 ; \n\t"
  25.   :"=m"(s1),"=m"(s2)
  26.  );

  27.  sprintf((char *)p1, "-%08X\n%08X-", s1, s2);
  28.  snprintf(szCpuId+12, 20, "%s", (char *)p1);

  29.  asm volatile
  30.  ( "movl $0x03,%%eax ;\n\t"
  31.   "xorl %%ecx,%%ecx ;\n\t"
  32.   "xorl %%edx,%%edx ;\n\t"
  33.   "cpuid ;\n\t"
  34.   "movl %%edx,%0 ;\n\t"
  35.   "movl %%ecx,%1 ;\n\t"
  36.   :"=m"(s3),"=m"(s4)
  37.  );

  38.  sprintf((char *)p2, "%08X-%08X\n", s3, s4);
  39.  snprintf(szCpuId+31, 19, "%s", (char *)p2);

  40.  printf((char*)szCpuId);

  41.  return 0;
  42. }

获取MAC地址:
 

点击(此处)折叠或打开

  1. #include <sys/ioctl.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <net/if.h>

  8. int get_mac(char* mac)

  9. {
  10.     struct ifreq tmp;
  11.     int sock_mac;
  12.     char mac_addr[30];
  13.     sock_mac = socket(AF_INET, SOCK_STREAM, 0);
  14.     if( sock_mac == -1){
  15.         perror("create socket fail\n");
  16.         return -1;
  17.     }
  18.     memset(&tmp,0,sizeof(tmp));
  19.     strncpy(tmp.ifr_name,"eth0",sizeof(tmp.ifr_name)-1 );
  20.     if( (ioctl( sock_mac, SIOCGIFHWADDR, &tmp)) < 0 ){
  21.         printf("mac ioctl error\n");
  22.         return -1;
  23.     }
  24.     sprintf(mac_addr, "%02x%02x%02x%02x%02x%02x",
  25.             (unsigned char)tmp.ifr_hwaddr.sa_data[0],
  26.             (unsigned char)tmp.ifr_hwaddr.sa_data[1],
  27.             (unsigned char)tmp.ifr_hwaddr.sa_data[2],
  28.             (unsigned char)tmp.ifr_hwaddr.sa_data[3],
  29.             (unsigned char)tmp.ifr_hwaddr.sa_data[4],
  30.             (unsigned char)tmp.ifr_hwaddr.sa_data[5]
  31.             );
  32.     printf("local mac:%s\n", mac_addr);
  33.     close(sock_mac);
  34.     memcpy(mac,mac_addr,strlen(mac_addr));
  35.     return 1;
  36. }

  37. int main()
  38. {
  39.     char buff[512];
  40.     memset(buff, 0, 512);
  41.     get_mac(buff);
  42.     fprintf(stderr, "%s\n", buff);
  43. }

具体原理网上有很多,代码也有很多,我只是找了几个可用的代码备份,以便以后使用
阅读(8679) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~