【问题标题】:Determining if an iPhone is Jail broken Programmatically以编程方式确定 iPhone 是否越狱
【发布时间】:2010-11-11 13:39:33
【问题描述】:

您如何(以编程方式)确定 iPhone/iPod 是否为:

  1. 越狱
  2. 运行您的软件的破解副本

Pinch Media可以检测手机是否越狱或运行的软件是否被破解,有人知道他们是怎么做到的吗?有图书馆吗?

【问题讨论】:

标签: iphone objective-c ios cocoa-touch jailbreak


【解决方案1】:

Here 是检测您的应用是否被破解的方法之一。

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

【讨论】:

  • 不幸的是,有一种解决方法可以破坏这种检测机制。安装应用程序后,不再需要 SignerIdentity 密钥,因此破解者可以简单地 ssh 进入他们的越狱手机并编辑 plist 以将其删除。
  • @KevinBallard 对 2017 年常见的越狱检测有什么建议吗?
  • @Cœur 不,自从写了那条评论后,我就没有调查过。
【解决方案2】:

扩展上面的 yonel 和 Benjie 的 cmets:

1) Landon Fuller's method 依赖加密检查,上面由 yonel 链接,似乎是唯一没有被自动破解工具打败的。我不会过分担心 Apple 会很快改变 LC_ENCRYPTION_INFO 标头的状态。它似乎对越狱的 iphone 有一些不可预测的影响(即使用户购买了副本......)

无论如何,我不会根据该代码对用户采取任何轻率的行动...

2) 补充 Benjie 的评论。混淆(在处理反盗版代码中的任何字符串值时绝对必要):一种类似但可能更简单的方法是始终检查 salted hashed 版本的您正在寻找的价值。例如(即使该检查不再有效),您将检查每个 MainBundle 的密钥名称为 md5(keyName + "some secret salt") 与适当的常量...相当基本,但肯定会击败任何定位字符串。

当然,这要求您能够间接查询要比较的值(例如,通过包含它的数组)。但大多数情况下都是如此。

【讨论】:

  • Landon Fuller 方法现在是否仍然适用于 iOS 7?
【解决方案3】:

只是为了扩展 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,但是如果应用程序没有被黑客入侵或设备已越狱,您将如何检测呢?
  • 在 SO 上提出问题,有人会回答 :)
【解决方案4】:

检测越狱手机就像检查/private/var/lib/apt/ 文件夹是否存在一样简单。虽然这不会检测到仅安装程序的用户,但现在大多数人已经安装了 Cydia、Icy 或 RockYourPhone(所有这些都使用 apt)

要检测盗版用户,最简单的方法是检查应用的Info.plist 中是否存在SignerIdentity 键。由于高级破解者可以轻松找到标准的[[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] 检查,因此最好使用通过#import <objc/runtime.h> 提供的Objective C 运行时来隐藏这些调用,或者使用替代等效项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多