10

休闲游戏中的一个常见漏洞是人为地提高系统时钟以在游戏中跳跃。iOS 设备上的应用程序如何检测到这样的用户时钟提前?

  • 不得涉及网络通信
  • 不得在时钟提前时假设应用程序处于打开状态(运行或暂停)
  • 必须检测时钟提前,检测时钟回滚是不够的

理想情况下,该解决方案对重新启动具有鲁棒性,但这不是必需的。

4

3 回答 3

11

CACurrentMediaTime 和 mach_absolute_time

看看这个问题:

iOS:如何测量经过的时间,不受时钟和时区变化的影响?

计算两个时间点之间的秒数,在 Cocoa 中,即使系统时钟在中途改变

CACurrentMediaTime 使用 mach_absolute_time:http: //developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreAnimation_functions/Reference/reference.html

这里有一个关于如何使用 CACurrentMediaTime 的示例:http: //www.informit.com/blogs/blog.aspx? b=02b4e309-308c-468a-bab1-cebb1404be6a

在这里,您可以获得有关 mach_absolute_time 的更多信息:http: //developer.apple.com/library/mac/#qa/qa1398/_index.html http://shiftedbits.org/2008/10/01/mach_absolute_time-on-the -苹果手机/

于 2011-08-19T13:56:04.833 回答
1

我在考虑这样一个事实,如果那部分 GPS 数据暴露给你,CoreLocation 的东西可以做到这一点。然而,这让我思考。

我唯一的(牵强的)建议是将某些东西放入后台处理 - 这必须是出于一小部分特定原因之一,例如在后台跟踪位置。这样做的副作用是,尝试在常规计时器上检测时钟变化。Apple 可能会拒绝它,因为很明显它没有使用位置信息,而这只是利用后台处理的一个理由。

任何不涉及网络的解决方案很难实现,我想知道你为什么不使用它。

于 2011-08-19T13:48:06.253 回答
0

虽然我认为不可能可靠地确定用户是否在没有网络访问的情况下手动将时钟调快,但您当然可以可靠地确定他们是否及时返回。而且由于我们知道这在物理上是不可能的,因此可以假设他们操纵了他们的时钟来作弊。

我的意思是,不是通常的过程来触发一些需要等待一段时间的应用程序内操作,退出应用程序并将时钟向前,重新启动应用程序以获得他们正在等待的任何东西,然后将时钟重置回实际时间?

如果确实如此,那么根据@smgambel 的建议,您可以在每次启动时存储物理时间和当前时区,并与之前存储的时间和时区进行比较。如果时间于之前存储的时间,并且设备的时区没有改变,那么您可以放心地假设用户已经操纵了时钟。

于 2011-08-19T14:22:51.160 回答