位置模拟硬件位移精灵的实现原理以及屏蔽方案调研

最近收到了第三方的反馈,说除了之前可以检测到的软件层面的虚拟定位意外,如今更是发现了一个硬件设备,299软妹币一个,专门用来对非越狱的iOS系统进行模拟位置。。。连硬件设备都派上来了,无所不用其极啊!恰恰也说明网约车司机们,对这方面的需求还是很大的,闷声发大财的人真的很多(手动思考状)。

更新一下(2018.7.24)

  1. 研究了下两台设备间的相同点与不同点:
    • 相同点:
      • 厂家信息中name、manufacturer、modelNumber、firmwareRevision、hardwareRevision与protocols字段内容相同;
      • 蓝牙广播中kCBAdvDataServiceUUIDs的值相同,都为EEEE8317-01EE-0220-0020-00000021EAFE;
    • 不同点:
      • 厂家信息中serialNumber字段不同;
      • 蓝牙广播中kCBAdvDataLocalName、identifier值不同;
  2. 目前发现一个问题,在iOS9上可以获取所有外接设备,不需要额外操作;但是在iOS10、11上,需要在APP的Info.plist中增加相应的字段:Supported external accessory protocols,并且需要在其中指定需要检测的外接设备的protocol,才可以获取到外接设备列表:

ExternalAccessory0

这样就会出现一个情况,在iOS10或者11上,要检测特定类型的设备,必须APP先在Info.plist中写上这个类型的protocol,这样就不能实现检测任意设备的效果。并且这个是iOS的硬性要求,无法跳过。

————以上为7月24日更新————

硬件实现原理调研

  1. “位移精灵”硬件在蓝牙列表中显示为2个设备,分别为:WY-xxxx-BLE 和 WY-xxxx-MFI (xxxx代表四位数字)
    1.1 WY-xxxx-MFI 设备为经过MFI验证的辅助GPS设备(作为GPS信息输入源),但其内部并没有真正的GPS芯片,而是模拟的假GPS数据
    1.2 WY-xxxx-BLE 设备为与对应App之间通讯传输使用,可以在App端指定要模拟的位置

  2. 模拟效果:
    2.1 iOS系统定位服务直接返回模拟的结果,调用堆栈与定位服务的正常返回一样(之前出现的虚拟定位插件在这里有差别)
    2.2 在室内可以稳定模拟位置;在室外结果不稳定,定位结果会在模拟位置与正常位置之间来回跳动,有70%数据为正常结果
    2.3 模拟的定位结果返回数据无特别明显的差别,目前看到的唯一差别为altitude值在90%情况下为0

  3. 尝试连接获取设备信息:
    通过代码访问iOS设备的ExternalAccessory列表,也可以看到该设备,设备的生产厂家信息如下(这些信息是硬件生产厂家指定的):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    name: C01-BR30 //设备名称
    manufacturer: Zhejiang Shenghui Lighting Co., Ltd //生产厂家
    modelNumber: BR30 //设备模块编号
    serialNumber: 000218000000 //序列号
    firmwareRevision: 1.0.1 //固件版本
    hardwareRevision: 1.0.1 //硬件版本
    protocols: "com.sengled.protocol.btspeaker" //通讯协议
    另外,通过iOS的私有API可以拿到:
    macAddress: 00:06:00:00:02:18 //mac地址
    preferredApp: T83739RUE3 //对应一个Apple开发者账户
    supportsLocation: true //是否支持定位
  4. 尝试与设备通讯:
    4.1 与名为WY-xxxx-MFI的设备尝试连接,由于使用的是私有的通讯协议,不知道具体协议内容,所以无法与设备进行通讯,设备默认状态下不对外发送任何数据,向设备发送一些随机的测试内容均没有相应,没能够获取设备通讯数据。
    4.2 与名为WY-xxxx-BLE的设备尝试连接,但连接后瞬间被设备主动断开连接,推测是连接请求中的没有附带符合要求的参数导致,无法进一步与设备通讯。

  5. 识别检测:
    因为MFI开发属于硬件范畴(并且文档Apple要求严格保密),而我们SDK的属于软件层面,因此需要从软件层面出发进行检测,可以通过获取iOS设备的ExternalAccessory列表,从中判断是否有特定类型的设备去识别,但此方案有以下两个风险:
    5.1 硬件设备厂家信息更新会使得特征失效。
    5.2 如果是盗用手段借助了通过认证的MFI芯片,则厂家正常生产的智能家居类设备可能被误判。

  6. 另外,可以查到生产厂家是生产LED灯的厂家,从Apple官方可以查询到,该企业通过了MFI认证,可以断定设备是借助了这个厂家的MFI芯片,不确定是不是非法破解挪用。

ExternalAccessory1