iOS检测模拟位置

目前我正在开发一个应用程序,其中地理位置function是其最重要的function。 实际上我们非常担心会嘲笑GPS值。 我已经阅读了很多关于在iOS和Android上模拟位置的评论,其中大多数都倾向于解释一个未加工的iOS设备无法模拟位置,但事实是我创建了另一个项目,用GPX文件来模拟在该项目上的位置,当执行时,整个系统认为我在另一个城市。 我的所有locationManager回调都告诉我,我正在使用正确的时间戳进行模拟的位置,伪造整个信息,就像它是真实的一样。 这完全打破了我们的应用程序的目的,因为用户可以假装在哪里。

有没有办法检测这种行为并阻止它? 我假设一个封闭的目标,攻击者必须是开发人员才能使这个漏洞利用起来,但是唉,它仍然存在

问题:有没有办法检测到这种行为并阻止它?

实际上有两个独立的问题:(1)如何检测,以及(2)如何预防?

(1)的答案:模拟的位置行为与回调locationManager的真实位置行为完全不同:didUpdateLocations:

[模拟位置]回调几乎在调用startUpdatingLocation后立即返回,然后每隔一秒重复调用一次。 如果我们选择固定位置,位置也是一样的。 这是一个例子:

location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:48 Час: Індокитай location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:49 Час: Індокитай location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:50 Час: Індокитай location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:51 Час: Індокитай location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:52 Час: Індокитай location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:53 Час: Індокитай location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:54 Час: Індокитай 

[真实位置]需要几秒钟(如果是第一次运行)回叫然后随机重新呼叫。 此外,即使您根本不移动,您也可以看到这些位置之间的重大变化。 这是一个例子:

 location: <+10.77219361,+106.70597441> +/- 67.39m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:26 Час: Індокитай location: <+10.77213011,+106.70591088> +/- 65.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:31 Час: Індокитай location: <+10.77219507,+106.70587790> +/- 65.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:38 Час: Індокитай location: <+10.77214753,+106.70587741> +/- 65.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:49 Час: Індокитай 

回答(2):为了防止,我现在只是工作,我们需要查找至少3个位置来确定它的模拟或真实位置。

提醒一下,这只是检测模拟位置的临时解决方案。 将来,Apple可能会改变这种行为。

顺便说一句,我也试图在方案中禁止在xCode上模拟位置: 在此处输入图像描述 不幸的是,它仍然允许模拟位置。

您可能在此处了解更多问题。 希望它有所帮助。

为了详细说明@KennyHo答案,我发现实际和模拟位置反馈之间存在另一个差异。

正如我所注意到的, 模拟位置始终返回这些位置属性/选项的值组合:

 horizontalAccuracy: 5 verticalAccuracy: -1 altitude: 0.000000 speed: -1 

真正的位置会在99%的时间内给出不同的组合,例如

 horizontalAccuracy: 5 verticalAccuracy: 10 altitude: +/- 0.4243232 speed: -1 

请注意,模拟位置可能具有与上述位置不同的组合,但仅限于用户使用xcode Automation目标测试 。 但是,用户只能使用开发标识模拟已签名应用程序的位置(必须拥有该应用程序)。 这意味着除了你之外,没有人能伪造具有不同altitudeverticalAccuracy精度的位置来欺骗你的应用程序在xcode中。

我不相信可以检测位置模拟器。

伪造位置的一种更简单的方法是使用外部蓝牙或串行连接到输出NMEA句子的GPS模拟器 。 虽然您确实需要Android手机来运行模拟器,但您不需要开发者帐户。

iPhone将自动检测外部GPS, CLLocationManager将使用外部GPS源代替自己的内部GPS。 它对于地图和导航应用的实验室测试非常方便。

感谢您关于GPS模拟器的信息。 我试图在iPhone5(iOS8)上制作一个简单的iOS应用程序,以便从三星S4上的GPS模拟器应用程序获取位置。 我关闭了Wifi和3G,在iPhone上启用了BlueTooth。 但是CLLocationManager无法获取位置。

这是代码:

clManager = [[CLLocationManager alloc] init];

clManager.delegate = self;

clManager.desiredAccuracy = 100;

clManager.distanceFilter = kCLDistanceFilterNone;

[clManager startUpdatingLocation];

代码得到kCLAuthorizationStatusAuthorizedAlways通知。 但在那之后,没有通过“didUpdateLocations”回调委托返回的位置数据。

您能告诉我CLLocationManager的任何特殊设置,以便它可以从GPS模拟器接收GPS消息。

Interesting Posts