本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/673.html

          ☞ 点击订阅 ☜
 本博客最新动态!及时将最新博文通知您!

对于iOS的应用安全这块主要有两块是我们开发者可以避免的,一个是存储数据加密,这个在上一篇文章Himi介绍了base64加密算法;另外一个就是付费产品防护!那么本篇Himi来分享如何防护越狱用户的iap Cracker!

对于iap Cracker这个插件,Himi简单介绍下!

iap Cracker可以说是iOS越狱用户的终极利器阿,当今app Store的所有内置收费的游戏,基本使用此插件进行秒购买无压力!(对于那些收费下载的游戏,对于越狱用户来说,安装个XX助手<你懂得~>就可以免费体验app store的所有游戏,不管你下载收费还是内置收费!)

iap Cracker能绕过appstore的付费流程,其方式是当用户点击付费产品进行购买后,iap Cracker模拟返回一个购买成功的消息(无需联网,说白了,连post 数据给App store都没有!),然后我们应用中收到这个“假的”交易成功的消息直接给用户加钱,加装备,加各种….

OK,对于iap Cracker就不再多介绍了,下面Himi来分享如何防护iap Cracker吧;

对于越狱用户使用付费破解插件进行付费这个问题,其实Apple并没有不管,而是已经在文档中清晰的说明,只是很多童鞋并没有发现,如下截图:

apple提示开发者付费要进行验证付费收据! 原文apple dev官方文档连接:

https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide…

下面Himi就详细讲解如何在我们付费流程中加入iap防护,步骤如下:

1. 首先将 json类库和NSData+Base64类导入你的项目中,下载:

    “json_base.zip” 下载地址:  http://vdisk.weibo.com/s/hq1Qk

2. 然后将Himi封装的如下函数拷贝到你付费代码所在的类中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
.h中:
-(BOOL)putStringToItunes:(NSData*)iapData;
 
.m中:
 
#import "NSData+Base64.h"
#import "NSString+SBJSON.h"
#import "JSON.h"
 
-(BOOL)putStringToItunes:(NSData*)iapData{//用户购成功的transactionReceipt
 
    NSString*encodingStr = [iapData base64EncodedString];
 
    NSString *URL=@"https://sandbox.itunes.apple.com/verifyReceipt";
    //https://buy.itunes.apple.com/verifyReceipt
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];// autorelease];
    [request setURL:[NSURL URLWithString:URL]];
    [request setHTTPMethod:@"POST"];
    //设置contentType
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    //设置Content-Length
    [request setValue:[NSString stringWithFormat:@"%d", [encodingStr length]] forHTTPHeaderField:@"Content-Length"]; 
 
    NSDictionary* body = [NSDictionary dictionaryWithObjectsAndKeys:encodingStr, @"receipt-data", nil];
    SBJsonWriter *writer = [SBJsonWriter new];
    [request setHTTPBody:[[writer stringWithObject:body] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]];
    NSHTTPURLResponse *urlResponse=nil;
    NSError *errorr=nil;
    NSData *receivedData = [NSURLConnection sendSynchronousRequest:request
                                                 returningResponse:&urlResponse
                                                             error:&errorr];
 
    //解析
    NSString *results=[[NSString alloc]initWithBytes:[receivedData bytes] length:[receivedData length] encoding:NSUTF8StringEncoding];
    CCLOG(@"-Himi-  %@",results);
    NSDictionary*dic = [results JSONValue];
    if([[dic objectForKey:@"status"] intValue]==0){//注意,status=@"0" 是验证收据成功
        return true;
    }
    return false;
}

接着说下此方法的使用,一般付费代码中,童鞋们肯定会有如下函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易结果
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased://交易完成
                 if([self putStringToItunes:transaction.transactionReceipt]){
                     //这里给用户添加钱阿,装备阿什么的
                 }
                   break;
             ......代码省略
         }
     }
}

上面这个函数当获取交易成功的消息都会进入到SKPaymentTransactionStatePurchased这个case中(不管是iap cracker模拟的还是appstore真的反馈的消息), 那么我们一般不做iap防护情况下,会直接在此case中给用户添加金币阿,什么的! 但是如上所说因为iap cracker也会模拟返回交易成功的消息,也会进入到这个case中,因此我们在此与appstore再次进行一次收据验证!

另外说一点当交易完成时appstore传回来的transaction(SKPaymentTransaction)类中的transactionReceipt属性里包含AppStore返回经过签名的收据信息!OK,我们要的就是这个收据并将此收据post给appstore 的server进行收据验证,所以在SKPaymentTransactionStatePurchased这个交易成功的case中再调用Himi封装的函数if([self putStringToItunes:transaction.transactionReceipt]){} 进行再次确认下购买是否付费流程正确!

那么下面详细说下Himi封装的这个putStringToItunes函数:

此函数中,首先我们将传入的收据data类型变量进行base64转换成string类型,然后将此收据以json的形式发送给appstore进行验证!这里注意!一定要以json形式发送,否则appstore server端不识别!

最后再次利用json对appstore server返回的字段(json数据)进行解析,我们只需要解析出 status 这个key的value即可!

当appstore验证收据正确时我们解析出来的 status 这个key的value值为0(零)!

下面是appstore返回json数据的两种形式:

1. 收据无效的情况:

1
{"status":21002, "exception":"java.lang.NullPointerException"}

2.收据正确的情况,如下图(点击放大):

最后大家需要注意的一点是,Himi封装的函数中post的地址这里要记得发布的时候修改!

      因为当你沙盒测试的时候地址是:https://sandbox.itunes.apple.com/verifyReceipt

      但是正式发布后post的地址应该是:  https://buy.itunes.apple.com/verifyReceipt

千万不要发布应用的时候别忘记修改这里!

OK,本篇就介绍到这里,希望对还没有做iap防护的童鞋有所帮助!

—————2012年5月2日更新:

对于iap 的防护,现在除了iap cracker之外,那么最主要的就是国人的iap free这个插件了,那么对于iap free的防护,如果我们仅仅只是跟apple的服务器进行验证收据,那么iap free照样能破解我们的游戏/软件!

我这里先大概说下iap free

iap free的功能与iap cracker功能类似,只是更加强大的iap free能在你与apple服务器进行验证收据的步骤中进行截取,并返回一个模仿apple返回的假收据!这么一说大家就很清楚了,我们上面说的iap 验证收据变得毫无意义,但是不要着急,这里Himi将iap free的假收据形式打印了出来,大家对比看下就知道该如何来做iap free的防护了:

上图就是iap free制作的假收据啦,那么至于如何继续做防护,我想这里不需要再多解释了,毕竟有政策就有对策;大家发挥吧~

另外说一点,当用户在无网的情况下购买任何产品,肯定只有两种情况,1.越狱机器想破解。2.忘记;

那么我们可以使用下面这段代码判断当前ios设备是否联网了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-(BOOL)isNetworkOK{
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags; 
 
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability); 
 
    if (!didRetrieveFlags)
    {
        NSLog(@"Error. Could not recover network reachability flags");
        return NO;
    
 
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    return (isReachable && !needsConnection) ? YES : NO;
}

项目中添加    SystemConfiguration.framework

然后在导入 :

  #import <SystemConfiguration/SCNetworkReachability.h>

      #import <netinet/in.h>

【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!拒绝iap Free!让iphone越狱用户无从下手!【2012年5月2日更新防护iap Free的方法】相关推荐

  1. 【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!拒绝iap Free!让iphone越狱用户无从下手!

    [iOS-iap防护]验证用户付费收据!拒绝iap Cracker!拒绝iap Free!让iphone越狱用户无从下手![2012年5月2日更新防护iap Free的方法] 本站文章均为 李华明Hi ...

  2. 苹果 iOS 应用 TestFlight 内测版下载地址汇总(8月16日更新)

    内测版本均为最新内测版本. 需提前下载 TestFlight App. 如有特殊版本会标出,建议使用自带Safari浏览器食用. 如果链接提示[不再接受任何新测试员],说明内测已满. 附上通过test ...

  3. android 8.0 nexus7,Android 7.0即将推送 Nexus用户最迟8月22日更新

    原标题:Android 7.0即将推送 Nexus用户最迟8月22日更新 [丫丫网]Android N终于来了.今年5月,谷歌正式发布最新的Android N系统.7月1日,谷歌都会在位于加州山景城的 ...

  4. 2014年12月2日更新完英雄联盟一直显示无法连接服务器,【致想玩韩服LOL的Mac用户】macOS Sierra[10.12.4可用]下安装英雄联盟新客户端并连接到韩服服务器...

    本帖子致那些想玩韩服LOL的Mac用户 首先,之前我写过一篇帖子是针对Mac用户用旧客户端玩韩服的,不过Riot Games于2017年4月24日废弃旧客户端,在这段时间到2017年5月6日内,均可以 ...

  5. 王者荣耀服务器维护9月27,《王者荣耀》ios更新不了怎么办 9月27日更新失败解决方法...

    导 读 王者荣耀9月27日更新结束后正式服就会开始s13赛季了,这种大版本更新一般都会有各种更新状况出现,尤其是ios玩家,那么ios更新不了怎么办?小编抢先为大家分享一下更新失败的原因和解决方法,大 ...

  6. 苹果或推出粉色款iPhone 13;用户超 8 亿,拼多多再超阿里;贝索斯将于7月5日卸任亚马逊CEO|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  7. php验证iap收据,【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!!

    接着说下此方法的使用,一般付费代码中,童鞋们肯定会有如下函数: 另外说一点当交易完成时appstore传回来的transaction(SKPaymentTransaction)类中的transacti ...

  8. iOS迅雷7月19日更新,终于可以稳定下载了!

    苹果版迅雷APP (iOS) 由于政策原因一直未在 App Store 上架.而这几天苹果突然加大审核力度,掉了一批证书,到目前为止官方测试版iOS迅雷依旧无法使用!不过小编为大家带来可以正常使用的v ...

  9. 给新人的iOS面试资料(2016年3月6日更新)

    发现各种群里的新人都不知道怎么样去准备面试,确实现在找工作比较难,培训班出来的千篇一律的简历,极大的增加了你的简历被心仪企业看到的难度.所以这篇文章集合一些我之前搜集的面试要点,希望能给大家帮助. 简 ...

最新文章

  1. 多分类loss函数本质理解
  2. 全球唯一标识GUID
  3. Hulu直播服务难点解析(二):系统设计与实现
  4. oracle簇表 数据抽取,Oracle聚簇表
  5. 点击事件为什么会失效_Spring事务原理?事务在方法间如何传播?为什么会失效?...
  6. 如何用c语言制作飞机订票系统,C语言编程飞机订票系统如何设计?
  7. 【音乐分享】Let Me Go
  8. wepy公共样式_小程序开发wepy框架类vue的开发方式
  9. android 自定义View【2】对话框取色色盘取色的实现
  10. 学自动化测试哪个培训机构好 试听课程后就选了这个地方学习
  11. 暴雪正在等待另一项_守望先锋更新一直显示正在等待另一项安装或更新怎么办...
  12. 程序员知道什么叫劳务外包?企业为什么要选择劳务外包吗?
  13. Python中文社区开源项目扶持计划
  14. 每日一题 No.4 男女搭配干活不累
  15. electron 实现index.html与main.js通讯,获取input输入框数据。
  16. 【GANs】Deep Convolution Generative Adversarial Network
  17. 外星人显卡拓展坞支持linux,外星人扩展坞可以用哪些显卡?
  18. RV1109开发板ssh服务器移植到arm开发板
  19. java double类型保留两位小数的几种方法
  20. BZOJ 3891 USACO 2014 Dec Piggy Back 搜索 最短路

热门文章

  1. MAIGO的同济题解2
  2. iPhone的解锁、越狱、激活、固件等等是什么意思,有什么分别?
  3. C语言:输入三角形边长,求面积。
  4. 大数据学习的有哪些相关书籍
  5. 【论文阅读】iSAM贝叶斯树相关内容理解与学习
  6. 用python画星空图教程水粉_怎样用水粉颜料画星空
  7. 解决山石设备无法使用最新版chromeflash功能(91版本及以上)
  8. Android核心功能
  9. 极简汉字史 第一章 文象列而结绳移 鸟迹明而书契作
  10. eclipse多行注释 (eclipse开发工具)