本帖最后由 Sunika 于 2025-2-8 18:46 编辑
免责声明:本文章仅供学习和研究用途,旨在学习安卓逆向工程的基本技术和操作流程,以提升个人技术能力。文章中的案例仅作为技术演示,所使用的任何具体应用软件均未直接透露信息,仅为学习目的选取。如有侵权,请联系本人或管理员处理
版本:2.8.10
软件:???????
网页版教程免费但需回复,全文pdf版本1个币,与网页版无区别。欢迎各位购买支持
如果文章被吞字请购买文档或等文档免费
pdf链接:
普通去签后进入app
结果等了近10秒才进去
难道每一次使用都要等10秒钟?
忍不了
因此,我们的第一件事情是跳过启动页
跳过启动页
打开activity记录,进入软件
发现先进入的是com.tianxingjian.supersound.MainActivity(以下简称MainActivity),再进入的是com.tianxingjian.supersound.HomeActivity(以下简称HomeActivity)
想要启动一个新activity可使用如下两种方法:
1. public void startActivity(Intent intent)
2. public void startActivityForResult(Intent intent, int requestCode)
两种方法区别在于startActivity用于启动一个新Activity且不关心返回结果,而startActivityForResult用于启动新Activity并需要接收其返回的结果
而Intent对象是用于在不同组件之间传递信息的工具。它包含了启动目标Activity所需的关键信息(如目标Activity的类名等),可以将其看作是"启动某个Activity的命令"
为了实现直接从MainActivity跳转到HomeActivity,我们可以按照以下步骤操作:
1. 在MainActivity中找到启动HomeActivity的代码,即startActivity()的调用
2. 将这段代码放到MainActivity的onCreate()方法中
这样,当MainActivity被创建时(即onCreate()方法执行时),就会直接启动HomeActivity,从而跳过启动页
操作如下
找到启动HomeActivity的代码
首先类名搜索MainActivity,再在结果中搜索代码startactivity,得到三个结果
第一个搜索结果:
可以看到startActivity传入的intent里写的类是MainActivity,即要启动的是MainActivity。再结合下面putExtra的键"only_back_app"可以知道这个方法应该与我们的需求无关,直接忽略
第三个搜索结果:
传入的intent里也是MainActivity,因此不符合需求,忽略
而第二个搜索结果:
当x.j().p()>1时,startActivity方法会传入一个Intent,其Action为"android.intent.action.VIEW",且URI为"inapp://super.ae/home"。系统会在AndroidManifest.xml文件中与intent-filter匹配,以此启动满足要求的Activity
根据这两幅图片得出启动的是HomeActivity,这正是我们所要的
GuideActivity是第一次启动app时用于初始引导的,与我们的需求无关,忽略
把启动代码放到MainActivity的onCreate()方法中
根据图5,HomeActivity的启动代码为:
- Intent intent = new Intent("android.intent.action.VIEW", Uri.parse("inapp://super.ae/home"));
- intent.setPackage(getPackageName());
- startActivity(intent);
- finish();
- this.m = true;
复制代码
由于onCreate方法不仅用于启动Activity,还承担着其他初始化操作,因此在修改时需要谨慎分析其具体作用,以确保不影响其他逻辑
修改前的onCreate方法:
通过分析代码中的if条件("only_back_app"),可以得出结论:该代码块的内容与需求无关,且是必须保留的。删除或修改它可能会影响某些操作的正常执行。直接忽略这一部分
接着,关注else代码块的内容,方法如下:
显然,这段代码与设置开屏广告相关,因此推测正常进入首页的逻辑是通过广告相关的类来启动HomeActivity
在这种情况下,我们可以直接用启动HomeActivity的代码替换掉else中的广告逻辑
修改后的onCreate方法:
保存安装测试,发现进入首页神速
解锁功能
打开activity记录
当使用会员功能时,发现会跳转到com.superlab.billing.GuideDonateActivity
为了找出会员的判断逻辑,首先需要定位启动GuideDonateActivity的代码位置。然后,再查找其调用以此找出是哪个部分触发了该Activity的启动
通过这种方式,我们可以追溯到会员判断的代码,从而了解何时以及如何判断用户是否为会员
具体操作如下:
先进入该类查找调用处
再在结果中代码搜索startactivity
发现唯一一处用于启动"捐赠"页面的地方
转java发现这个方法就是单纯用来启动"捐赠"页面的
因此再查找这个方法的调用
这两个结果都可以追溯到关键的代码逻辑
首先看第一个结果:
可以看到,a方法的返回值决定了是否启动"捐赠"页面
接着,我们查看a方法的具体代码:
从代码来看,a方法显然是用于会员判断的(实际测试也证明如此)。为了阻止启动"捐赠"页面,我们可以尝试修改a方法的返回值
通过字符串搜索"validated"和"validated_time",发现它们唯一的get调用就在这个方法中。因此,我们可以直接清空a方法的内容,直接返回1,从而跳过"捐赠"页面的启动
接下来是第二个搜索结果:
经过两次调用后,我们发现多个调用结果,进入查看后可以确认:
如果是会员,继续使用会员功能。
如果不是会员,则启动"捐赠"页面
这段逻辑的判断点依旧是a()方法
为了防止跳转到"捐赠"页面,我们同样可以清空a方法,直接返回1
保存安装测试,会员功能可正常使用,广告消失
ps1:本人测试哪怕会员功能可用,但开屏等待还是有,因此建议修改代码跳过开屏
ps2:该帖中涉及的Activity的启动,生命周期,Intent的显隐式等属于Android开发的基础的基础,推荐各位学习一下。哪怕不进行正向开发,即使学到只能看懂代码逻辑的层次也对逆向有很大的帮助
完
简单总结
跳开屏:找到启动首页的代码,进入开屏类的onCreate方法,添加启动首页的代码
解锁功能:找到启动"捐赠"页面的代码,找调用启动代码的代码,找会员逻辑,修改会员逻辑
|