iOS - 获取ARP表 [英] iOS - Get ARP table

查看:1427
本文介绍了iOS - 获取ARP表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试构建网络扫描程序。
我知道这个程序,所以我想ping网络中所有可用的主机,然后获取 ARP 表,这样我就可以映射每个IP的MAC地址。
我用Google搜索ARP表,但我没有找到任何指导如何实现此功能。
我也在Stack溢出时发现了类似的问题:

I am trying to build a network scanner. I know the procedure so I want to ping all available hosts in the network and then get the ARP table so I can map the MAC address for each IP. I Googled for ARP table but I didn't find any guide how to implement this feature. I also found these similar questions on Stack overflow:

Link1

Link2

关于如何实施ARP功能的答案尚不清楚。
这个有官方指南吗? Apple是否批准ARP表功能?

The answer are unclear on how to implement the ARP feature. Is there any official guide for this one? Is Apple approving the ARP table feature?

推荐答案

10.2后更新

检查图书馆此处

我终于得到了它的工作,所以我会详细发布程序以节省其他人的时间:

I finally got it working so I will post the procedure in detail to save some time for other guys:


  1. 转到应用程序并右键单击Xco​​de - >显示包装内容并浏览至:开发商▸平台▸MacOSX.platform▸开发商▸SDKs▸MacOSX10.10.sdk▸用户▸包括。从net文件夹中复制 route.h if_types.h 并从netinet文件夹中复制 if_ether.h 进入你的Xcode项目。

  2. 然后导入以下 .m .h 文件:

  1. Go to Applications and right click on Xcode -> Show package contents and browse to: Developer ▸ Platforms ▸ MacOSX.platform ▸ Developer ▸ SDKs ▸ MacOSX10.10.sdk ▸ usr ▸ include. From "net" folder copy the route.h and if_types.h and from the "netinet" folder copy the if_ether.h into your Xcode project.
  2. Then import the following .m and .h files:

MacFinder.h

#import <Foundation/Foundation.h>
#include <sys/param.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <sys/sysctl.h>

#include <net/if.h>
#include <net/if_dl.h>
#include "if_types.h"

#if TARGET_IPHONE_SIMULATOR
#include <net/route.h>
#else
#include "route.h"
#endif

#include "if_ether.h"
#include <netinet/in.h>


#include <arpa/inet.h>

#include <err.h>
#include <errno.h>
#include <netdb.h>

#include <paths.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

@interface MacFinder : NSObject{

    int nflag;
}

-(NSString*) ip2mac: (char*)ip;

@end

MacFinder.m

#import "MacFinder.h"

@implementation MacFinder
-(NSString*) ip2mac: (char*)ip
{
    int  found_entry = 0;



    NSString *mAddr = nil;
    u_long addr = inet_addr(ip);
    int mib[6];
    size_t needed;
    char *host, *lim, *buf, *next;
    struct rt_msghdr *rtm;
    struct sockaddr_inarp *sin;
    struct sockaddr_dl *sdl;
    extern int h_errno;
    struct hostent *hp;

    mib[0] = CTL_NET;
    mib[1] = PF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_INET;
    mib[4] = NET_RT_FLAGS;
    mib[5] = RTF_LLINFO;
    if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
        err(1, "route-sysctl-estimate");
    if ((buf = malloc(needed)) == NULL)
        err(1, "malloc");
    if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
        err(1, "actual retrieval of routing table");


    lim = buf + needed;
    for (next = buf; next < lim; next += rtm->rtm_msglen) {
        rtm = (struct rt_msghdr *)next;
        sin = (struct sockaddr_inarp *)(rtm + 1);
        sdl = (struct sockaddr_dl *)(sin + 1);
        if (addr) {
            if (addr != sin->sin_addr.s_addr)
                continue;
            found_entry = 1;
        }
        if (nflag == 0)
            hp = gethostbyaddr((caddr_t)&(sin->sin_addr),
                               sizeof sin->sin_addr, AF_INET);
        else
            hp = 0;
        if (hp)
            host = hp->h_name;
        else {
            host = "?";
            if (h_errno == TRY_AGAIN)
                nflag = 1;
        }



        if (sdl->sdl_alen) {

            u_char *cp = LLADDR(sdl);

            mAddr = [NSString stringWithFormat:@"%x:%x:%x:%x:%x:%x", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5]];


            //  ether_print((u_char *)LLADDR(sdl));
        }
        else

            mAddr = nil;



    }


    if (found_entry == 0) {
        return nil;
    } else {
        return mAddr;
    }




}
@end




  1. 然后在 ViewController MacFinder.h 文件$ c>

  2. 示例如何将其用于您想要找到 MAC地址的每个主机:

  1. Then import the MacFinder.h file in your ViewController
  2. Example how to use it for each host you want to find the MAC Address:

MacFinder * mc = [[MacFinder alloc] init];
NSString * mac = [mc ip2mac:192.168.10.24];
NSLog(@Mac:%@,mac);

如果您仍然遇到问题这里是教程和这里完整的工作项目(包括必要的文件)

If you still having trouble here is tutorial and here the full working project (Including the necessary files)

这篇关于iOS - 获取ARP表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆