飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 49541|回复: 95

[iOS] 《Enlight 全家桶》 进阶破解教程

    [复制链接]
  • TA的每日心情
    奋斗
    2016-1-13 12:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2020-6-28 15:47:07 | 显示全部楼层 |阅读模式
    本帖最后由 small-q 于 2020-6-28 19:09 编辑

    大家好,我又来教学iOS破解了!
    起因:
        2020飘云阁原创:《iOS应用逆向与安全之道》购买地址:https://item.jd.com/12800426.html
        我第一时间购买了坛主的书,然后看了好几章节,手非常之痒痒的,想找些目标练习,话说之前,打开 App Store ,由于之前我购买过图片处理软件,
        苹果推荐了 Enlight 给我,我随手下载 Quickshot Pro 好家伙,是内购应用,然后随即下载了全家桶,包括 "Enlight-Photos" 即 Quickshot,"Enlight-Video",
        "Enlight-Editor","Enlight-Phoenix",话说这软件处理图片视频特效非常不错!可惜内购影响了使用,我的目的是解除它!开始:

    第一步:
        一台MBP和越狱的机器( iOS 13.5 真香),有些基础内容,本文章将一笔带过,可先观看之前我的文章:https://www.chinapyg.com/thread-136317-1-1.html
        ,然后根据《iOS应用逆向与安全之道》第二篇 第4章 用任意一种方法脱壳得到无壳ipa备用.
    第二步:
        猜,Frida 使用你应该了解一下,我们得知内购有一个强大的关键字: receipt (凭据)
        先行目标:"Enlight-Phoenix".   
        frida-trace -U -f com.lightricks.Enlight-Phoenix -m "*[* receipt]"
        果然有调用:
        1.png
        此时的小朋友,你是不是非常多????,无法继续? 是的我也是,Frida 只是告诉了我们,这方法有在调用,那解决方案只能IDA
        搬出IDA:
        2.png
        ...
        3.png
       双击到了
       4.png
      哭,还是一脸问号???? 看来此路不通啊!
       后来从C版那里得知,此应用是ReactiveCocoa SDK写的,好吧,转换思维一下,有舍关键字呢???
       猜到没: 订阅 (名词:subscription 动词:subscribe)
    5.png
    在芒芒大海中,我捞到关键一针:
    6.png
    意思大体是这样:
        NSNumber *boolNumber = [NSNumber numberWithBool:NO];//方法写死了
        if ([boolNumber boolValue] & 1)
        {
        //有订阅跑这里
        }esle
        {
        //执行了关键,所以要买....
        }
    研究sdk太过复杂,我不玩,那我们尝试,不执行 -[PNXSubscriptionModel setSessionState:] 方法,让它的会话状态设置不上,那是不是就把功能打开了呢?
    下面Frida代码测试(感谢B.S)
    [JavaScript] 纯文本查看 复制代码
    //frida -U -f com.lightricks.Enlight-Phoenix -l QS.js
    if(ObjC.available){
    var hook = ObjC.classes['PNXSubscriptionModel']["- setSessionState:"];
    var add = new NativeFunction(hook.implementation,'void', []);
    // 进行替换
    Interceptor.replace(add, new NativeCallback(function(num2) {
       console.log("你调了我,我不给你东西!");
       // 调用原函数
    },'void', []));
    }
    
    永久代码:
    [Objective-C] 纯文本查看 复制代码
    %hook PNXSubscriptionModel
    - (void) setSessionState: (id)a1{
       NSLog(@"[+] Enlight-Phoenix setSessionState");   
        %log;
        //%orig;
    }
    %end

    好家伙功能全部打开,并且可用.
    但是,软件启动后有toolbar还有PRO标记图标,并显示了618触销界面! "导出" 功能按钮两字不见了(成了一个空按钮),我们要解决这些问题!
    8.png
    7.png
    这样,功能说算是打开了,但我个完美主义者,必须修理!

    上面三个过程处理如下:
        1.去除toolbar里PRO标记图标
    还记得我们的猜关键字么? 用动词: Subscribe 去捞下
    9.png
    -[PNXToolbarTreeGenerator toolbarNodeForFeatureNode:featureObjects:isSubscriber:freeAssetsIdentifiers:remoteCellState:featureTree:]
    方法里面,isSubscriber影响了toolbar还有PRO标记,我们要做的就是返回:YES,  好!
    永久代码:
    [Objective-C] 纯文本查看 复制代码
    %hook PNXToolbarTreeGenerator
    - (id) toolbarNodeForFeatureNode:(id)a1 featureObjects:(id)a2 isSubscriber:(bool)a3 freeAssetsIdentifiers:(id)a4 remoteCellState:(id)a5 featureTree:(id)a6  {
    
        NSLog(@"[+] Enlight-Phoenix toolbarNodeForFeatureNode");
        %log;
        return %orig(a1,a2,(bool)YES,a4,a5,a6);
    }
    %end

    13.png
       
        2. 去除618广告界面
    618.png
    在调试此软件时间在618前,肯定有618关键字,继续猜!捞到:-[PNXSubscriptionModel bindIsPartOf618Promotion]
    永久代码:
    [Objective-C] 纯文本查看 复制代码
    %hook PNXSubscriptionModel
    - (void) bindIsPartOf618Promotion {
        NSLog(@"[+] Enlight-Phoenix bindIsPartOf618Promotion");
        %log;
    }
    %end


        3.导出按钮文字消失,补回显示!
    最后,导出那里没有文字的按钮啊,是我的心头痛!
    我的想法是没有,那我就主动写,主动插入!然后继续猜,关键字导出(export)
    10.png
    在IDA看到:
    UIButton *__cdecl -[PNXExportView exportButton](PNXExportView *self, SEL a2)
    {
      return self->_exportButton;
    }
    这个就是导出按钮实例:UIButton *
    经C版一指导永久代码如下:
    [Objective-C] 纯文本查看 复制代码
    %hook PNXExportView
    - (void) setupExportButton{
        %orig;
        NSLog(@"[+] Enlight-Phoenix setupExportButton");
        %log;
        UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:@"提示" message:@"[PYG]出品!\n [url=http://www.chinapyg.com]www.chinapyg.com[/url]" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView1 show]; 
    }
    %end
    
    %hook PNXExportView
    - (id) exportButton{
            NSLog(@"[+] Enlight-Phoenix exportButton");
            %log;
            UIButton* btn = %orig;
            [btn setTitle:@"导出" forState:UIControlStateNormal];
            return btn;
            }
    %end

    11.png
    经这么一折腾,完美!

    文章最后附赠全家桶中的另三款永久代码
    一个字,都是猜的结果,都没有处理关于处
    [Objective-C] 纯文本查看 复制代码
    %hook PNXMainViewModel
    - (void) bindSubscription {
        NSLog(@"[+] Enlight-Phoenix bindSubscription");
        %log;
        UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:@"提示" message:@"完美破解! 功能全部可用." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView1 show];  
    }
    %end
    
    /////////////////////////////////////////////////////////////////
    
    %hook OWLUserSubscriptionStateProvider
    - (bool) isSubscriber {
            NSLog(@"[+] Enlight-photo OWLUserSubscriptionStateProvider isSubscriber");
            %log;
            return YES;
    }
    %end
    
    /////////////////////////////////////////////////////////////////
    
    %hook ENSubscriberInfo
    - (bool) isSubscribed {
            NSLog(@"[+] Enlight-Editor ENSubscriberInfo isSubscribed");
            %log;
            return YES;
    }
    %end
    
    /////////////////////////////////////////////////////////////////
    
    %hook EVDSubscriptionState
    - (bool) isSubscriber {
            NSLog(@"[+] Enlight-video EVDSubscriptionState isSubscriber");
            %log;
            return YES;
    }
    %end
    
    /////////////////////////////////////////////////////////////////

    然后,你要做的就是把所有永久代码组合在一个Tweak.x文件里面
    再然后.plist文件里写上全家桶就能通杀了
    {
            Filter = {
                    Bundles = (
                            "com.lightricks.Enlight-Photos",
                            "com.lightricks.Enlight-Video",
                            "com.lightricks.Enlight-Editor",
                            "com.lightricks.Enlight-Phoenix",        
                    );
            };
    }
    生成过程,请看上一遍文章,论坛不能给出Bin文件! 感谢你的理解.
    第三步 总结:
        全家桶里面,最不好搞的就是Phoenix,全程就是一个字:猜!!! 因为作者更本不按套路出牌(不能通过一个全局变量来搞定破解.遇到断头路) 但方法名称又是通往大道之路,猜出一遍天地!
        全程感谢吊大的C版不厌其烦的回答我无脑提问,在此深刻感受到学好OC正向编程的重要性,有了正向编程经验再分析破解会做到事伴功倍的效果!
        最后感谢飘云编写的 《iOS应用逆向与安全之道》帮助了我很多,书里面有非常多的解决方案,是值得深入学习的一本好书!深入学习方能: 大道至简!












    评分

    参与人数 11威望 +29 飘云币 +28 收起 理由
    yp124202453 + 1 + 1 春风欲度玉门关,下次评分翻一番!
    小新TAT + 1 PYG有你更精彩!
    bluesky10 + 1 + 1 感谢发布原创作品,PYG有你更精彩!
    zuohaoda + 1 + 1 PYG有你更精彩!
    UlRevenge + 1 + 1 感谢发布原创作品,PYG有你更精彩!
    PYG官方论坛 + 10 + 10 感谢发布原创作品,PYG有你更精彩!
    tree_fly + 5 + 5 原创精品 感谢分享!
    Petrel + 1 + 1 666
    不破不立 + 1 + 1
    smallhorse + 2 妓压群P.......

    查看全部评分

    本帖被以下淘专辑推荐:

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-7-9 22:48
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    发表于 2020-6-28 18:23:58 | 显示全部楼层
    woc,666啊!膜拜!Q总全平台妓能。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    前天 13:09
  • 签到天数: 1425 天

    [LV.10]以坛为家III

    发表于 2020-6-28 18:37:28 | 显示全部楼层
    我屮艸芔茻.....难怪不见发车,Q神果然妓压群X.......!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 2294 天

    [LV.Master]伴坛终老

    发表于 2020-6-28 19:27:33 | 显示全部楼层
    ios 8.x以后我就未越狱了
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-5-7 10:09
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    发表于 2020-7-1 16:08:36 | 显示全部楼层
    666,大佬就是666
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-22 19:43
  • 签到天数: 148 天

    [LV.7]常住居民III

    发表于 2020-7-1 17:57:19 | 显示全部楼层
    手残,上次越狱越残了,不敢再造次了
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-6-30 12:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-7-2 00:30:06 | 显示全部楼层
    不错,不错,分析得很全面!
    我当时分析就比较暴力,脱壳后,先查了关键字:isVip,isPro,isSubscriber发现真的有,那直接开撸了,果然有用
    如果只有要使用高级功能只要hook:ENFeatureItem -> isPro函数就行了,但会有引导购买的弹窗
    完整代码:
    [Objective-C] 纯文本查看 复制代码
    %hook ENFeatureViewModel
    
    - (BOOL)isRestrictedProContentActive {
        return NO;
    }
    
    - (BOOL)isSubscriber {
        return YES;
    }
    
    - (BOOL)isProFeature {
        return YES;
    }
    
    %end
    
    
    %hook ENFeatureProUsageInfoProvider
    
    - (BOOL)isRestrictedProContentActive {
        return NO;
    }
    
    - (BOOL)isSubscriber {
        return YES;
    }
    
    - (BOOL)isProFeature {
        return YES;
    }
    
    %end
    
    
    %hook ENFeatureItem
    
    - (BOOL)isPro {
        return NO;
    }
    
    - (BOOL)hasProSteps{
        return YES;
    }
    
    %end
    
    
    %hook ENSubscriberInfo
    
    - (BOOL)isSubscribed {
        return YES;
    }
    
    %end

    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2024-4-24 14:23
  • 签到天数: 412 天

    [LV.9]以坛为家II

    发表于 2020-7-3 21:04:51 | 显示全部楼层
    本帖最后由 绞尽乳汁6 于 2020-8-2 12:50 编辑

    第4章 用任意一种方法脱壳得到无壳ipa备用
    用各种放脱壳还是不行,framework库文件解不了密。安装闪退
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-18 22:40
  • 签到天数: 55 天

    [LV.5]常住居民I

    发表于 2020-7-6 09:44:45 | 显示全部楼层
    正开始准备学习ios逆向分析,已经入手安全之道,谢谢分享
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表