iOS 10.2中的MAC地址

iOS 10.2中的MAC地址,ios,network-programming,Ios,Network Programming,从iOS10.2开始,苹果现在已经禁止访问所有MAC地址,而不仅仅是你自己的设备 然而,商店中的一些应用程序似乎仍然能够管理这一点,例如Fing和Net Analyzer。这些仍然有效,是因为它们是根据旧的SDK编译的,还是它们有收集MAC地址的特殊技巧 任何人都可以共享一个工作环境,以便在WiFi上获取iOS 10.2设备的MAC地址吗?这只是测试代码,只是为了了解如何获取MAC地址。但我相信苹果很快就会关闭这个选项 -(void) jan_mac_addr_test:(const char*

从iOS
10.2
开始,苹果现在已经禁止访问所有MAC地址,而不仅仅是你自己的设备

然而,商店中的一些应用程序似乎仍然能够管理这一点,例如Fing和Net Analyzer。这些仍然有效,是因为它们是根据旧的SDK编译的,还是它们有收集MAC地址的特殊技巧


任何人都可以共享一个工作环境,以便在WiFi上获取iOS 10.2设备的MAC地址吗?

这只是测试代码,只是为了了解如何获取MAC地址。但我相信苹果很快就会关闭这个选项

-(void) jan_mac_addr_test:(const char*) host
{
    #define BUFLEN (sizeof(struct rt_msghdr) + 512)
    #define SEQ 9999
    #define RTM_VERSION 5   // important, version 2 does not return a mac address!
    #define RTM_GET 0x4 // Report Metrics
    #define RTF_LLINFO  0x400   // generated by link layer (e.g. ARP)
    #define RTF_IFSCOPE 0x1000000 // has valid interface scope
    #define RTA_DST 0x1 // destination sockaddr present
    int sockfd;
    unsigned char buf[BUFLEN];
    unsigned char buf2[BUFLEN];
    ssize_t n;
    struct rt_msghdr *rtm;
    struct sockaddr_in *sin;
    memset(buf,0,sizeof(buf));
    memset(buf2,0,sizeof(buf2));

    sockfd = socket(AF_ROUTE, SOCK_RAW, 0);
    rtm = (struct rt_msghdr *) buf;
    rtm->rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
    rtm->rtm_version = RTM_VERSION;
    rtm->rtm_type = RTM_GET;
    rtm->rtm_addrs = RTA_DST;
    rtm->rtm_flags = RTF_LLINFO;
    rtm->rtm_pid = 1234;
    rtm->rtm_seq = SEQ;


    sin = (struct sockaddr_in *) (rtm + 1);
    sin->sin_len = sizeof(struct sockaddr_in);
    sin->sin_family = AF_INET;
    sin->sin_addr.s_addr = inet_addr(host);
    write(sockfd, rtm, rtm->rtm_msglen);

    n = read(sockfd, buf2, BUFLEN);
    if (n != 0) {
        int index =  sizeof(struct rt_msghdr) + sizeof(struct sockaddr_inarp) + 8;
        // savedata("test",buf2,n);
        NSLog(@"IP %s ::     %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x",host,buf2[index+0], buf2[index+1], buf2[index+2], buf2[index+3], buf2[index+4], buf2[index+5]);

    }
}

希望这是一个缺陷,因为它似乎有点极端。可以通过PF_路由套接字或其他机制访问arp表。我的应用程序停止工作,是在iOS 10.2之前构建的,所以我认为它与库无关。Fing很快就能找到Mac电脑,所以我猜他们有另一条路线或某种特权,可以移除沙箱。Wireshark上没有显示任何建议使用网络协议的内容。一个可能的问题是,他们可以读取ARP回复,但通常需要一个原始套接字。我通过电子邮件询问了他们,但他们还没有回复。当我得到任何信息时将更新问题。面临相同的问题。有趣的是,从arp表查找返回的结构仍然具有其他细节,如套接字类型、套接字族和地址长度,但地址数据为空。我想知道为什么返回一个有效的地址\数据\长度,然后返回一个包含空值的地址\数据数组!!这一点正在另一条线索上被密切跟踪:以及在GitHub项目中:有人能解释为什么苹果公司要阻止程序获取这些信息吗?我知道这与这个问题没有直接关系,但我现在很好奇……这是目前的正确答案,并且来自github上“wadecong”的一个重要提示。这两位用户的工作和分享意愿都值得高度赞扬。我还希望,这场围绕arp表访问的猫捉老鼠游戏将引导苹果以更智能的方式解决这个问题,比如权利。在一些合法的情况下,使用MAC地址可以在不损害隐私或安全的情况下提供更好的用户体验。只需添加一个close(sockfd)并确保释放缓冲区,它就能完美工作。对不起,我是一个noob。在此方法中,我应该向参数“host”传递什么值?另外,在我的iOS项目中,我应该在哪里实现这个方法?这个漏洞已经在10.3测试版中被关闭(@Mickeylauer博士,似乎:(