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,用来产生并记录一些日志。
只不过这几天发现,这个模块有一个漏洞,如果要记录的内容,是含有特定格式的字符串,那么就会有一个替换过程,如果是某些远程请求,则会替换为请求结果,那这里如果远程请求返回一些带有攻击的代码,那么服务器就有可能中招。
个人觉得这应该是一个隐藏的后门程序,其次就是也反映出了当前大家与开源程序的关系:
大家(至少大部分人吧)并不会去深入研究自己用的每个开源软件,毕竟所有人都在用,也没出什么问题,那这就是好东西,还有人偶尔维护更新一下,那更是人见人爱。
想起了当年那句话:造不如买,买不如租。
最后
今天是个国人应该警醒的日子。话不能多说,都在心里记着。
俗话说:君子报仇,十年不晚,这一晃都大几十年了,该提上日程了。