如何检测破解的iPhone应用程序和越狱设备(不同的方法)

13

我正在构建一个黑名单服务,用于检测破解的iPhone应用程序,我想知道是否有遗漏的检测破解应用程序的方法。

目前,该服务可用以下应用程序破解检测方法:

  1. 检查plist大小
  2. 检查签名者身份
  3. 检查二进制文件是否加密(不确定这种方式是否正确,因为没有通过此方式检测到破解的应用程序)
  4. 检查info.plist的修改日期与包的修改日期是否一致(不确定这种方式是否正确-使用类似于http://snippie.net/snip/f7530ff2的代码来执行此操作)

我还想知道是否可能检查设备是否越狱?这也会有所帮助,因为该服务将类似于垃圾邮件黑名单,并且越狱可以用于增加分数。

我还添加了一个蜜罐,它向我展示了黑客使用的工具消除了我执行的某些检查。例如,检查大小或签名者身份的plist检查。

我的问题是:

  • 是否还有其他“好”的检查我应该使用?

以及

  • 有没有一种方法可以检测越狱?

2
这个问题讨论了许多检测破解应用程序的技术:减少iPhone应用程序盗版。当涉及到越狱检测时,请参见此处:如何检测SDK应用程序正在运行的越狱手机? - Brad Larson
谢谢Brad,这些都是很好的资源。 - Robse
2个回答

17

永远不要试图屏蔽使用破解版的设备,而忽略越狱设备。如果您屏蔽越狱设备,他们将被迫使用移除了所有检查的修改版本。
此外,我所有的设备都越狱了,所以如果开发者屏蔽越狱设备,我将不得不忽略他们的应用程序。 超过10%的iDevices已经越狱了,因此这是一个非常糟糕的想法。

编辑:由于我收到了很多反对意见,因此我将发布一些检测越狱的方法。

- (BOOL)fileExistsAtPath:(NSString *)path{
    NSLog(@"Check if file '%@' exists", path);

    struct stat buffer;   
    return stat([path UTF8String], &buffer) == 0;
}

- (BOOL)jailbroken{
    return ([self fileExistsAtPath:@"/Applications/Cydia.app"]);
}

3
他们将被迫取消越狱、禁用网络并停止使用来自App Store的应用。这10%中有9%是因为盗版而越狱的... - Robse
6
我不理解为什么有人给你点“踩”。我自己越狱是为了测试我的应用程序是否能防止盗版。那些点“踩”的人现在会把我送去关塔那摩吗? - Stanislav Dvoychenko
6
我知道很多人越狱只是为了添加一些不允许在应用商店中的插件和特定应用程序。这些人仍然选择从应用商店购买应用程序。 - MattyG
1
@Freerunnering 这不是一个坏主意。从法律角度来看,您将责任交给最终用户,在不安全的设备上使用安全应用程序。越狱设备非常不安全,因为CodeSigning是移动设备上唯一可用的防御手段。 - user1089638
@Nodef 不是真的。实际上越狱设备通常比普通设备更安全。例如,用于越狱4.0和4.3.0的PDF黑客攻击被发现者修补,并在Cydia上发布了该补丁。 - Kyle Howells
1
@Nodef 如果你不知道某件事情,至少不要假装自己知道。你听说过通过SSH更改默认密码吗?我也不明白那些执法狂热者点踩的意义所在。 - user529758

7
-(IBAction)rootCheck:(id)sender {

    NSArray *jailbrokenPath = [NSArray arrayWithObjects:
                               @"/Applications/Cydia.app",
                               @"/Applications/RockApp.app",
                               @"/Applications/Icy.app",
                               @"/usr/sbin/sshd",
                               @"/usr/bin/sshd",
                               @"/usr/libexec/sftp-server",
                               @"/Applications/WinterBoard.app",
                               @"/Applications/SBSettings.app",
                               @"/Applications/MxTube.app",
                               @"/Applications/IntelliScreen.app",
                               @"/Library/MobileSubstrate/DynamicLibraries/Veency.plist",
                               @"/Applications/FakeCarrier.app",
                               @"/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist",
                               @"/private/var/lib/apt",
                               @"/Applications/blackra1n.app",
                               @"/private/var/stash",
                               @"/private/var/mobile/Library/SBSettings/Themes",
                               @"/System/Library/LaunchDaemons/com.ikey.bbot.plist",
                               @"/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist",
                               @"/private/var/tmp/cydia.log",
                               @"/private/var/lib/cydia", nil];

    NSString *rooted;
    for(NSString *string in jailbrokenPath)
        if ([[NSFileManager defaultManager] fileExistsAtPath:string])
            rooted=@"y";
        else
            rooted=@"n";

    NSLog(@"%@", rooted);
}

示例代码: http://www.evernote.com/shard/s13/sh/e45f27ee-3dd5-4eb1-9f56-1981cdd3286b/bc156eb773315647c13c2c7ee4191866

这是一个示例代码的链接。

2
不错。但是哇,那一定是旧代码!RockApp在一年多前被Cydia收购,而Icy已经被废弃了很长时间(+Blackra1n是3.1越狱)。 - Kyle Howells
2
此外,当打印出 rooted 时,您只会看到 [[NSFileManager defaultManager] fileExistsAtPath:@"/private/var/lib/cydia"] ? @"y" : @"n"; 的结果,即数组中的最后一个元素。此代码会忽略/覆盖/丢弃所有其他结果。 - Sam

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