吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2935|回复: 39
收起左侧

[Android 原创] 某二次元看番套壳软件广告分析及奇葩操作

  [复制链接]
K0zero 发表于 2023-11-3 19:13
本帖最后由 K0zero 于 2023-11-3 19:18 编辑

作为安卓逆向的新人小白 在看了 论坛大佬正已在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

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

2.png

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

3.png

hook关键函数

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

并且通过分析代码发现

4.png

传回的消息不同 主进程会进行不同操作

这样的话我就可以写一个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

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

6.png

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

7.png

之后就简单了 用mt管理器打开 修改smali代码 将i9的值赋值为114514 然后再用mt自签名

就可以愉快使用无广告的播放器了!

总结

虽然写了这么多字 其实 没什么内容 虽然没什么内容, 但是我也研究了 三个晚上才摸出来

我只是想把自己的探索摸索过程 总结一下 希望能给各位提供一个通过handleMessage 这个旁门左道的思路 以及想让论坛的大佬指出我存在的问题错误 让我能多学习大佬的经验和建议!

感谢各位看到这里

免费评分

参与人数 13威望 +1 吾爱币 +30 热心值 +12 收起 理由
byf3332 + 1 我很赞同!
junjia215 + 1 + 1 谢谢@Thanks!
Aaron152 + 1 + 1 我很赞同!
芽衣 + 1 + 1 点赞。。
Minecraft2333 + 1 + 1 好臭的代码,不过很6
allspark + 1 + 1 用心讨论,共获提升!
smile1110 + 1 热心回复!
怒罗江门 + 1 + 1 谢谢@Thanks!
d_sherlock + 1 我很赞同!
空不了 + 1 + 1 我很赞同!
hhf436 + 1 热心回复!
fengbolee + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
正己 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

卡退的逻辑在flutter?
h1989 发表于 2023-11-6 00:16
一款名叫“彩虹多多”的软件,我找到了很有趣的代码,但里面广告很多,广告会员无法去掉,有兴趣的可以去分析出实例讲课,谢谢。
//
// 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.<init>(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
    }
}
正己 发表于 2023-11-4 13:37
可以抓一下包,就能根据域名来判断是哪一家的广告sdk,进而进行拦截
 楼主| K0zero 发表于 2023-11-4 14:11
正己 发表于 2023-11-4 13:37
可以抓一下包,就能根据域名来判断是哪一家的广告sdk,进而进行拦截

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

点评

知道是哪一家广告sdk就可以修改对应的java里的初始化方法  详情 回复 发表于 2023-11-4 15:12
正己 发表于 2023-11-4 15:12
K0zero 发表于 2023-11-4 14:11
那抓包的话 可以通过什么方式进行拦截呢?
修改 apk中的请求地址 还是 拦截请求包?
谢谢大佬评论!

知道是哪一家广告sdk就可以修改对应的java里的初始化方法
慕浟佳〃井少年 发表于 2023-11-4 15:49
比较好奇这些盗版软件怎么接入广告的,广告商都要求应用商店上架,上架应用商店就要申请著作权。
 楼主| K0zero 发表于 2023-11-4 16:04
正己 发表于 2023-11-4 15:12
知道是哪一家广告sdk就可以修改对应的java里的初始化方法

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

点评

卡退的逻辑在flutter?  详情 回复 发表于 2023-11-4 18:08
哇外哇哇 发表于 2023-11-4 17:07
感谢分享,学习了
NMCchan 发表于 2023-11-4 19:35
感谢分享 学习了
lanyuxiang 发表于 2023-11-4 23:35
感谢分享,学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-27 16:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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