Android_Note( 二 )
前置理论知识
Android 的四大组件
- Activity:活动,是用户与应用程序交互的窗口,一个应用程序可以有多个 Activity,每个 Activity 都是一个单独的类,负责处理用户的交互。 Android 应用必须包含一个 Activity,用于启动应用程序。 Activity 的生命周期: onCreate()、 onStart()、 onResume()、 onPause()、 onStop()、 onDestroy(),这些方法都是 Activity 类的回调方法,用于处理 Activity 的生命周期。
- Service:服务,是一种没有用户界面的组件,用于在后台执行长时间运行的操作或处理网络请求。不依赖于用户界面,可以在后台运行,即使用户退出应用程序,服务仍然可以继续运行。 Service 的生命周期: onCreate()、 onStartCommand()、 onBind()、 onUnbind()、 onDestroy()。
- Broadcast Receiver:广播接收器,用于接收系统或其他应用程序发送的广播消息,可以在应用程序之间传递消息。例如,当手机电量低时,系统会发送一个广播消息,应用程序可以注册一个广播接收器,接收这个消息并做出相应的处理。 Broadcast Receiver 的生命周期: onReceive()。
- Content Provider:内容提供器,用于管理应用程序的数据,提供数据的访问接口,其他应用程序可以通过这个接口访问数据。 Content Provider 的生命周期: onCreate()、 query()、 insert()、 update()、 delete()。
Activity的生命周期
- onCreate():Activity 创建时调用,用于初始化 Activity,加载布局文件,绑定数据,创建 View,注册监听等。
- onStart():Activity 可见时调用,但不一定获取焦点,可以看到 Activity,但无法与 Activity 交互。
- onResume():Activity 获取焦点时调用,此时 Activity 可以与用户交互,可以处理用户的输入事件。
- onPause():Activity 失去焦点时调用,此时 Activity 仍然可见,但无法与用户交互,可以保存数据,释放资源。通常在启动新的 Activity 或弹出对话框时调用。
- onStop():Activity 不可见时调用,此时 Activity 不可见,可以释放资源,停止动画等。通常在 Activity 被覆盖时调用。
- onDestroy():Activity 销毁时调用,用于释放资源,取消注册监听,关闭数据库连接等。通常在 Activity 被销毁时调用。
- onRestart():Activity 重新启动时调用,此时 Activity 重新可见,但不一定获取焦点。
以上所有方法都是 Activity 类的回调方法,用于处理 Activity 的生命周期。无法直接调用这些方法,只能通过系统调用。但可以重写这些方法,实现自定义的功能。
Android 的跳过广告
广告的执行流程
- 程序启动 Activity
- 执行广告的 Activity
- 广告 Activity 结束后,执行主 Activity
修改方法
- 修改广告 Activity 的加载时间,改成 0
- 修改广告 Activity 的跳转逻辑,直接跳转到主 Activity
- 修改广告 Activity 的布局文件,将广告内容隐藏
广告跳过
先启动示例程序,可以看到有有个开屏广告,三秒后进入主界面,主界面有两个个弹窗广告,和一个横幅广告
开屏广告
我们首先要定位这几个广告的 Activity
使用 MT 管理器的 Activity 记录功能
启动服务之后,打开示例程序,可以看到记录了几个 Activity
回到 MT 管理器,可以看到定位到的 Activitycom.zj.wuaipojie.ui.AdActivity
接下来用 NP 管理器查看安装包里的 classes.dex
文件,搜索 com.zj.wuaipojie.ui.AdActivity
,可以看到这个 Activity 的代码
smail 看得有点麻烦,点击右上角菜单转化为 Java 代码,我们阅读 Java 代码
1 | // |
方法一:修改广告 Activity 的加载时间
可以知道,广告 Activity 的逻辑是在 loadAd
方法中,延迟 3 秒后执行 jump
方法,jump
方法中跳转到 ChallengeThird
类,我们可以直接修改 loadAd
方法,将延迟时间改为 0 ,这样就可以直接跳转到主 Activity
由于无法直接修改 Java 代码,我们可以使用 smali 修改 smali 代码,将 3000
改为 0
将对应 smail 代码的 0xbb8
改为 0x0
保存修改后的文件,重新打包安装包安装,启动示例程序,可以看到开屏广告直接跳转到主 Activity。
需要注意的是,实际上广告的 activity 并没有被跳过,只是跳转到主 Activity 的时间被缩短了。这点我们同样可以通过 Activity 记录来验证。还有一点就是,如果广告的时间是由服务器控制的,那我们就无法通过修改本地代码来跳过广告了,需要通过修改服务器的返回数据来跳过广告。这里就不讨论了。
方法二:修改广告 Activity 的跳转逻辑
记得上一篇文章 Android_Note( 一 ) 中介绍过 AndroidManifest.xml 文件,我们可以在这里修改广告 Activity 的跳转逻辑。
AndroidManifest.xml 中声明了实现应用部分可视化界面的 Acticity,系统不会识别和运行任何未进行声明的 Activity。
android:exported
表示 Activity 是否可以被其他应用程序组件调用,true
表示可以被调用,false
表示不可以被调用。
1 |
|
要注意这关键的几行,这几行代表了当前应用的启动页 Activity 是 com.zj.wuaipojie.ui.MainActivity
,我们可以将其改成 com.zj.wuaipojie.ui.ChallengeThird
,这样就可以直接跳转到第三关 Activity 而不会去加载广告 Activity 了。
1 | <activity |
需要注意的是,一般不推荐这样修改 AndroidManifest.xml 文件,因为这样可能会导致应用无法正常启动,许多应用在启动的时候会预加载一些资源,如果强行修改跳转逻辑,可能会导致资源加载失败,从而导致应用崩溃。
方法三:修改广告 Activity 的调用逻辑
尝试一下搜索哪里调用了广告 com.zj.wuaipojie.ui.AdActivity
,将这个调用直接修改为调用主 Activity
同样用 MT 管理器搜索 com.zj.wuaipojie.ui.AdActivity
,长按搜索结果,选择复制
选择第四个 Lcom/zj/wuaipojie/ui/AdActivity;
这是广告 AdActivity 类的 smali 路径代码,通过搜索这个路径,可以找到调用这个类的地方
搜索 Lcom/zj/wuaipojie/ui/AdActivity;
,搜索类型选择代码,可以看到调用这个类的地方
可以看到 com.zj.wuaipojie.ui.Adapter
中调用了 com.zj.wuaipojie.ui.AdActivity
,转为 Java 代码
1 | // |
我们可以模仿其他几关的调用,不调用 AdActivity,而是直接调用 challengeThird
回到 smali 代码,将 Lcom/zj/wuaipojie/ui/AdActivity;
改为 Lcom/zj/wuaipojie/ui/ChallengeThird;
保存修改后的文件,重新打包安装包安装,启动示例程序,可以看到广告 Activity 被跳过,直接跳转到主 Activity。
弹窗广告&强制更新
首先对于强制更新弹窗,一般都是验证 AndroidMainfest.xml里的android:versionCode
和服务器上的版本号是否一致,如果不一致就会弹出强制更新的弹窗,我们可以通过修改 AndroidMainfest.xml里的android:versionCode
来跳过强制更新弹窗。
Hook弹窗
我们借助算法助手实现,首先在 Lsposed 中打开算法助手的作用域,
在算法助手中启用对应的程序
然后点击对应程序,选择启用弹窗定位(返回键可取消)与屏蔽关键词弹窗,关键词中记得加入广告
然后点击右上角启动,提示注入成功
进入第三关,可以看到弹窗被屏蔽了
弹窗代码修改
在算法助手中,查看程序的日志
可以看到弹窗的调用堆栈,可以看到调用的方法名为com.zj.wuaipojie.ui.ChallengeThird.onCreate
用 NP管理器 在 class.dex 中搜索方法名
定位到关键代码后,将用于显示两个弹窗的 .line 38
和.line 53
show 代码注释掉
1 | .method protected onCreate(Landroid/os/Bundle;)V |
横幅广告
去除横幅广告的关键在于定位到横幅广告的 View id
使用开发助手的布局查看工具,获取到横幅广告的 View id
0x7f0801ca
用 MT管理器的 XML搜索功能搜索 View id
在 xml 中搜索 0x7f0801ca
,可以将广告的宽度和高度修改成0
或则添加 android:visibility="gone"
隐藏广告