通过编程确定iPhone是否越狱

80
如何编程确定 iPhone/iPod 是否:
  1. 越狱
  2. 运行您软件的盗版副本
Pinch Media 可以检测手机是否越狱或者运行的软件是否为盗版,有人知道他们是如何做到的吗?是否有相关库?

1
苹果知道如何确定那个:p - JoshJordan
2
参见:https://dev59.com/PHRC5IYBdhLWcg3wFdFx - e.James
2
如果您对这个问题感兴趣,为什么不支持Area 51提案的越狱Stack Exchange网站呢?(http://area51.stackexchange.com/proposals/18154/ios-jailbreaking-development?referrer=EuWVi6IpN0_KzzEhC7I-Qw2) - Richard Stelling
4个回答

39

这里是检测应用程序是否被破解的其中一种方法。

简而言之,破解通常需要更改Info.plist文件。由于这是一个普通文件,您可以访问它,因此很容易确定这样的更改。


1
不幸的是,有一个解决方法可以破坏这个检测机制。一旦应用程序被安装,SignerIdentity密钥就不再必要,因此黑客可以简单地通过ssh进入他们越狱的手机并编辑plist文件以将其删除。 - Lily Ballard
@KevinBallard,你有没有在2017年检测常见越狱的建议? - Cœur
@Cœur 不,自从写下那条评论以来,我就没有再研究过这个问题。 - Lily Ballard

25
检测越狱手机很容易,只需要检查是否存在/private/var/lib/apt/文件夹即可。虽然这不能检测Installer-only用户,但现在大多数人都安装了Cydia、Icy或RockYourPhone(它们都使用apt)。
要检测盗版用户,最简单的方法是检查应用程序的Info.plist中是否存在SignerIdentity键。由于高级破解者可以轻松找到标准的[[[NSBundle mainBundle] infoDictionary] objectForKey:@"SignerIdentity"]检查,因此最好使用通过#import <objc/runtime.h>获得的Objective C运行时进行调用模糊处理,或使用其他等效方法。

10

为了进一步解释zakovyrya的回答,您可以使用以下代码:

if ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] != nil) {
  // Jailbroken
}

然而,越狱你的应用程序的人可以使用十六进制编辑器编辑您的程序,因此他们可以编辑字符串@"SignerIdentity"以读取@"siNGeridentity"或其他内容,这将返回nil,从而通过。

因此,如果您使用此方法(或http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html中的任何其他建议):

  • 不要期望它永远有效
  • 不要使用此信息以任何方式破坏/阻碍您的应用程序(否则他们将有理由对其进行十六进制编辑,因此您的应用程序将不知道它是否被越狱)
  • 最好混淆代码的这一部分。例如,您可以将base64编码的反转字符串放入代码中,然后通过反转过程在应用程序中解码它。
  • 在代码的稍后验证您的验证(例如,当我说SignerIdentity时,它实际上是说SignerIdentity还是siNGeridentity?)
  • 不要在像stackoverflow这样的公共网站上告诉别人您如何做到这一点
  • 请记住,这仅是指南,不是绝对可靠的(也不是防破解的!) - 伟大的力量需要伟大的责任。

那么,这个检查会检查您的应用程序包上的 SignerIdentity,但是如果应用程序没有被黑客攻击或者出现任何问题,但设备已经越狱,您该如何检测呢? - Edward Ashak
在 Stack Overflow 上提出问题,总会有人回答的 :) - Benjie

5

针对yonel和Benjie上面的评论,我想进一步阐述:

1) Landon Fuller的方法 依赖加密检查,由yonel提供链接,似乎是唯一一个仍然没有被自动破解工具击败的方法。我不会过分担心苹果很快改变LC_ENCRYPTION_INFO头文件的状态。即使用户购买了副本,它似乎对越狱的iPhone产生了一些不可预测的影响...

无论如何,我不会因为那段代码而对用户采取任何草率的行动...

2) 为了补充Benjie关于混淆的评论(在处理防盗版代码中任何字符串值时绝对必要):一个类似但可能更容易的方法是始终检查所需值的 加盐 哈希 版本。例如(即使那个检查不再有效),您会检查每个MainBundle的键名是否为md5(keyName +“some secret salt”),并与适当的常量进行比较...相当基础,但肯定可以击败任何尝试定位该字符串的尝试。

当然,这需要你能够间接地查询你想要比较的值(例如通过包含它的数组)。但这通常是情况。

Landon Fuller的方法在现今iOS 7上是否仍然可行? - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接