如何从MTK机器的NVRAM中获取WIFI mac地址

时间:2023-03-09 19:17:19
如何从MTK机器的NVRAM中获取WIFI mac地址

在MTK的机器中,如果不用特定的工具烧写MAC地址,在开机后打开WIFI后会显示: “NVRAM WARNING: Err=0x10”
这就是没有烧写mac地址的原因,所以每次打开wifi,wifi的MAC地址都是一个随机产生的值,为什么会这样?
答案在: vendor/mediatek/proprietary/packages/apps/CdsInfo/src/com/mediatek/connnectivity/CdsWifiInfoActivity.java
从这个代码中可以分析得知,此时的Wifi MAC地址除了前面几位是固定值,而后面都是随机产生的。
但只有一个文件才是正确的WIFI MAC地址保存的值。如果没有烧写WIFI MAC地址,那么这个文件的第4到第9个字节是固定为0的,只有烧写了MAC地址,这6个字节才是有数据的。
通过代码分析,得知烧写mac地址后的文件是保存在: /data/nvram/APCFG/APRDEB/WIFI 这个文件中,现在我们可以写一个程序将它读出来,很简单:
通过adb pull /data/nvram/APCFG/APRDEB/WIFI获取这个文件到我当前的系统,打开一看:
  蘺象UD  &&  """"!!"""   !!!"""""""""   """"""
是一堆乱码,那么如何正确打开查看呢?可以上百度去下一个WinHex打开,其实这个文件里面保存的是十六进制的数据。打开后可以看到:
04010000CC79CFF355440000262600002222222221212222222020202121211E1E1E222222222222222222202020222222222222
从这段数据中:,格式是这样的:04 01 00 00 CC 79 CF FF 35 54 44 。。偏移从0开始一直往后依次类推,分析代码得知:
CC 79 CF FF 35 54 44就是通过特定工具刷写进去的WIFI MAC地址,如果不刷,那么这6个字节的数据默认为0。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#define  WIFI_FILE  "WIFI"
int main(void)
{
    int fd = -1 ;
    int ret ;
    int i ;
    char buffer[512] = {0};
    char Nvram_wifi_mac_address[6] = {0};
    char d_buf[100] = {0};
    char dd_buf[100] = {0};
    fd = open(WIFI_FILE,O_RDWR);
    if(fd < 0){
        printf("open fair!\n");
        return -1 ;
    }  

    ret = read(fd , buffer , 512);
    if(ret < 0){
        printf("read wifi mac fair!\n");
    }  

    for(i = 4; i < 10 ; i++)
        Nvram_wifi_mac_address[i-4] = buffer[i] ;
    //为什么要 & 0xff,因为有些机器是64位的,为了保证和32位的机器显示一致,故只取低8位。
    sprintf(d_buf,"%02x:%02x:%02x:%02x:%02x:%02x",
        Nvram_wifi_mac_address[0]&0xff,Nvram_wifi_mac_address[1]&0xff,
        Nvram_wifi_mac_address[2]&0xff,Nvram_wifi_mac_address[3]&0xff,
        Nvram_wifi_mac_address[4]&0xff,Nvram_wifi_mac_address[5]&0xff
    );
    printf("%s\n",d_buf);
    for(i = 0 ; i < strlen(d_buf) ; i++)
    {
    	dd_buf[i] = toupper(d_buf[i]);
	}
	printf("dd_buf:%s\n",dd_buf) ;

    return 0 ;
}