某二次元看番套壳软件广告分析及奇葩操作

查看 116|回复 10
作者:K0zero   
作为安卓逆向的新人小白 在看了 论坛大佬正已在b站的视频后 自己也想试试,所以找了一个常用的看动画的app 来做一个去广告的分析过程分享 在此先感谢正已大佬无私奉献的特别好的教程
因为还是小白 所以很多地方肯定会有错误,肯定也有一些很蠢很笨的办法。而且也可能比较啰嗦
!!!恳请各位大佬能批评指正 非常感谢!!!
软件名 omofun 版本号 1.0.8 32位
测试机 pixel 2 和 vivo iqoo neo
软件介绍
这个app 是那种市面比较常见的汇总各种盗版视频源的播放器软件
而且广告非常恶心!!! 好多好多广告!
通过分析apk可以知道flutter混合的一个软件
具体表现为他其中的许多界面和弹窗都是使用flutter来实现的 这些业务逻辑都没法通过dex解析反编译看到 所以只能先上frida看看进程和主要的activity了
activity初探
首先我们使用objection 对这个app做一个explore
运行命令
objection -g com.cl.musiccy.ou explore
android hooking list activities
之后可以看到很多,其中我筛出来有关广告的有如下activity
com.cyl.musiccy.ou on (Xiaomi: 10) [usb] # android hooking list activities
com.baidu.mobads.sdk.api.AppActivity
com.baidu.mobads.sdk.api.BdShellActivity   
com.baidu.mobads.sdk.api.MobCPUDramaActivity
com.baidu.mobads.sdk.api.MobRewardVideoActivity
com.beizi.ad.AdActivity
***com.cyl.musiccy.ou.MainActivity
com.kwad.sdk.api.proxy.app.AdWebViewActivity
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$ChannelDetailActivity
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$DeveloperConfigActivity
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$EpisodeDetailActivity
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivity1
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivity10
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivity2
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivity3
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivity4
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivity5
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivity6
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivity7
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivity8
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivity9
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivitySingleInstance1
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivitySingleInstance2
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivitySingleTop1
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$FragmentActivitySingleTop2
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$GoodsPlayBackActivity
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$KsTrendsActivity
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$ProfileHomeActivity
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$ProfileVideoDetailActivity
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$TubeDetailActivity
com.kwad.sdk.api.proxy.app.BaseFragmentActivity$TubeProfileActivity
com.kwad.sdk.api.proxy.app.FeedDownloadActivity
com.kwad.sdk.api.proxy.app.KSRewardLandScapeVideoActivity
com.kwad.sdk.api.proxy.app.KsFullScreenLandScapeVideoActivity
com.kwad.sdk.api.proxy.app.KsFullScreenVideoActivity
com.kwad.sdk.api.proxy.app.KsRewardVideoActivity
com.qq.e.ads.ADActivity
com.qq.e.ads.DialogActivity
com.qq.e.ads.LandscapeADActivity
com.qq.e.ads.PortraitADActivity
com.qq.e.ads.RewardvideoLandscapeADActivity
com.qq.e.ads.RewardvideoPortraitADActivity
com.shu.priory.request.IFLYBrowser
com.sigmob.sdk.base.common.AdActivity
com.sigmob.sdk.base.common.TransparentAdActivity
com.sjm.sjmdsp.SjmDspPageActivity
com.sjm.sjmdsp.SjmDspRewardVideoActivity
com.sjm.sjmsdk.SjmGameActivity
com.sjm.sjmsdk.SjmGameSpaceActivity
io.flutter.plugins.urllauncher.WebViewActivity
其中这么多类中 全都是广告类 但是没有看到一个是和初始化这些类相关的代码 所以这应该是在flutter中初始化 加载的
具体类分析
但是有一个很好玩的东西 就是 这个com.sjm.sjmdsp.SjmDspPageActivity
这个sjm我一开始也以为是某个广告sdk啥的  但是这个sjm不就是 首界面的拼音吗!
所以我开始分析sjm这个类


1.png (27.69 KB, 下载次数: 1)
下载附件
2023-11-3 19:10 上传

可以看到 这几个都是ad开头的 所以肯定跟广告相关 于是我从ad类开始看 发现了一个接口


2.png (19.77 KB, 下载次数: 1)
下载附件
2023-11-3 19:10 上传

这好像就是调用 banner类型广告的接口 只要看他的用例就可以知道代码在哪调用的广告了 于是经过一个一个尝试 找到了这个函数


3.png (47.83 KB, 下载次数: 0)
下载附件
2023-11-3 19:10 上传

hook关键函数
只看这个if else 语句就知道找对地方了! 这个函数是一个handleMessage函数 google之后明白了 安卓应用在处理需要联网下载(下载广告)等耗时资源时 主进程 使用handler 开启一个线程加载  而handleMessage 就是用来线程和主进程通信的
并且通过分析代码发现


4.png (14.77 KB, 下载次数: 0)
下载附件
2023-11-3 19:10 上传

传回的消息不同 主进程会进行不同操作
这样的话我就可以写一个frida脚本 hook让这个i9的值为114514 这样 主进程就不会收到线程让他展示广告的信息 也就是 i9=3的信息 进而就可以屏蔽广告了!
frida脚本如下 非常简单。。。
function hook() {
    let AnonymousClass1 = Java.use("com.sjm.sjmsdk.c.h$1");
    AnonymousClass1["handleMessage"].implementation = function (message) {
        console.log('com.sjm.sjmsdk.c.h handleMessage is called' + ', ' + 'message: ' + message);
        message.what.value = 114514
        return false
    };
运行命令
frida -U -f com.cyl.musiccy.ou -l down.js
可以得到 之前传的是3 然后我把它改成114514后 果然没有广告弹出来了! 开屏广告被削掉了!
又是一个广告
但是在点击一个影视之后 还会弹一个广告 这个该怎么办??
我也没有定位的方法了 他也不是首界面相关的 应该不在sjm里面
我就用了笨办法 我 jadx搜索所有 handleMessage 方法!
一共有214个 嗨哟!


5.png (31.3 KB, 下载次数: 0)
下载附件
2023-11-3 19:10 上传

结果发现 里面大多数都是 广告sdk的东西 其中 他自己app的并不是很多 也就几十个


6.png (54.94 KB, 下载次数: 0)
下载附件
2023-11-3 19:10 上传

其中sjm是老熟人了 他里面不同类的handleMessage 方法写的都几乎一模一样 我感觉是不是针对每一个广告的sdk都写了同样的一套业务逻辑 然后 他的这个handleMessage的数量也和它里面那几个广告sdk的数量对的上 所以 我就把所有的sjm.sjmsdk中的函数都hook了 结果果然 在其中一个里面  他名字是这个 com.sjm.sjmsdk.c.e


7.png (38.05 KB, 下载次数: 0)
下载附件
2023-11-3 19:10 上传

之后就简单了 用mt管理器打开 修改smali代码 将i9的值赋值为114514 然后再用mt自签名
就可以愉快使用无广告的播放器了!
总结
虽然写了这么多字 其实 没什么内容 虽然没什么内容, 但是我也研究了 三个晚上才摸出来
我只是想把自己的探索摸索过程 总结一下 希望能给各位提供一个通过handleMessage 这个旁门左道的思路 以及想让论坛的大佬指出我存在的问题错误 让我能多学习大佬的经验和建议!
感谢各位看到这里

广告, 下载次数

h1989   


K0zero 发表于 2023-11-4 16:04
这个app 好像 每一家广告sdk都会用 他会把所有的sdk都初始化 然后执行广告 如果发现第一家广告的展示线程 ...

卡退的逻辑在flutter?
K0zero
OP
  

一款名叫“彩虹多多”的软件,我找到了很有趣的代码,但里面广告很多,广告会员无法去掉,有兴趣的可以去分析出实例讲课,谢谢。
//
// Decompiled by Jadx (Fallback) - 1575ms
//
package cc.quicklogin.sdk.g;
class d$1 extends android.os.Handler {
    final cc.quicklogin.sdk.g.d a;
    d$1(cc.quicklogin.sdk.g.d r1, android.os.Looper r2) {
            r0 = this;
            r0.a = r1
            r0.[i](r2)
            return
    }
    @Override
    public void handleMessage(android.os.Message r3) {
            r2 = this;
            int r0 = r3.what
            r1 = 1
            if (r0 == r1) goto L9
            super.handleMessage(r3)
            goto Le
        L9:
            cc.quicklogin.sdk.g.d r3 = r2.a
            cc.quicklogin.sdk.g.d.a(r3)
        Le:
            return
    }
}
慕浟佳〃井少年   

可以抓一下包,就能根据域名来判断是哪一家的广告sdk,进而进行拦截
K0zero
OP
  


正己 发表于 2023-11-4 13:37
可以抓一下包,就能根据域名来判断是哪一家的广告sdk,进而进行拦截

那抓包的话 可以通过什么方式进行拦截呢?
修改 apk中的请求地址 还是 拦截请求包?
谢谢大佬评论!
哇外哇哇   


K0zero 发表于 2023-11-4 14:11
那抓包的话 可以通过什么方式进行拦截呢?
修改 apk中的请求地址 还是 拦截请求包?
谢谢大佬评论!

知道是哪一家广告sdk就可以修改对应的java里的初始化方法
NMCchan   

比较好奇这些盗版软件怎么接入广告的,广告商都要求应用商店上架,上架应用商店就要申请著作权。
lanyuxiang   


正己 发表于 2023-11-4 15:12
知道是哪一家广告sdk就可以修改对应的java里的初始化方法

这个app 好像 每一家广告sdk都会用 他会把所有的sdk都初始化 然后执行广告 如果发现第一家广告的展示线程有问题 就会调用第二家广告 直到把所有广告sdk都运行一遍
如果所有广告sdk都没有执行 这个app就会卡退
K0zero
OP
  

感谢分享,学习了
哇外哇哇   

感谢分享 学习了
您需要登录后才可以回帖 登录 | 立即注册

返回顶部