如何检测"IAP破解"?

27
我发现许多用户使用所谓的“IAP破解工具”来代替购买应用内购买项目(IAP)。我也了解到 Zynga Poker 和 Pokerist 已经检测到了 IAP 破解工具并防止虚假 IAP。我想检测哪些手机正在使用 IAP 破解工具。对于 Cydia 黑客工具,我可以通过应用程序路径找到它。
但是我不认为 iAP 破解工具属于特定的应用程序。我认为我可以通过调用“Url Scheme”来检查,但我不知道名称。有人知道怎么做吗?

2
如果你在这里(stackoverflow)告诉破解工具的开发者如何防止其运作,他们很可能可以快速更改工具使其重新运行,因为你告诉了他们。因此,任何想要防止该工具运行的人都不能在这里告诉你。 - hotpaw2
这就是为什么我无法在互联网上搜索的原因。我以为这里会有人给我一个友好的答案或者一个关键词.. :) - TOBOR_ROBOT
7个回答

56
目前最佳的解决方案似乎是使用外部服务器验证IAP交易,然后发送某种设备特定的密钥以解锁付费项目,该密钥只能在该服务器上生成。这并不是绝对安全的,但它应该使您的应用程序高度抵抗任何通用IAP破解系统;想要破解您的应用程序的人几乎必须针对其开发破解(这更为复杂,超出了大多数使用IAP Cracker的人的能力范围)。
基本上你需要做以下几件事情:
1. 设计您的应用程序安全解决方案;一些解锁您添加功能的唯一密钥。如果添加的功能采用数据文件形式,则可能是一个解密密钥以解密该文件,如果全部都是代码,则会有一些难度,但有很多创造性的解决方案(例如加密字符串常量)。无论是什么,它都应依赖于或检查从您的Web服务器获取的某些数据的存在。 2. 修改您的IAP处理代码,使其在看到已处理的交易时,将该交易的详细信息发送到您的Web服务器并取回步骤1所需的唯一密钥。 3. 在您的Web服务器上编写一个简单的脚本,该脚本接收交易详细信息,使用Apple进行验证(有关收据验证的详细信息,请参见开发人员文档 - 非常简单的JSON请求),并在验证成功后返回步骤1中的密钥。
对于您的情况,因为您的应用程序已经被破解,并且您正在尝试使非法获得您的IAP项目的人失效,您需要在新版本的应用程序中推出此功能,然后第一次运行新版本时调用restoreCompletedTransactions,以重新验证/激活您合法用户的购买并阻止其他所有人。

需要说明的是,这需要大量的工作 - 我们花费了几周程序员的时间来确保其顺畅运行,尽管现在有一些开源代码可以处理步骤2和3。重启步骤还需要支持和公关成本 - 不可避免地,有些人可能会更改iTunes帐户或没有互联网连接等,他们可能会因为短暂失去他们合法购买的东西而感到非常生气。

当你的应用只提供给越狱用户使用(也就是说,大约90%的潜在客户不受影响)并且大多数安装它的人可能不会为您的应用付款时,您需要权衡是否值得投入时间去做这件事;不要被破解您的应用的用户数量所吓倒,许多人即使从来不会付钱也会愉快地下载免费应用。你可能最好把时间投入到受益于合法用户的改进上(并鼓励更多人购买你的应用程序)。


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

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

2)通过记录以前使用过的交易ID,检查收据中的交易ID(或恢复收据的恢复交易ID)是否曾经被使用过。

即使现在非越狱用户也可以破解IAP,但我的基本观点仍然是,这可能比它值得的麻烦更多 - 为了回收您将花费实现和维护一系列极其无聊代码的时间,您需要从那些非常不愿意付款而愿意妥协自己iPhone安全以避免付款的人那里获得大量额外销售额。


非常感谢您提供完美的答案!没错,我也在担心时间的花费... - TOBOR_ROBOT
1
@TOBOR_ROBOT:你不觉得现在是时候接受这个答案了吗 ;) - Rok Jarc

5
我在BinPress上找到了一款价值20美元的组件,声称可以为您提供此保护功能。事实上,正是阅读了他们的描述,促使我搜索IAP Cracker,并引导我来到这个问题!
从快速阅读描述中,它似乎值得尝试,至少作为廉价的屏障来防御这些攻击。
该组件提供了防止绕过应用内购买并免费解锁高级内容的工具(如最流行的“iAP Cracker”)的保护功能,管理通过托管在我们服务器上的收据验证服务进行。它具有经过验证的安全性和可靠性,可以抵御破解工具,并旨在尽可能简单地集成到开发人员中。
“应用内购买验证”适用于那些不维护服务器并希望避免自己管理购买验证的人-这是一个巨大的时间节省器:实施它就像插入几行额外的代码一样容易(见下文)。从那时起,服务器将执行其魔法,并验证每个收据与Apple服务器。它还将为您提供所做的购买次数。

3

苹果在这里指出了这个问题:iOS上应用内购买收据验证

根据这段文字所描述的,您需要在交易完成后验证您的交易,这样就可以解决这个问题了(希望如此)。


2
请确保在有效的收据上检查产品标识符字段,我在我的应用程序中看到的一个常见破解是它们使用来自另一个应用程序的有效收据!(例如,“剪绳子”收据非常受欢迎) - yano

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");
}

有人知道这是否违反了苹果的一些指南吗?


你不能在那里读写,因为你违反了应用程序沙盒的要求。 - Antonio Giarrusso
1
使用UIApplication的canOpenURL:检查Cydia URL方案cydia:是合法的。http://handleopenurl.com/scheme/cydia - Mark Johnson
我的四个应用程序已经通过这个代码被苹果批准了,所以它也是合法的。 - Sebastian Łuczak

1
你可以尝试使用 system("dpkg -l | grep iapCracker > /var/tmp/logiap.txt"); 命令,然后将 logiap.txt 文件的内容填充到一个 NSString 中,并检查该字符串是否包含任何内容。但我不确定苹果是否允许这样做 ;)

是的,没错。我现在快要放弃了...不管怎样还是非常感谢。 - TOBOR_ROBOT

0

本周将在应用程序中提交此内容(2015年5月)。因此,我们将看到苹果是否批准。

+(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
}

是的,已经批准了。并且也已经为iOS9批准了。 - Mark Johnson

0

NSFileManager 方法由 @Morpheus2002 编写的对我不起作用,而且可能违反了苹果公司的准则。如 @MarkJohnson 所建议的那样,要检查 Cydia 是否已安装以及设备是否越狱,可以检查是否可以打开 cydia://home URL 方案。

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

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