前提条件:越狱状态下
起因:由于苹果在iOS7以后对sysctl
和ioctl
进行了技术处理,无法获取到正确的MAC地址,返回的都是02:00:00:00:00:00
通过查找资料,得知cydia
有一款插件可以进行扫描出MAC地址,名称为arp-scan
,这款插件在http://repo.hackyouriphone.org/
和https://mcapollo.githun.io/Public/
这2个源都可以下载到
然后ssh
到手机上使用arp-acan -l
查看,如下图
图中就能看到对应IP的MAC地址.
功能是实现了,但是这个要集成到代码里,可不好搞啊,刚开始我是直接提取了deb
,一共包括2个deb
,一个是arp-scan.deb
,一个是libpcap.deb
,后面这个是其依赖库!
然后我想的是直接通过代码来安装这2个deb
,之后使用命令启动,最后发现要成功安装deb
这需要很多的依赖,和我的需求不符.
然后我又想了个办法,自己编译一个支持arm64
的arp-scan
从网络上下载然后放到手机中,将libpcap
依赖也从网络下载到手机中,然后使用命令启动,虽然这样好像可以实现,但是麻烦之处在于,需要将编译的二进制文件复制到/usr/local/bin
目录下,还有其他的依赖文件,需要手动修复路径,而且通过命令执行出来的结果还需要我手动去提取,也是一件很麻烦的事.而且只能同步等待扫描结果,如果子网很大,那将一直卡主.也只能放弃此方法
最终解决方案
自己将libpcap
编译成.a
静态库,然后使用源码集成arp-scan
,从而就可以实现功能,也不需要使用命令执行了,但这里面也踩了不少坑(主要还是因为对跨平台不熟).
首先去tcpdump下载所需要的依赖libpcap
我下载的是libpcap-1.9.1.tar.gz
,然后将其解压,文件为
然后我们开始编译支持
arm64
结构的
libpcap
由于
libpcap
支持
cmake
所以我们在当前目录下建立一个
build
文件夹,然后打开终端进入
build
文件夹执行
cmake .. -G Xcode
等执行完成后,在
build
目录下就会自动生成个XCode工程
双击
pcap.xcodeproj
打开工程选择
pcap_static
然后将其改为如下图
然后
pcap-bpf.c
会报错,将其内容注释即可成功
build
(
但是最后打包出来的有没有功能缺陷暂时未知)因为我后面用了另一种方式获取了静态库.这是使用
lipo
查看打包出来的架构
因为对交叉编译不太熟悉,所以我也不知道这个编译出来的库是否可以用,在后面的工作中,我发现了可以直接从手机中导出,所以我直接使用了导出的静态库,以后对交叉编译熟悉了再回过来看这个报错问题.
在cydia
中可以看到libpcap
的目录结构
直接使用
scp
或者爱思助手直接将这些文件全部拖出来
可以直接下载我提取的: 下载地址
编译arp-scan
在这里先下载arp-scan的源码
然后使用MonkeyDev建立一个Commond-Line
工程,将pacp
的静态库和相应头文件拉进去,头文件可以在上面的下载地址里找到
将arp的这几个文件拖进来
因为
arp-scan
也使用了交叉编译,有很多的宏,所以
arp-scan.c
文件里我自己将宏去掉,然后将一些实现全部移到了
.c
文件里
但要注意一点是在
get_hardware_address
方法实现里,
if (ifm->ifm_type != RTM_IFINFO || (ifm->ifm_addrs & RTA_IFP) == 0)
中的RTM_IFINFO
和RTA_IFP
是
中的宏定义,iOS
里是没有这个宏的,所以我直接将其复制过来
if (ifm->ifm_type != 0xe || (ifm->ifm_addrs & 0x10) == 0)
将arp-scan.c
中的main
函数改个名字
然后在
main.m
里调用
然后打包成二进制到手机上测试
大功告成!