27

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

但是因为我不相信 iAP 破解程序属于特定的应用程序。我想我可以通过调用“Url Scheme”来检查,但我不知道这个名字。有没有人知道怎么做?

4

7 回答 7

56

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

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

  1. 设计您的应用内安全解决方案;某种独特的钥匙,可以解锁您添加的功能。如果添加的功能采用数据文件的形式,那么这可能是解密该文件的加密密钥,如果它全部在代码中,那么它有点难,但有很多创造性的解决方案(例如加密字符串常量)。但是,无论它是什么,它都应该依赖或检查它会从您的 Web 服务器获取的某些数据是否存在。
  2. 修改您的 IAP 处理代码,以便当它看到已处理的交易时,它将该交易的详细信息发送到您的 Web 服务器并取回步骤 1 中所需的唯一密钥。
  3. 在您的 Web 服务器上编写一个简单的脚本,获取交易详细信息,通过 Apple 验证它们(有关收据验证如何工作的详细信息,请参阅开发人员文档 - 非常简单的 JSON 请求),并在成功验证后返回步骤 1 中的密钥。

(有关您现在需要在步骤 3 中进行的一些额外验证,请参阅下面 EDIT 之后的文本)

在您的情况下,由于您的应用程序已经被破解,并且您正试图停用非法获得您的 IAP 项目的人,您将在新版本的应用程序中推出此功能,然后在新版本第一次调用 restoreCompletedTransactions运行版本以重新验证/重新激活您的合法用户的购买并阻止其他所有人。

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

你需要权衡是否真的值得在这方面投入时间,当破解只对越狱用户可用(所以大约 90% 的潜在客户不受影响)并且大多数安装它的人不太可能为你的应用付费反正; 不要被大量破解您的应用程序的用户吓到,许多人会很乐意免费下载一些东西,即使他们从未付费。你最好把时间花在有利于合法用户的改进上(并鼓励更多人购买你的应用程序)。


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

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

2) 通过记录以前使用过的交易 ID,检查收据中的交易 ID(或恢复收据的恢复交易 ID)以前从未使用过。

但是,即使现在非越狱用户可以使用 IAP 破解,我的基本观点仍然是,这可能比它的价值更麻烦 - 以节省您花费在实施和维护一批完全不有趣的代码上的时间,你需要从那些不愿意为你的产品买单的人那里获得大量额外的销售额,以至于他们愿意为了避免这样做而大规模损害 iPhone 的安全性。

于 2011-09-20T22:49:46.133 回答
5

我刚刚在 BinPress 上发现了一个 20 美元的组件,声称可以为您提供这种保护。事实上,正是阅读他们的描述促使我搜索 IAP Cracker 并导致我提出这个问题!

从快速阅读描述来看,至少作为这些攻击的廉价屏障似乎值得尝试。

该组件可防止绕过应用内购买和免费解锁优质内容的工具,例如最流行的“iAP Cracker”。保护通过托管在我们服务器上的托管收据验证服务进行管理。它具有经过验证的安全性和针对破解工具的可靠性,旨在尽可能容易地为开发人员集成。

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

于 2012-01-24T03:29:06.223 回答
3

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

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

于 2012-08-04T17:06:37.030 回答
1

你应该试试 system("dpkg -l | grep iapCracker > /var/tmp/logiap.txt"); 然后用 logiap.txt 的内容填充 NSString 并检查字符串是否包含某些内容。但我不知道苹果是否允许你这样做;)

于 2011-09-19T11:29:43.613 回答
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 准则吗?

于 2012-08-06T02:36:06.057 回答
0

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

if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://home"]]) {
    NSLog(@"Jailbreak is not detected");
} else {
    NSLog(@"Jailbreak is detected");
}
于 2014-02-26T12:05:05.517 回答
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
}
于 2015-05-14T21:22:44.797 回答