|
|
本帖最后由 蛀牙の小蓝 于 2025-12-8 10:49 编辑
之前群友说这个app的广告贼多贼恶心,让帮忙康康,当时一看flutter+60*6加固我立马转身就溜了。
前段时间闲逛忘记是哪个帖子有大佬说flutter+60*6加固的app关键代码不会被抽离,当时我立马就想到了这个app。要不二进宫试试看能不能搞一下?试试就逝世。
翻了一圈论坛基本都是老版本没有最新版,而且官方在20250815起就停止了3.0.0以下版本的支持了。所以我们要搞就直接搞最新的,直接去官网下了最新的3.0.4版本。
熟悉的味道熟悉的配方,开搞开搞。
遇见60*6加固直接启用邪修大法(这里是学习的 笑 lao教程,总算可以上手实践了,可能会尽量写详细点,也是简单记录一下,免得以后老年痴呆忘记了)
第一步:用网址【56.al】把dex都给脱出来,然后全选用【DEX 修复】
第二步:全选修复后的dex文件,进行dex编辑,使用邪修大法进行修复
查询正则:
- const .*\s*invoke-static \{.*\}, Lcom/stub/StubApp;->.*\(I\)V|invoke-static \{.*\}, Lcom/stub/StubApp;->.*\(Landroid/app/Activity;\[Ljava/lang/String;I\)V|invoke-static/range \{.*\}, Lcom/stub/StubApp;->.*\(Landroid/content/Context;\)Landroid/content/Context;\s*move-result-object (.*)|invoke-static \{.*\}, Lcom/stub/StubApp;->.*\(I\[Ljava/lang/String;\[I\)V|invoke-static \{\}, Lcom/stub/StubApp;->.*\(\)V|invoke-static \{.*\}, Lcom/stub/StubApp;->.*\(Ldalvik/system/DexFile;\)Ljava/util/Enumeration;\s*move-result-object (.*)\s*
复制代码
搜索完后,在当前搜索结果中进行空替换后,退出保存
第三步:将修复后的dex文件全覆盖导入、替换入口
com.copymanga.app.MainApplication
删除/assets/目录下的特征【.jgapp】【libjiagu.so】【libjiagu_a64.so】【libjiagu_x64.so】【libjiagu_x86.so】
保存后,直接用MT进行【去除签名校验】。想直接签名也可以,但是后续应用内部分功能会用不了
第四步:开始修复,使用算法助手勾选【Log捕获】抓取日志
第一次启动app会闪退,打开算法助手查看日志,搜索【onCreate】可以看到com.copymanga.app.MainActivity.onCreate报错了
类名完全匹配搜索【com.copymanga.app.MainActivity】定位到onCreate()方法,根据邪修大法替换成如下
- .method public onCreate(Landroid/os/Bundle;)V
- .registers 2
- invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
- return-void
- .end method
复制代码
保存后再次安装启动,你会发现正常进去主页了。
难道这就修复成功了吗?NO~NO~NO~,图样图森破
当你杀掉进程重启后会发现又双叒叕闪退了,所以还是重复前面的操作用算法助手抓启动日志
搜索【onCreate】可以看到com.yifan.yf_ads.activity.YFSplashActivity.onCreate报错了
类名完全匹配搜索【com.yifan.yf_ads.activity.YFSplashActivity】定位到onCreate()方法,根据邪修大法替换成如下
- .method public onCreate(Landroid/os/Bundle;)V
- .registers 2
- invoke-super {p0, p1}, Landroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V
- return-void
- .end method
复制代码
保存后再次安装启动,你会发现进入了一个空白页,没错就是空白页,相信很多人都会遇到这个问题!
这里简单解释下,邪修大法修复的onCreate,只是完成Activity实例化和初始化,本身是不具备任何逻辑的。
从【com.yifan.yf_ads.activity.YFSplashActivity】这个类名其实不难看出它是一个广告相关ads的启动页,由于我们修复的onCreate是没有任何逻辑的,所以app启动后会进入一个空白广告页面
从这个现象我们也能可以解释前面的场景,在第一次启动的时候不会加载广告相关(首次启动弹广告影响客户留存),而后续启动的时候才会加载,所以才出现第一次可以正常启动而后续启动会失败甚至修复后进入一个空白的广告页面。
那解释了这么多如何修复呢,七步之内必有解药,既然这是个广告相关的ads启动页,那么这里面指不定会有进入主页面的方法呢。
用jdax反编译apk后,定位到【com.yifan.yf_ads.activity.YFSplashActivity】这个类下,就可以发现关键方法mo4921b(),它主要是回调广告关闭事件进入主页
那话就不多说了,再一次类名完全匹配搜索【com.yifan.yf_ads.activity.YFSplashActivity】定位到onCreate()方法,重新将方法替换成如下
- .method public onCreate(Landroid/os/Bundle;)V
- .registers 2
- invoke-super {p0, p1}, Landroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V
- invoke-virtual {p0}, Lcom/yifan/yf_ads/activity/YFSplashActivity;->b()V #新增调用b()方法进入主页
- return-void
- .end method
复制代码
保存后,重新安装启动,这次就没问题啦,恭喜你脱修成功拉,再也不会跳到烦人的空白页了!此后海阔凭鸟飞,天高任鱼跃
第五步:去广分析,顺便康康能不能弄下会员
既然是flutter,那我们先看下能不能抓到接口数据,能定位到关键接口最好。
这里定位到了两个关键的接口:
用户信息接口:https://api.copy2000.online/api/v3/member/info?platform=3
广告配置接口:https://marketing.aiacgn.com/api/v2/adopr/query3/
(吐槽下:一个启动加载请求的接口数真多,定位分析了老半天,接口请求多外,部分接口还重复多次请求
hook修改用户信息接口:修改接口的过期时间、会员状态和下载次数后,发现各种乱七八糟的广告和会员限制还是会有的,小丁点效果没有。甚至我还修改了X真的购买状态后,也还是只能观看免费部分,下载也是失败。这块肯定是服务器校验无疑了
hook修改广告配置接口:我们直接将接口返回的广告list列表给清空,然后就会发现整个app瞬间清净,所有类型的广告统统都消失不见了。
会员既然是服务器校验那就没办法了,反正这个app也只是拿来看漫画,只要能去广就行了。
第六步:开始去广 (失败版
在pp.txt中搜索接口【v2/adopr/query3】 ,看到如下
可以看到【nli.dart】 应该是包含着该接口调用,而【nqi.dart】应该是处理响应的,让我们打开着两个文件看下
天塌拉,咋是匿名闭包,这咋搞,俺不会动态调试呀(希望有大佬教教小弟,遇到这种匿名闭包的要咋处理,有教程那就更好了想学习呢
第七步:再再次去广,手动分析版 (成功版
跟我之前发的去广帖子经验一样,先定位到主页面类康康它是否有引用广告类,用Activity记录,定位到主页【com.copymanga.app.MainActivit】
我们可以看到这里有【com.copymanga.ads.AdsPlugin】经常去广的bro们应该对ads这个词汇非常非常敏感吧,让我们点进去看看
我们可以看到,这里在给flutter注册5种广告的Android原生PlatformView。
在Flutter中,如果你想在界面上显示 原生 Android 控件(比如原生广告 SDK 的 View),就必须通过 PlatformView。而 Flutter 要创建一个 PlatformView,就必须先在 Android 原生侧注册一个 ViewFactory。(AI原话)
那现在思路就很清晰了,到这就有人问:那是不是把这方法亦或者把5个广告注册行为给清空就可以了呀?
打咩~,清空或者5个广告注册都给删除之后,app启动就会卡在启动页。应该是flutter初始化失败,亦或者是程序一直再等待首屏初始化完成的信号,然而一直等不到所以会一直在启动页无限的加载中。
所以这里的方法还不能全清,但是我们可以保留一个开屏广告,让我们可以进入主页面,其他失败也就失败了不影响(失败不是更好,达到我们去广的目的
类名完全匹配搜索【com.copymanga.ads.f】定位到a()方法,将【.line 42】~【.line 158】的代码全删即可
- .method public final a(Lio/flutter/embedding/engine/FlutterEngine;Landroid/app/Activity;)V
- .registers 7
- .line 1
- .line 2
- const-string v0, "flutterEngine"
- .line 3
- .line 4
- .line 5
- invoke-static {p1, v0}, Lkotlin/jvm/internal/s;->f(Ljava/lang/Object;Ljava/lang/String;)V
- .line 6
- .line 7
- const-string v0, "activity"
- .line 8
- .line 9
- .line 10
- invoke-static {p2, v0}, Lkotlin/jvm/internal/s;->f(Ljava/lang/Object;Ljava/lang/String;)V
- .line 11
- .line 12
- .line 13
- invoke-virtual {p1}, Lio/flutter/embedding/engine/FlutterEngine;->getPlatformViewsController()Lio/flutter/plugin/platform/PlatformViewsController;
- .line 14
- move-result-object v0
- .line 15
- .line 16
- .line 17
- invoke-virtual {v0}, Lio/flutter/plugin/platform/PlatformViewsController;->getRegistry()Lio/flutter/plugin/platform/PlatformViewRegistry;
- .line 18
- move-result-object v0
- .line 19
- .line 20
- new-instance v1, Lcom/copymanga/ads/h;
- .line 21
- .line 22
- .line 23
- invoke-virtual {p1}, Lio/flutter/embedding/engine/FlutterEngine;->getDartExecutor()Lio/flutter/embedding/engine/dart/DartExecutor;
- .line 24
- move-result-object v2
- .line 25
- .line 26
- .line 27
- invoke-virtual {v2}, Lio/flutter/embedding/engine/dart/DartExecutor;->getBinaryMessenger()Lio/flutter/plugin/common/BinaryMessenger;
- .line 28
- move-result-object v2
- .line 29
- .line 30
- const-string v3, "flutterEngine.getDartExe…or().getBinaryMessenger()"
- .line 31
- .line 32
- .line 33
- invoke-static {v2, v3}, Lkotlin/jvm/internal/s;->e(Ljava/lang/Object;Ljava/lang/String;)V
- .line 34
- .line 35
- .line 36
- invoke-direct {v1, v2, p2}, Lcom/copymanga/ads/h;-><init>(Lio/flutter/plugin/common/BinaryMessenger;Landroid/app/Activity;)V
- .line 37
- .line 38
- const-string v2, "com.copymanga.plugins/adsSplashUtil"
- .line 39
- .line 40
- .line 41
- invoke-interface {v0, v2, v1}, Lio/flutter/plugin/platform/PlatformViewRegistry;->registerViewFactory(Ljava/lang/String;Lio/flutter/plugin/platform/PlatformViewFactory;)Z
- return-void
- .end method
复制代码
到这一步恭喜你,一下子剔除了应用内的4种类型的广告,已经不影响正常观看 漫画、小说和动画了。
最最后,有人就提问了,不是还有一个开屏广告没弄么?这个开屏广告自个体验下来一天也弹不出几次,也不影响正常使用就算了吧。
万事留一线,别全给霍霍完了。
如果真有人想搞掉的话,指条明路 com.copymanga.ads.f.a() ==》 new AdsSplashFactory() ==》new AdsSplashListView()
可以定位到【com.copymanga.ads.AdsSplashListView】,关键的去开屏广告方法就在其中。如果改得好的话,启动可以秒进app,极大的提升使用体验
===========================================================================
怎么可能虎头蛇尾,不完美给他去掉怎么可能呢!
类名完全匹配搜索【com.copymanga.ads.AdsSplashListView】定位到h()方法,如下代码全换即可
.method public final declared-synchronized h()V
.registers 4
monitor-enter p0
new-instance v0, Ljava/util/HashMap;
invoke-direct {v0}, Ljava/util/HashMap;-><init>()V
const-string v1, "code"
const-string v2, "onADEmpty"
invoke-virtual {v0, v1, v2}, Ljava/util/HashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
iget-object v1, p0, Lcom/copymanga/ads/AdsSplashListView;->f:Lio/flutter/plugin/common/BasicMessageChannel;
if-eqz v1, :cond_14
invoke-virtual {v1, v0}, Lio/flutter/plugin/common/BasicMessageChannel;->send(Ljava/lang/Object;)V
:cond_14
monitor-exit p0
return-void
.end method
===========================================================================
至此大功告成,所有广告已经全部去除,友情提示,这个app会拿很多敏感权限,在意的小伙伴可以在【AndroidManifest.xml】把权限的配置给剔除,权限校验的地方可以定位到【com.bytedance.sdk.openadsdk.core.oo.m.e()】去分析,写太多东西累了= =
写这么多东西太不容易了,如果对你有帮助的话,麻烦给小小的赞呗
原包和破解包小飞机网盘分享,仅供学习专用哦(权限部分手机可能还会提示,直接拒绝即可,这块就没有仔细去研究了,不影响使用
https://share.feijipan.com/s/nFZ3NKtJ
再也不敢在帖子内乱发表情了,导致前面发的内容图片格式全乱了= =
叠个甲甲甲甲甲甲甲
免责声明:该app属于正常观看漫画、小说和动画的软件,不涉及涩涩。本教程也仅供技术交流,无不良影响,无引流推广,仅提供逆向思路。如若违规,还请管理大大手下留情!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +12
金币 +15
|