安卓逆向学习—解决APP界面广告以及系统弹窗问题

虚拟环境配置

基本工具:

1.雷电模拟器(记得把root权限打开)

2.Magisk Delta

注意:如果下载后安装失败,可能是System.vmdk出了问题,按照下图所选的选项就可以解决

记得安装选取第三种方式(安装至系统分区)即可(这个分区是专门为模拟器设置的区域)

记得将下图所示的选项勾上

3.将Zygisk-LSPosed导入Magisk Delta中的模块

将下载好的压缩包放入模拟器的共享文档,直接在模块中导入共享文档中的压缩包即可

便配置好了我们的基本工具,下面将开启安卓逆向的学习之路

本文运用的工具:

1.正己老师课程视频自带的demo课程操作文件(同步更新)

2.MT管理器和NP管理器

3.算法助手

4.雷电模拟器

5.jadx-gui

6.开发助手

安卓四大组件

组件描述
Activity(活动)在成用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表Activity组件启动,活动结束,代表一个Activity的生命周期结束,一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。
Service(服务)Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依映任何用户界面,例如后台播放音乐,后台下载文件等。
Broadcast Receiver(广播接收器)一个用于接收广播信息,并做出对应处理的组件,比如我们常见的系抗广播:通知时区改变、电量低、用户改变了语言递项等。
Content Provider(内容提供者)作为应用程序之可唯一的共享数据的途径,Content Provider主要的功能是储存并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数蛋都是使用Content Provider形式,供开发者调用(如视频,图片,通讯录等)

安卓启动广告界面流程及修改方式

启动Activity·>广告Activity.>主页Activity

修改方法:

1.修改加载时间

2.Acitivity切换定位,核改Intent的Activity类名

以教程文件为例

将apk文件放入我们的模拟器,然后打开可以看到里面带有一个广告界面

第一种方法:修改时间

打开MT管理器,启动activity记录,这便于我们快速锁定广告程序的位置

找到广告所在位置并复制程序路径

在class.dex文件里面进行查找索引

定位到下图代码界面,并将代码转化为java

锁定广告加载时间,并将其改为0,即可快速去除广告

但是上述方法的一个不足就是不能跳过广告加载流程,还是会将广告进程加载一遍(只不过很快肉眼看不见)

第二种方式:将广告加载流程切换成主页activity,绕过广告

查找其xml文件,找到下面代码

 android:theme="@7F1101D3"
        android:label="@7F10001B"
        android:icon="@7F0D000F"
        android:allowBackup="true"
        android:supportsRtl="true"
        android:extractNativeLibs="false"
        android:fullBackupContent="@7F130000"
        android:networkSecurityConfig="@7F130002"
        android:appComponentFactory="androidx.core.app.CoreComponentFactory"
        android:dataExtractionRules="@7F130001">
        <activity
            android:name="com.zj.wuaipojie.ui.ChallengeSixth"
            android:exported="false" />
        <activity
            android:name="com.zj.wuaipojie.ui.ChallengeFifth"
            android:exported="true" />
        <activity
            android:name="com.zj.wuaipojie.ui.ChallengeFourth"
            android:exported="true" />
        <activity
            android:name="com.zj.wuaipojie.ui.ChallengeThird"
            android:exported="false" />
        <activity
            android:name="com.zj.wuaipojie.ui.ChallengeSecond"
            android:exported="false" />
        <activity
            android:name="com.zj.wuaipojie.ui.AdActivity" />
        <activity
            android:label="@7F10001B"
            android:name="com.zj.wuaipojie.ui.MainActivity"
            android:exported="true">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.zj.wuaipojie.ui.ChallengeFirst" />
    </application>
</manifest>

可以发现其在进入第三关前插入了广告activity,即”com.zj.wuaipojie.ui.AdActivity” ,将其进行替换成”com.zj.wuaipojie.ui.ChallengeThird”修改保存文件即可绕过广告界面

但是一般不推荐这个方法,会让apk程序出bug闪退等问题

第三种方法:也是对Acitivity切换定位,核改Intent的Activity类名

优点:精确到代码的每一行每一串

前面流程同第一种方法一样,先在dex文件中查到广告的代码串

只不过对这一串代码更加精确到Lcom/zj/wuaipojie/ui/AdActivity;(类的一个smali路径代码)

要将搜索类型切换成代码,然后将范围锁定在下一个调用函数Adapter

然后将代码转换成java进行检索,找到关键代码,进行acticity切换

注意(java转换要用nt工具免费的)

转换后锁定如下代码:

private static final void m0onCreateViewHolder$lambda-0(ViewHolder viewHolder, View view) {
        int adapterPosition = viewHolder.getAdapterPosition();
        Intent intent;
        if (adapterPosition == 0) {
            intent = new Intent();
            intent.setClass(view.getContext(), ChallengeFirst.class);
            view.getContext().startActivity(intent);
        } else if (adapterPosition == 1) {
            intent = new Intent();
            intent.setClass(view.getContext(), ChallengeSecond.class);
            view.getContext().startActivity(intent);
        } else if (adapterPosition == 2) {
            intent = new Intent();
            intent.setClass(view.getContext(), AdActivity.class);
            view.getContext().startActivity(intent);
        } else if (adapterPosition == 3) {
            intent = new Intent();
            intent.setClass(view.getContext(), ChallengeFourth.class);
            view.getContext().startActivity(intent);
        } else if (adapterPosition == 4) {
            intent = new Intent();
            intent.setClass(view.getContext(), ChallengeFifth.class);
            view.getContext().startActivity(intent);
        } else if (adapterPosition == 5) {
            intent = new Intent();
            intent.setClass(view.getContext(), ChallengeSixth.class);
            view.getContext().startActivity(intent);
        }
    }

可以看到广告 AdActivity.class被嵌入了adapterPosition == 2,将其替换成ChallengeThird即可

将Lcom/zj/wuaipojie/ui/ChallengeThird对Lcom/zj/wuaipojie/ui/AdActivity进行切换即可

保存修改绕过广告

先介绍一下Activity的生命周期

函数名称描述
onCreat()一个Activity启动后第一个被调用的函数,常用来在此方法中进行Activity的一些初始化操作,例如创建View,绑定数据,注册监听,加级参数等。
onStart()当Activity显示在屏幕上时,此方法被调用但此时还无法进行与用户的交互换作。
onResume()这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于Activity栈顶,处于运行状态。
onPause()这个方法是在系统准备去启动成者恢复另外一个Activity的时候调用,通常在这个方法中执行一些释放资源的方法,以及保存一些关键数据。
onStop()这个方法是在Activity完全不可见的时候调用的。
onDestroy()这这个方法在Activity销毁之前调用,之后Activity的状态为销毁状态。
onRestart()当Activity从停止stop状态进入start状态时调用状态。

安卓启动弹窗界面流程及修改方式

先介绍一下弹窗定位及堆栈分析

修改方法:

1.修改xml中versioncode

2.Hook弹窗(推荐算法助手开启弹窗定位)

3.修改dex的弹窗代码

4.抓包修改响应(也可以路由器拦截)

具体实例分析

下面是对弹窗界面的绕过(不得不说这个广告弹窗叠叠乐真的恶心)

对于更新弹窗只需要将xml文件的versioncode的版本值由1改成2即可

第一个弹窗直接返回即可绕过

进入第二个弹窗

返回键被函数禁止了,这时候我们需要用到算法助手开启弹窗定位拦截

开启文件程序总开关

开启弹窗定位和屏蔽关键词弹窗,弹窗关键词写广告

然后点击应用即可

然后回到第二个弹窗定位,点击撤回,第二个弹窗即可被驳回(未嘉屏蔽关键词弹窗)

再把关键词屏蔽的弹窗的选项勾上看看效果

直接两个弹窗就一下子被去掉了

关于修改dex弹窗码

关闭弹窗关键字选项,点击应用,然后点开日志,找到dailog弹窗选项(有很多个选择最新那个)

可以看到其显示的一号弹窗内容

看到下面调用的堆栈

关于什么是堆栈可以理解为就是代码运行的逻辑顺序

然后看到栈顶的onCreate()内容信息

com.zj.wuaipojie.ui.ChallengeThird.onCreate

打开mt管理器,在dex文件中查找这串关键信息点,类型选择方法名

找到如下内容


.method protected onCreate(Landroid/os/Bundle;)V
    .registers 7

    .line 26
    invoke-super {p0, p1}, Landroidx/appcompat/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V

    const p1, 0x7f0b0021

    .line 27
    invoke-virtual {p0, p1}, Lcom/zj/wuaipojie/ui/ChallengeThird;->setContentView(I)V

    .line 28
    new-instance p1, Landroidx/appcompat/app/AlertDialog$Builder;

    move-object v0, p0

    check-cast v0, Landroid/content/Context;

    invoke-direct {p1, v0}, Landroidx/appcompat/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V

    const-string v1, "这是二号广告标题"

    .line 29
    check-cast v1, Ljava/lang/CharSequence;

    invoke-virtual {p1, v1}, Landroidx/appcompat/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroidx/appcompat/app/AlertDialog$Builder;

    const-string v1, "这是二号广告内容"

    .line 30
    check-cast v1, Ljava/lang/CharSequence;

    invoke-virtual {p1, v1}, Landroidx/appcompat/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroidx/appcompat/app/AlertDialog$Builder;

    const/4 v1, 0x0

    .line 31
    invoke-virtual {p1, v1}, Landroidx/appcompat/app/AlertDialog$Builder;->setCancelable(Z)Landroidx/appcompat/app/AlertDialog$Builder;

    const-string v1, "前往论坛"

    .line 32
    move-object v2, v1

    check-cast v2, Ljava/lang/CharSequence;

    new-instance v3, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda1;

    invoke-direct {v3, p0}, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda1;-><init>(Lcom/zj/wuaipojie/ui/ChallengeThird;)V

    invoke-virtual {p1, v2, v3}, Landroidx/appcompat/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroidx/appcompat/app/AlertDialog$Builder;

    const-string v2, "退出软件"

    .line 37
    move-object v3, v2

    check-cast v3, Ljava/lang/CharSequence;

    sget-object v4, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda2;->INSTANCE:Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda2;

    invoke-virtual {p1, v3, v4}, Landroidx/appcompat/app/AlertDialog$Builder;->setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroidx/appcompat/app/AlertDialog$Builder;

    .line 38
    invoke-virtual {p1}, Landroidx/appcompat/app/AlertDialog$Builder;->show()Landroidx/appcompat/app/AlertDialog;

    .line 40
    new-instance p1, Lcom/zj/wuaipojie/util/CommonDialog$Builder;

    invoke-direct {p1, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;-><init>(Landroid/content/Context;)V

    const-string v0, "一号广告弹窗已就位"

    .line 41
    invoke-virtual {p1, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->setMessage(Ljava/lang/String;)Lcom/zj/wuaipojie/util/CommonDialog$Builder;

    move-result-object p1

    .line 42
    sget-object v0, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda3;->INSTANCE:Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda3;

    invoke-virtual {p1, v2, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->setNegativeButton(Ljava/lang/String;Landroid/content/DialogInterface$OnClickListener;)Lcom/zj/wuaipojie/util/CommonDialog$Builder;

    move-result-object p1

    const/high16 v0, -0x1000000

    .line 45
    invoke-virtual {p1, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->setMessageColor(I)Lcom/zj/wuaipojie/util/CommonDialog$Builder;

    move-result-object p1

    .line 46
    new-instance v0, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda0;

    invoke-direct {v0, p0}, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda0;-><init>(Lcom/zj/wuaipojie/ui/ChallengeThird;)V

    invoke-virtual {p1, v1, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->setPositiveButton(Ljava/lang/String;Landroid/content/DialogInterface$OnClickListener;)Lcom/zj/wuaipojie/util/CommonDialog$Builder;

    move-result-object p1

    const v0, 0x3f4ccccd  # 0.8f

    .line 51
    invoke-virtual {p1, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->setWith(F)Lcom/zj/wuaipojie/util/CommonDialog$Builder;

    move-result-object p1

    .line 52
    invoke-virtual {p1}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->create()Lcom/zj/wuaipojie/util/CommonDialog;

    move-result-object p1

    .line 53
    invoke-virtual {p1}, Lcom/zj/wuaipojie/util/CommonDialog;->show()V

    .line 54
    invoke-direct {p0}, Lcom/zj/wuaipojie/ui/ChallengeThird;->checkUpdate()V

    return-void
.end method

分别在第一号弹窗和第二号弹窗的下面找到分别对应的show()方法,将show方法的那行代码进行注释

保存修改后的文件再进入程序就也可以跳过这两个弹窗显示界面

以上这三种方法都可以有效屏蔽更新以及广告弹窗,关键是要学会如何去定位相关的弹窗信息点,再去做修改

关于第四种方法:抓包修改响应体(也可以由路由器进行拦截)日后进行总结分析

弹窗除到现在就剩最后一个横幅广告的界面没有清除

这边需要用到一个新工具———开发助手

打开工具,主要是利用其布局查看的功能去抓包一些图片资源

打开追踪功能,回到图片,点开放大镜,将区域放在横幅信息上,查到其的地址ip

复制其ip:0x7f0801ca

然后在mt管理助手上进行xml搜索

找到其存在的一个xml文件

在里面具体定位搜索

有两种修改方式:

1.直接修改其长和宽高,都改成0dp,这样就能消除了

2.在长和宽高的代码下面加上如下一句代码

android:visibility="gone"

其的执行意思是把布局把它隐藏起来,从而也能达到想要的效果方式,就可以消除横幅了

至此,弹窗广告全家桶就被我们给全部去掉了

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇