因为还是小白 所以很多地方肯定会有错误,肯定也有一些很蠢很笨的办法。而且也可能比较啰嗦
!!!恳请各位大佬能批评指正 非常感谢!!!
软件名 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 这个旁门左道的思路 以及想让论坛的大佬指出我存在的问题错误 让我能多学习大佬的经验和建议!
感谢各位看到这里