以编程方式确定iPhone是否被监禁
你如何确定(编程)如果iPhone / iPod是:
- 监狱破裂
- 运行你的软件的破解副本
捏媒体可以检测到手机是否被监禁或运行的软件是否被破解,有谁知道他们是如何做到这一点? 有没有图书馆?
这是检测您的应用程序是否被破解的方法之一。
简而言之:破解通常需要更改Info.plist。 由于您可以访问常规文件,因此确定这样的更改非常容易。
检测越狱手机就像检查/private/var/lib/apt/
文件夹一样简单。 虽然这不检测安装程序的用户,到目前为止,大多数已经安装了Cydia,Icy或RockYourPhone(所有这些都使用apt)
要检测盗版用户,最简单的方法是检查应用程序的Info.plist
是否存在SignerIdentity
键。 由于先进的破解者可以很容易地find标准[[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"]
检查,所以最好使用Objective-C运行时通过#import <objc/runtime.h>
替代等价物。
只是为了扩大zakovyrya的回复,你可以使用下面的代码:
if ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] != nil) { // Jailbroken }
然而,越狱你的应用程序的人可以hexedit你的程序,因此,他们可以编辑string@“SignerIdentity”阅读@“siNGeridentity”或其他什么,将返回零,从而通过。
所以如果你使用这个(或者http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html的其他build议):;
- 不要指望它永远工作
- 不要使用这些信息以任何方式破坏/阻止你的应用程序(否则他们将有理由对它进行hexedit,所以你的应用程序不会知道它是越狱)
- 可能明智地混淆了这一点的代码。 例如,您可以将base64编码的反转string放入您的代码中,然后通过反转该过程在应用程序中对其进行解码。
- 稍后在你的代码中validation你的validation(例如,当我说SignerIdentity,它实际上是否说SignerIdentity或siNGeridentity?)
- 不要像公用网站那样告诉人们你如何做到这一点
- 请记住,它只是一个引导,不是防万无一失的(不是防爆的!) – 拥有巨大的权力是巨大的责任。
以上yonel和本杰的评论:
1) Landon Fuller的依靠encryption检查的方法 ,通过yonel链接上面,似乎是唯一一个仍然没有被自动化破解工具击败的方法。 我不会过分担心苹果改变LC_ENCRYPTION_INFO头的状态。 它似乎有一些不可预知的越狱手机的影响(即使用户购买了副本…)
无论如何,我不会根据这个代码对用户采取任何粗暴的行动。
2)补充本杰的评论。 混淆(在处理反盗版代码中的任何string值时绝对必要):类似的,但也许更简单的方法是始终检查您正在查找的值的腌制 散列版本。 例如(即使这个检查不再有效),你会检查每个MainBundle的键名为md5(keyName +“一些秘密的盐”)对适当的常量…相当基本,但一定要击败任何尝试定位串。
当然,这要求您能够间接查询要比较的值(例如,通过包含它的数组)。 但是这是最常见的情况。