81

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

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

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

4

4 回答 4

39

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

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

于 2009-07-17T00:03:48.623 回答
25

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

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

于 2009-07-21T03:45:31.963 回答
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 这样的公共网站上告诉别人你是怎么做的
  • 请记住,它只是一个指南,并不是万无一失的(也不是万无一失的!)——强大的力量伴随着巨大的责任。
于 2009-07-21T09:32:37.550 回答
5

扩展 yonel 和 Benjie 的上述评论:

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

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

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

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

于 2010-03-18T07:58:42.300 回答