Linux小知识–通过MAC地址查询厂家OUI(成功率很高)

  • Post author:
  • Post category:linux




MAC地址

英文全称:Medium Access Control,直译为介质访问控制,它通常被固化在每个以太网网卡(NIC,Network Interface Card)。MAC地址也叫做硬件地址,它采用48位(6字节)的十六进制格式。一个特点,全球唯一。

在这里插入图片描述



OUI

英文全称:Organizationally unique identifier (OUI) ,翻译过来是“组织唯一标识符”,由签发给各类组织的唯一标识符。其实通常就是各类大小公司。

在这里插入图片描述



二者关系

MAC地址通常为6个字节,48位,那么组成如下

在这里插入图片描述

前三个字节,就是OUI,后3个字节,则归这个OUI自己分配。

在这里插入图片描述

不过目前,在IEEE的网站上出现了另一种分法,将OUI分成了大中小三类,

在这里插入图片描述

大类MA-L:和前面说的长度一样,3个字节,24位,CSV中的格式如下

在这里插入图片描述

中类MA-M:长度变为了,3.5个字节,(好奇怪的说法),还是叫28位吧,例如

在这里插入图片描述

小类MA-S:长度变为了,4.5个字节,36位,例如:

在这里插入图片描述

所以,我们通过MAC地址判断厂家,最全的方式,就是分类判断。

首先:将所有的规则,整合到一个CSV文件中。例如

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

然后,通过遍历每行的方式,读取该文件,根据标记OUI的长度,与MAC地址的前24位,或者28位,或者36位做比较,才能获得最准确的OUI。

在这里插入图片描述

下面是查询函数

#define oui_txt			"/etc/full_oui.txt"
/*
mac:输入mac地址,xx:xx:xx:xx:xx:xx格式
oui:输出厂商
返回值
-1:出错
0:未查找到
1:查找到,在oui中返回
*/
int hz_get_oui(char* mac,char*oui)
{
	FILE *fp = NULL;
	char values[1024]={0};
	bool is_exist=false;
	char mac_header[9]={0};
	
  	if((fp = fopen(oui_txt,"r")) == NULL) 
	{
		printf("!!!open[%s] is error!\n",hz_addoui_txt);
		return -1;
	}
	fseek(fp,0,SEEK_SET);

	mac_header[0]=toupper(mac[0]);
	mac_header[1]=toupper(mac[1]);
	mac_header[2]=toupper(mac[3]);
	mac_header[3]=toupper(mac[4]);
	mac_header[4]=toupper(mac[6]);
	mac_header[5]=toupper(mac[7]);
	mac_header[6]=toupper(mac[9]);
	mac_header[7]=toupper(mac[10]);
	mac_header[8]=toupper(mac[12]);
	
	while(!feof(fp))
	{
		//本机信息
		memset(values,0,1024);
		fgets(values,1024,fp);

		if(strlen(values)<2)
		{
			printf("parse worklog:line too short\n");
		}
		else
		{
			if(values[6]==',')
			{
				if(memcmp(mac_header,values,6)==0)
				{
					strcpy(oui,values+7);
					is_exist=true;
					break;
				}
			}
			else if(values[7]==',')
			{
				if(memcmp(mac_header,values,7)==0)
				{
					strcpy(oui,values+8);
					is_exist=true;
					break;
				}
			}
			else if(values[9]==',')
			{
				if(memcmp(mac_header,values,9)==0)
				{
					strcpy(oui,values+10);
					is_exist=true;
					break;
				}
			}
		}
	}
	if(fp)
		fclose(fp);

	if(is_exist)
		return 1;
	else
		return 0;
}

配合代码的完整的OUI文件


在此下载



补充



奇怪的MAC地址

我们偶尔会看到一些IP地址,并无法查找到对应的OUI。

在这里插入图片描述

例如

在这里插入图片描述

这里就涉及到了前面MAC地址中OUI部分的两位


I/G(Individual/Group)位



如果I/G=0,则是某台设备的MAC地址,即单播地址;

如果I/G=1,则是多播地址(组播+广播=多播)。


G/L(Global/Local,也称为U/L位,其中U表示Universal)位



如果G/L=0,则是全局管理地址,由IEEE分配;

如果G/L=1,则是本地管理地址,是网络管理员为了加强自己对网络管理而指定的地址。

这里就可以看出,有些MAC地址不是给某个设备用的,而是多播地址;

也有一些MAC地址,是本地MAC地址,只在某个局域网内使用,不会影响其他人的地址。就像局域网IP一样。

在这里插入图片描述

那么就fe:fc:fe:f6:a5:bc而言,前三个字节为

FE FC FE,转化为二进制

1111 1110 -1111 1100-1111 1110

其中IG为0,表示是某个设备地址,GL为1,表示为本地MAC地址。

那么综上,这类MAC就可能是经过掩盖之后的假的MAC地址了。

在这里插入图片描述

我们常说有2的48次方个MAC地址可供网络设备使用,这些地址可以多到给地球上每一粒沙子分配一个地址,其实这个数量要打折扣的,因为MAC地址虽然有这么多,但真正用在网卡上并且全球唯一的只有2的46次方个:第48bit一定是0,第47bit一定是0。



掩盖MAC地址

那么接着上一步的思想,如何让自己的电脑MAC地址变为这种酷酷的本地MAC地址,其实很简单,可以在网卡的配置上,打开,随机硬件地址

在这里插入图片描述

那么MAC地址就会变成随机的本地MAC地址。防止别人跟踪你哦。

在这里插入图片描述



插播广告

简单介绍一下,最近闹得沸沸扬扬的Log4j2漏洞,大概就是一个apache里面,大家基本都用的模块Log4j2,用来产生并记录一些日志。

只不过这几天发现,这个模块有一个漏洞,如果要记录的内容,是含有特定格式的字符串,那么就会有一个替换过程,如果是某些远程请求,则会替换为请求结果,那这里如果远程请求返回一些带有攻击的代码,那么服务器就有可能中招。

个人觉得这应该是一个隐藏的后门程序,其次就是也反映出了当前大家与开源程序的关系:

大家(至少大部分人吧)并不会去深入研究自己用的每个开源软件,毕竟所有人都在用,也没出什么问题,那这就是好东西,还有人偶尔维护更新一下,那更是人见人爱。

想起了当年那句话:造不如买,买不如租。

在这里插入图片描述



最后

今天是个国人应该警醒的日子。话不能多说,都在心里记着。

俗话说:君子报仇,十年不晚,这一晃都大几十年了,该提上日程了。

在这里插入图片描述



版权声明:本文为baidu_19348579原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。