发表于 2018-5-21 18:30

申请会员ID:link168【申请通过】

1、申 请 I D:link168
2、个人邮箱:
3、原创技术文章:电视盒子云视听极光(腾讯tv)播放视频广告去除
本文是原创,非论坛热门文章:原创破解:电视盒子 云视听极光前庭广告的手工去除   的模仿,因为这篇文章是对最新版云视听极光apk里面每次播放视频时候的一分多钟广告的去除
首先去网上下载最新版的云视听极光tv版sdk(我下载的版本是:ApkIDE_tv_video_3.3.0.1056_android_15000)
使用网易mumu模拟器运行,点击视频,可以看到每次播放视频的广告:


分析工具:
Android studio 里面提供的工具:logcat(用来查看app运行过程log信息)layout inspector(用来查看app运行过程中当前view的层次信息)
apkIDE(我用的是ApkIDE最新3.5.0少月增强版)
分析过程:
首先打开apkide,反编译apk


开始分析的切入点很关键,我使用layout inspector 分析广告的页面,作为切入点:
发现一个关键点:
tvk_playerVideoView这个关键字,使用apkIDE全局搜索这个关键字
然后使用apkIDE提供的源码查看器java decompiler 对全局搜索出来的smali文件分析源代码
发现亮点了:onPreAdPrepared,但是除了这个关键字没有其他可以下手的地方,于是继续以onPreAdPrepared关键字搜索
对搜索出来的smali对应的源码一一查看,这个过程需要比较耐心
终于发现了一个亮点:
分析出现了曙光,skipad和notifStateChange"adPlay" 是多么有价值的关键字啊,skip英文单词跳过的意思   ad一般是广告的缩写,于是我们在这里做做问问
这个时候,就需要一点smali的语法基础了,因为我们要修改这部分的代码
把这个代码


变成:


然后使用apkide提供的编译功能,重新编译apk,去模拟器测试,发现完美去掉了播放中的视频



附录修改后的apk分享:链接: https://pan.baidu.com/s/16nf5aTxfYEhZKFKj_eXI-g 密码: 7vui

Hmily 发表于 2018-5-22 16:26

过程有些简单,再提供更多技术分析吧。

发表于 2018-5-22 18:31

分析过程确实略简单些,不过分析破解关键点确实是这个,关键切入点onPreAdPrepared ,skipad ,notifStateChange"adPlay"一切都会豁然开。这也是软件破解的魅力所在,无论分析过程多么复杂,找准关键点后,也就改那么几句代码就能完美绕过
这里分享一下,研究过程中几个错误的切入点
一,开始的思路是:既然app设置了vip免广告,那就从改用户vip属性入手,使用了apkIDE全局搜索“vip”关键字,改了一系列强制让 isVip() 的函数返回 true,结果还是不行
二,尝试采用抓包,使用青花瓷抓包一系列的url,分析里边数据后发现没有ad等广告关键字,而且包内的url等信息是加过密的,无法确认那些url是广告,也没法hook
三,全局搜索“ad”关键字,这个反过来看其实是有效的,但是包含的ad的关键字非常多,分析起来也非常耗时
最后才想到使用Android studio的layout inspector 分析当前运行view的层次寻找突破口,才最终发现onPreAdPrepared关键字,然后一步步分析才找到skipad最终解决问题


Hmily 发表于 2018-5-23 14:34

游客 183.48.32.x 发表于 2018-5-22 18:31
分析过程确实略简单些,不过分析破解关键点确实是这个,关键切入点onPreAdPrepared ,skipad ,notifStateC ...

还是太少了,你可以提供其他程序分析,来些技术含量更高的内容。

发表于 2018-5-23 15:45

既然这样,那我就对腾讯视频tv版来个全广告去升级纯净版
云视听极光的广告共有三部分,播放视频时的广告,开启app的广告,待机广告以及横幅广告
去掉开启广告和待机广告:
首先我们打开AndroidManifest.xml文件
<activity android:configChanges="orientation|screenSize" android:label="@string/app_name" android:name="com.ktcp.video.activity.MainActivity" android:screenOrientation="landscape" android:theme="@style/AppStartTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.MONKEY"/>
                <category android:name="android.intent.category.LAUNCHER"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
            <intent-filter>
                <action android:name="com.tencent.qqlivetv.open.splash"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
      </activity>
可以看到com.ktcp.video.activity.MainActivity 是最先启动的activity,我们去这个activity对它反编译看看里边的逻辑
里边有代码: SplashManager.getInstance().showSplash(new SplashManager.OnSplashShowCallback()
Splash很多时候代表是闪屏广告,我们可以从这里入手
不过直接屏蔽SplashManager.getInstance().showSplash 是不行的,这样太暴力了,容易程序崩溃,我们要本着最小化修改达到完美修改的目的
继续往下看:
public boolean onTadReceived(ITadWrapper paramITadWrapper)
    {
      boolean bool = true;
      if ((paramITadWrapper == null) || (paramITadWrapper.isEmpty()))
      {
      TVCommonLog.i("MainActivity", "requestSplashAd onNonAd");
      MainActivity.a(MainActivity.this, true);
      AppstartRenderTime.getInstance().putTimeOne();
      AppstartRenderTime.getInstance().setIsHasAD(false);
      AppStartFactory.getAppStartManager(MainActivity.this.getApplicationContext()).setAppInitStatuts(2);
      ThreadPoolUtils.execute(new Runnable()
      {
          public void run()
          {
            PluginLoader.loadDexPlugin("mediaplayer");
          }
      });
      MainActivity.this.runOnUiThread(new Runnable()
      {
          public void run()
          {
            MainActivity.a(MainActivity.this);
          }
      });
      bool = false;
      }

发现亮点没有,咱们可以伪装requestSplashAd onNonAd 条件,让他直接通过:
.method public onTadReceived(Lcom/tencent/tads/main/ITadWrapper;)Z
    .locals 6

    .prologue
    const/4 v1, 0x0

    const/4 v0, 0x1

    .line 167
    if-eqz v1, :cond_0#修改变量为v1 if-eqz:为等于0就跳转到:cond_0,:cond_0 就是跳过闪屏广告的代码逻辑

    invoke-interface {p1}, Lcom/tencent/tads/main/ITadWrapper;->isEmpty()Z

    move-result v2

    if-eqz v2, :cond_1

    .line 169
    :cond_0
    const-string/jumbo v2, "MainActivity"

    const-string/jumbo v3, "requestSplashAd onNonAd"

待机广告也是差不多这个逻辑修改,全局搜索requestSplashAd onNonAd
在ScreenSaverActivity里边同样这么修改:
.method public onTadReceived(Lcom/tencent/tads/main/ITadWrapper;)Z
    .locals 10

    .prologue
    const/4 v8, 0x1

    const/4 v0, 0x0

    const/4 v3, 0x0

    .line 88
    if-eqz v3, :cond_0 #直接跳去:cond_0 代码段

    invoke-interface {p1}, Lcom/tencent/tads/main/ITadWrapper;->isEmpty()Z

    move-result v1

    if-eqz v1, :cond_1

    .line 90
    :cond_0
    const-string/jumbo v1, "ScreenSaverActivity"

    const-string/jumbo v2, "hsjkey requestSplashAd onNonAd"

去横幅广告处理:
横幅广告使用Android studio 的layout inpector 层级查看器,得到关键字Banner
使用apkIDE全局搜索Banner,当然会出很多代码,要一步步寻找有用的信息,终于找到一个关键代码点:
.line 211
    const-string/jumbo v0, "show_detail_banner_ad"

    const-string/jumbo v1, ""

    invoke-static {v0, v1}, Lcom/tencent/qqlivetv/model/advertisement/ADProxy;->notifyADShow(Ljava/lang/String;Ljava/lang/String;)V

    goto :goto_1

notifyADShow:通知广告的展示,而且还是静态方法,那我们就可以全局把这个代码 invoke-static {v0, v1}, Lcom/tencent/qqlivetv/model/advertisement/ADProxy;->notifyADShow(Ljava/lang/String;Ljava/lang/String;)V 替换为空,至此横幅广告成功屏蔽

去升级提示:
我找到对应的函数:
.method private checkForceUpgrade()V 和 startCheckVersion
都是void的函数,所以我这边就比较简单粗暴,在函数开头给了个
return-void

把这些修改的逻辑保存,使用apkIDE重新编译修改的smali,就得到一个纯净版的无广告无升级的腾讯视频tv版了




Hmily 发表于 2018-5-24 10:16

I D:link168
邮箱:

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

PS:过程还是有些简单,通过后期待你有更多分享吧,登录后把文章整理一下发到移动安全区。

link168 发表于 2018-5-24 11:23

感谢版主的通过,我整理好就发到移动安全区,另外麻烦版主把邮箱信息隐藏,谢谢啦

link168 发表于 2018-5-25 10:07

前来报到
页: [1]
查看完整版本: 申请会员ID:link168【申请通过】