iOS扫描局域网iP并通过libpcap获取对应的mac地址

前提条件:越狱状态下
起因:由于苹果在iOS7以后对sysctlioctl进行了技术处理,无法获取到正确的MAC地址,返回的都是02:00:00:00:00:00


通过查找资料,得知cydia有一款插件可以进行扫描出MAC地址,名称为arp-scan,这款插件在http://repo.hackyouriphone.org/https://mcapollo.githun.io/Public/这2个源都可以下载到

-w480

然后ssh到手机上使用arp-acan -l查看,如下图

-w632

图中就能看到对应IP的MAC地址.


功能是实现了,但是这个要集成到代码里,可不好搞啊,刚开始我是直接提取了deb,一共包括2个deb,一个是arp-scan.deb,一个是libpcap.deb,后面这个是其依赖库!
然后我想的是直接通过代码来安装这2个deb,之后使用命令启动,最后发现要成功安装deb这需要很多的依赖,和我的需求不符.

然后我又想了个办法,自己编译一个支持arm64arp-scan从网络上下载然后放到手机中,将libpcap依赖也从网络下载到手机中,然后使用命令启动,虽然这样好像可以实现,但是麻烦之处在于,需要将编译的二进制文件复制到/usr/local/bin目录下,还有其他的依赖文件,需要手动修复路径,而且通过命令执行出来的结果还需要我手动去提取,也是一件很麻烦的事.而且只能同步等待扫描结果,如果子网很大,那将一直卡主.也只能放弃此方法


最终解决方案

自己将libpcap编译成.a静态库,然后使用源码集成arp-scan,从而就可以实现功能,也不需要使用命令执行了,但这里面也踩了不少坑(主要还是因为对跨平台不熟).

首先去tcpdump下载所需要的依赖libpcap
我下载的是libpcap-1.9.1.tar.gz,然后将其解压,文件为

-w209

然后我们开始编译支持arm64结构的libpcap
由于libpcap支持cmake
所以我们在当前目录下建立一个build文件夹,然后打开终端进入build文件夹执行
cmake .. -G Xcode
-w215

等执行完成后,在build目录下就会自动生成个XCode工程
-w1044

双击pcap.xcodeproj打开工程选择pcap_static
-w598

-w1145

然后将其改为如下图
-w715

然后pcap-bpf.c会报错,将其内容注释即可成功build(但是最后打包出来的有没有功能缺陷暂时未知)因为我后面用了另一种方式获取了静态库.这是使用lipo查看打包出来的架构
-w673

因为对交叉编译不太熟悉,所以我也不知道这个编译出来的库是否可以用,在后面的工作中,我发现了可以直接从手机中导出,所以我直接使用了导出的静态库,以后对交叉编译熟悉了再回过来看这个报错问题.


cydia中可以看到libpcap的目录结构

-w254

直接使用scp或者爱思助手直接将这些文件全部拖出来
-w414

可以直接下载我提取的:下载地址


编译arp-scan

在这里先下载arp-scan的源码
然后使用MonkeyDev建立一个Commond-Line工程,将pacp的静态库和相应头文件拉进去,头文件可以在上面的下载地址里找到

-w270

将arp的这几个文件拖进来
-w244

因为arp-scan也使用了交叉编译,有很多的宏,所以arp-scan.c文件里我自己将宏去掉,然后将一些实现全部移到了.c文件里
-w332

但要注意一点是在get_hardware_address方法实现里,

if (ifm->ifm_type != RTM_IFINFO || (ifm->ifm_addrs & RTA_IFP) == 0)

中的RTM_IFINFORTA_IFP<net/route.h>中的宏定义,iOS里是没有这个宏的,所以我直接将其复制过来

if (ifm->ifm_type != 0xe || (ifm->ifm_addrs & 0x10) == 0)

arp-scan.c中的main函数改个名字

-w281

然后在main.m里调用
-w341

然后打包成二进制到手机上测试
-w536

大功告成!