如何编程确定 iPhone/iPod 是否:
- 越狱
- 运行您软件的盗版副本
这里是检测应用程序是否被破解的其中一种方法。
简而言之,破解通常需要更改Info.plist文件。由于这是一个普通文件,您可以访问它,因此很容易确定这样的更改。
/private/var/lib/apt/
文件夹即可。虽然这不能检测Installer-only用户,但现在大多数人都安装了Cydia、Icy或RockYourPhone(它们都使用apt)。Info.plist
中是否存在SignerIdentity
键。由于高级破解者可以轻松找到标准的[[[NSBundle mainBundle] infoDictionary] objectForKey:@"SignerIdentity"]
检查,因此最好使用通过#import <objc/runtime.h>
获得的Objective C运行时进行调用模糊处理,或使用其他等效方法。为了进一步解释zakovyrya的回答,您可以使用以下代码:
if ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] != nil) {
// Jailbroken
}
然而,越狱你的应用程序的人可以使用十六进制编辑器编辑您的程序,因此他们可以编辑字符串@"SignerIdentity"以读取@"siNGeridentity"或其他内容,这将返回nil,从而通过。
因此,如果您使用此方法(或http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html中的任何其他建议):
针对yonel和Benjie上面的评论,我想进一步阐述:
1) Landon Fuller的方法 依赖加密检查,由yonel提供链接,似乎是唯一一个仍然没有被自动破解工具击败的方法。我不会过分担心苹果很快改变LC_ENCRYPTION_INFO头文件的状态。即使用户购买了副本,它似乎对越狱的iPhone产生了一些不可预测的影响...
无论如何,我不会因为那段代码而对用户采取任何草率的行动...
2) 为了补充Benjie关于混淆的评论(在处理防盗版代码中任何字符串值时绝对必要):一个类似但可能更容易的方法是始终检查所需值的 加盐 哈希 版本。例如(即使那个检查不再有效),您会检查每个MainBundle的键名是否为md5(keyName +“some secret salt”),并与适当的常量进行比较...相当基础,但肯定可以击败任何尝试定位该字符串的尝试。
当然,这需要你能够间接地查询你想要比较的值(例如通过包含它的数组)。但这通常是情况。