某视频去广告

发布时间 2023-08-12 15:42:05作者: WXjzc

吾爱破解看到的帖子,运用自己学的知识来看看


干掉更新

一打开APP就提示需要更新,还没个X给我点

img

用MT管理器监控一下Activity

img

发现最先开始的版本判断从com.pencil.yereen.MainActivity开始,找一下代码

img

很好,找到了高度可疑的更新信息,一路跟踪过去,可以知道是获取com.pencil.saibeans.SaiUpgradeInfo的属性来判断

img

先hook一下,看看返回了些啥frida -U -l hook.js -f "com.violetele.zdvod" --no-pause

setImmediate(function() {
    Java.perform(function() {
        var targetClass='com.pencil.saibeans.SaiSysConfigBean';
        var methodName=decodeURIComponent('getUpgrade_info');
        var gclass = Java.use(targetClass);
        gclass[methodName].overload().implementation = function() {
            console.warn('\n[Hook getUpgrade_info()]'+'');
            var i=this[methodName]();
            console.log('\treturn: '+i);
            console.log('Version Code: '+i.getVersion_code())
            console.log('Is Same: '+i.getIs_same())
            console.log('Is Force: '+i.getIs_force())
            console.log('Url: '+i.getUrl())
            console.log('Intro: '+i.getIntro())
            return i;
        }
    })
  })

现在获得了返回值,可以看到主要影响的应该是前3个值,尝试将这3个值修改

img

样本的版本代码是15100,其次将is_same的值改为1is_force的值改为0,先hook看看能不能去除更新弹窗

img

此时发现弹窗确实消失了,说明这样操作确实可行,先将这段位置记录下来

img

干掉广告

从启动类中可以找到广告加载的方法

img

很明显只需要将这个方法的内容直接清空即可,在smali中找到对应的函数直接return-void

img

接下来随便点进一个视频,就能看到需要看广告才可以观影,这怎么行???这里可以看到Activity还是启动类com.pencil.yereen.saivideodetail.SaiDetailActivity

img

看一下广告,跳转的Activity是com.sigmob.sdk.base.common.AdActivity

img

到个人页面看一下,发现vip可以免广告,那只需要让自己变成vip就行了

img

全局搜索免广告,可以定位到com.pencil.yereen.saimine.SaiMineViewModel类下的O方法

img

可以看到进一步调用

img

直接hook这些函数,返回一些值试试

setImmediate(function() {
    Java.perform(function() {
        var targetClass1='com.pencil.saibeans.SaiUpgradeInfo';
        var targetClass2='com.pencil.saibeans.SaiUserInfo';
        var gclass1 = Java.use(targetClass1);
        var gclass2 = Java.use(targetClass2);
        gclass1['getIs_same'].overload().implementation = function() {
            console.warn('\n[Hook getIs_same()]'+'');
            var i=this['getIs_same']();
            return 1;
        }
        gclass1['getIs_force'].overload().implementation = function() {
            console.warn('\n[Hook getIs_force()]'+'');
            var i=this['getIs_force']();
            return 0;
        }
        gclass1['getVersion_code'].overload().implementation = function() {
            console.warn('\n[Hook getVersion_code()]'+'');
            var i=this['getVersion_code']();
            return 15100;
        }
        gclass2['getFree_time'].overload().implementation = function() {
            console.warn('\n[Hook getFree_time()]'+'');
            var i=this['getFree_time']();
            return 4102329600;
        }
    })
})

此时发现就没有广告了,可以说用hook的方式完全是可行的!

img

破解

既然hook可行,那么就要进行下一步了,需要持久化地破解,必须去更改它的代码才行

用MT管理器分析该APK文件,从Jadx中可以知道要修改的类是从classes2.dex中加载的

img

img

反编译这个dex文件,找到com.pencil.saibeans.SaiUpgradeInfo转为smali代码进行查看

img

想办法修改返回值,需要getIs_force返回0getIs_same返回1getVersion_code返回15100,类型都为整型

img

img

接下来修改getFree_time的返回值,我想让他免费到2099-12-31 00:00:00,则时间戳为4102329600,转为16进制为F4849500

img

img

保存修改后让MT管理器自动签名

img

然后重新签名后,应用始终无法打开(不显示任何页面),也就是说它有签名验证!

过签名

可以先用MT管理器自带的去除签名验证功能试一下(需要会员,我没有就不试了)

img

重新分析吧,一般签名验证先从入口开始看,一下就看到了

img

显然,if里的条件直接改为true就可以绕过这里的验证,原代码如下

img

只需要将v0赋值为1,保存退出,重新签名

img

再次安装,这次是会短暂出现页面,并出现权限申请,但依然闪退

img

img

这说明其他地方还有验证,那么可以根据之前的特征字符串===========>>> app kill app_cudgel搜索,可以发现其实一共有3处校验,进入看逻辑其实都是一样的,改判断条件即可

img

完成这两处修改后,重新安装app,可以正常进入了

img

但是观看视频时却出现无网络异常,网络当然没问题,那说明肯定还有校验没去

img

考虑到之前的校验给出了日志打印,搜索它日志的特征试试,找到可疑的代码

img

跟踪后可以发现许多调用

img

img

最后是去加载了so

img

好死,超级无敌大混淆,那我是不可能去分析它的了

img

幸运的是,正己老师说了可以用MT一键去签。不过MT要钱,但好在NP不要钱,所以NP去签试试

img

img

img

img

尝试了几次,都是失败,要么就是莫名出现了更新弹窗,后来我又尝试去破解和这个软件套了同一个壳的影视APP,采用同样的方式可以破解成功。

要点

去签时有两种选择

  1. 先去签后修改
  2. 先修改,但不要自动签名,修改完成进行去签

可以使用Frida来hook要修改的点,从而判断修改是否可行

成果展示

img

声明

本文仅供学习交流,本人不会提供任何成品。