如何检测“IAP破解者”?

时间:2011-09-19 01:42:10

标签: iphone objective-c cydia

我发现许多用户使用所谓的“IAP破解者”,而不是购买应用内购买(IAP)中的项目。我还了解到,Zynga Poker和Pokerist已经检测到IAP破解者,并防止了假的IAP。我想检测哪个手机正在使用IAP cracker。对于Cydia黑客工具,我可以通过应用程序路径找到它。

但我不相信iAP破解者会陷入特定的应用程序。我想我可以通过调用“Url Scheme”来查看,但我不知道这个名字。有谁知道怎么办?

7 个答案:

答案 0 :(得分:56)

目前最好的解决方案似乎是使用外部服务器验证IAP事务,然后发回某种特定于设备的密钥来解锁只能在该服务器上生成的付费项目。这不是防弹,但它应该使您的应用程序高度抵抗任何通用的IAP破解系统;想要破解你的应用程序的人几乎必须专门为它开发一个破解。 (这比使用IAP Cracker的大多数人都要复杂得多)

以下是您基本上需要做的事情:

  1. 设计您的应用内安全解决方案;某种独特的键可以解锁您添加的功能。如果添加的功能采用数据文件的形式,那么这可能是解密该文件的加密密钥,如果它全部在代码中那么它有点困难但是有很多创造性的解决方案(加密的字符串常量,例如)。不管它是什么,它应该依赖或检查它将从你的网络服务器获得的某些数据的存在。
  2. 修改您的IAP处理代码,以便在看到处理完的事务时,将该事务的详细信息发送到您的Web服务器并获取步骤1中所需的唯一密钥。
  3. 在您的Web服务器上编写一个简单的脚本,其中包含交易详细信息,使用Apple进行验证(有关收据验证如何工作的详细信息,请参阅开发人员文档 - 非常简单的JSON请求),并且在成功验证后返回步骤中的密钥1。
  4. (请参阅下面的编辑后的文字,了解您现在需要在步骤3中进行的一些额外验证)

    在您的情况下,由于您的应用已被破解,并且您尝试停用非法获取IAP项目的人,您可以在应用的新版本中推出此功能,然后首先调用restoreCompletedTransactions运行新版本的时间,以重新验证/重新激活合法用户的购买并阻止其他人。

    然而,我应该补充一点,这是一个很多的工作 - 花了我们几个星期的程序员时间来让它顺利运行,尽管现在还有开源代码,处理大部分步骤2和3。重新启动步骤还有一个支持和公关成本 - 不可避免地有些人会更改iTunes帐户或没有互联网连接或类似的东西,他们可能会被扯掉甚至暂时无法访问他们合法支付的东西

    你需要权衡是否真的值得投入时间,当破解只适用于越狱用户(因此90%的潜在客户不会受到影响)并且大多数安装它的人不太可能支付反正你的应用程序;不要被破坏你的应用程序的大量用户吓到,很多人会很乐意免费下载一些东西,即使他们从不付钱。您可能最好将时间投入到有益于合法用户的改进中(并鼓励更多人购买您的应用)。


    编辑一年后,这仍然(大部分)准确无误,但为了应对今天宣布截获并重新发送真实收据的新破解,现在需要做更多工作。服务器端。 (幸运的是,如果您已经设置了验证服务器,那么您应该可以在不更新应用的情况下执行此操作)两个新要求:

    1)检查从Apple服务器返回的解密收据中的产品ID(包括应用程序ID和IAP产品)是否与用户购买的产品实际匹配。

    2)通过保留以前使用的事务ID的日志,检查收据中的事务ID(或恢复收据的恢复事务ID)以前从未使用过。

    尽管现在可以向非越狱用户提供IAP破解,但我的基本观点仍然是这可能比它的价值更麻烦 - 让你花费大量时间来实施并保持完全无趣批量代码,你需要从那些不愿意支付你的产品的人那里得到很多额外的销售,他们愿意大规模地破坏他们的iPhone的安全性,以避免这样做。

答案 1 :(得分:5)

我刚刚在BinPress上找到了20美元component,声称可以为您提供此保护。事实上,它正在阅读他们的描述,促使我搜索IAP Cracker并引导我解决这个问题!

从快速阅读说明看起来值得尝试至少作为这些攻击的廉价障碍。

此组件可以防止绕过应用内购买和免费解锁高级内容的工具,例如最受欢迎的“iAP Cracker”。通过托管在我们服务器上的托管收据验证服务来管理保护。它具有经过验证的安全性和针对破解工具的可靠性,并且尽可能简单地为开发人员集成。

“应用内购买验证”适用于那些没有维护服务器并希望避免自行管理购买验证的人 - 这可以节省大量时间:实现它就像插入一些额外的线条一样简单代码(见下文)。从那时起,服务器将发挥其魔力,它将使用Apple服务器验证每个收据。它还会为您提供购买计数。

答案 2 :(得分:3)

Apple在此处陈述了这个问题:In-App Purchase Receipt Validation on iOS

正如文中所述,在完成后验证您的交易,您应该没事(希望如此)。

答案 3 :(得分:1)

你应该尝试系统(“dpkg -l | grep iapCracker> /var/tmp/logiap.txt”);然后用logiap.txt的内容填充一个NSString,并检查该字符串是否有东西。但我不知道苹果是否允许你这样做;)

答案 4 :(得分:1)

要检测IAP Cracker,您只需使用NSFileManager检查已安装的软件包即可。我已经尝试用Cydia来检测越狱,它运作正常。

由于Cydia自动安装在每个越狱设备上,您可以像这样检查越狱:

if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]){

   NSLog(@"Jailbreak detected");
}

IAP Cracker只是一些软件包,它也安装在你的系统中,你也可以检查它。

if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Library/MobileSubstrate/DynamicLibraries/iap.dylib"]){

   NSLog(@"IAP Cracker detected");
}

有人知道它是否违反了Apple的一些指导原则吗?

答案 5 :(得分:0)

@ Morpheus2002编写的NSFileManager方法对我不起作用,可能违反了Apple的指导原则。要检查是否已安装Cydia,因此如果设备已越狱,您可以检查是否可以按照建议@MarkJohnson打开cydia://home URL方案:

if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://home"]]) {
    NSLog(@"Jailbreak is not detected");
} else {
    NSLog(@"Jailbreak is detected");
}

答案 6 :(得分:0)

将于本周(2015年5月)在应用程序中提交此内容。那么将会看到Apple是否批准

+(BOOL)isJailbroken {
#if (TARGET_IPHONE_SIMULATOR)
    return NO;
#endif

#ifndef IS_APP_EXTENSION

    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
    BOOL doesHaveCydia = [[UIApplication sharedApplication] canOpenURL:url];
    if (doesHaveCydia) {
        return YES;
    }
    NSError* error=nil;
    NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/System" error:&error];
    //NSLog(@"blah %i error %@",(int)[files count], error);

    if (error==nil) {
        //A non-jailbroken device will have an operation not permitted error.
        //Jailbroken device should have a list of files and a nil error.
        if (files) {
            NSLog(@"jailbreak? %i",(int)[files count]);
        }
        return YES;
    }
    return NO;
#else
    return NO;
#endif
}