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

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

个人觉得这应该是一个隐藏的后门程序,其次就是也反映出了当前大家与开源程序的关系:
大家(至少大部分人吧)并不会去深入研究自己用的每个开源软件,毕竟所有人都在用,也没出什么问题,那这就是好东西,还有人偶尔维护更新一下,那更是人见人爱。
想起了当年那句话:造不如买,买不如租。
在这里插入图片描述

最后

今天是个国人应该警醒的日子。话不能多说,都在心里记着。
俗话说:君子报仇,十年不晚,这一晃都大几十年了,该提上日程了。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖哥王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值