安卓反汇编

工具

  • 教程Demo(更新)
  • MT管理器/NP管理器
  • 雷电模拟器
  • jadx-gui
  • 核心破解

jadx-gui

  • 先找到该工具的压缩包,然后解压缩,打开该应用软件

image-20240719100751812

  • 打开后,进入该界面,打开文件,选择教程demo,这样就可以使用IDEA反汇编apk文件。

image-20240719100844277

核心破解

  • 有核心破解就可以将签名不一致的apk程序进行覆盖安装

  • 先将核心破解拖入模拟器中,进行安装

image-20240719101222642

  • 安装完成后会出现如下情况,xxx未激活点击红色框框
image-20240719101253439
  • 会跳转到下图画面,然后点击启用模块系统框架,然后将模拟器重新启动
image-20240719101427390

JVM、Dalvik、ART介绍

  • JVM是JAVA虚拟机,运行JAVA字节码程序
  • Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable)
  • Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异

smali及其语法

  • smali是Dalvik的寄存器语言,smali代码是dex反编译而来的

关键字

名称 注释
.class 类名
.super 父类名,继承的上级类名名称
.source 源名
.field 变量
.method 方法名
.register 寄存器
.end method 方法名的结束
public 公有
protected 半公开,只有同一家人才能用
private 私有,只能自己使用
.parameter 方法参数
.prologue 方法开始
.line xxx 位于第xxx行

数据类型对应

smail类型 java类型 注释
V void 无返回值
Z boolean 布尔值类型,返回0或1
B byte 字节类型,返回字节
S short 短整数类型,返回数字
C char 字符类型,返回字符
I int 整数类型,返回数字
J long(64位需要2个寄存器存储) 长整数类型,返回数字
F float 单浮点类型,返回数字
D double 双浮点类型,返回数字
string String 文本类型,返回字符串
Lxxx/xxx/xxx object 对象类型,返回对象

常用指令

关键字 注释
const 重写整数属性,真假属性内容,只能是数字类型
const-string 重写字符串内容
const-wide 重写长整数类型,多用于修改到期时间。
return 返回指令
if-eq 全称equal(a=b),比较寄存器ab内容,相同则跳
if-ne 全称not equal(a!=b),ab内容不相同则跳
if-eqz 全称equal zero(a=0),z即是0的标记,a等于则跳
if-nez 全称not equal zero(a!=0),a不等于0则跳
if-ge 全称garden equal(a>=b),a大于或等于则跳
if-le 全称little equal(a<=b),a小于或等于则跳
goto 强制跳到指定位置
switch 分支跳转,一般会有多个分支线,并根据指令跳到适当位置
iget 获取寄存器数据
  • 其余指令可用语法工具查询

VIP终结者–实战

逆向apk程序

  • 先安装更新的demo,然后点击挑战2。获取硬币后进行一键三连,会出现需要大会员才能进行一键三连
image-20240719101933648
  • 然后打开jadx-gui,选择更新的demo,进行反编译,找到搜索位置

image-20240719102118083

  • 然后输入关键字大会员,会出现两个包含大会员的代码段,点击请充值大会员哦,找到关键语句

image-20240719102227675

  • 如果一开始没有搜到,可以修改一下设置,在首选项
image-20240719102441195
  • 然后将该选项取消勾选,就可以通过中文搜索到
image-20240719102536786
  • 点击了请充值大会员,就会跳转到这个,这个就是反编译后的java代码,记住红色框的Create$lambda2m457是反编译后的反混淆
image-20240719102846607
  • 点击如下位置查看smail代码
image-20240719102814972
  • 然后找到该位置,Create$lambda-2是一个方法名

image-20240719103024077

  • 然后对这个方法名的smail进行分析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//一个私有、静态、不可变的方法   方法名
.method private static final onCreate$lambda-2(Lkotlin/jvm/internal/Ref$IntRef;Lcom/zj/wuaipojie/ui/ChallengeSecond;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/view/View;)Z //(这里面是方法的参数)这里是方法返回值类型,表示布尔值类型,返回假或真
.registers 7 //寄存器数量

.line 33 //代码所在的行数
iget p0, p0, Lkotlin/jvm/internal/Ref$IntRef;->element:I //读取p0(第一个参数,参考寄存器知识)中element的值赋值给p0

const/4 p5, 0x1 //p5赋值1

const/16 v0, 0xa //v0赋值10,在16进制里a表示10

if-ge p0, v0, :cond_15 //判断p0的值是否大于或等于v0的值(即p0的值是否大于或等于10),如果大于或等于则跳转到:cond_15

.line 34 //以下是常见的Toast弹窗代码
check-cast p1, Landroid/content/Context; //检查Context对象引用

const-string p0, "请先获取10个硬币哦" //弹窗文本信息,把""里的字符串数据赋值给p0

check-cast p0, Ljava/lang/CharSequence; //检查CharSequence对象引用

invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
//将弹窗文本、显示时间等信息传给p1

move-result-object p0 //结果传递给p0

invoke-virtual {p0}, Landroid/widget/Toast;->show()V //当看到这个Toast;->show你就应该反应过来这里是弹窗代码

goto :goto_31 //跳转到:goto_31

:cond_15 //跳转的一个地址

invoke-virtual {p1}, Lcom/zj/wuaipojie/ui/ChallengeSecond;->isvip()Z //判断isvip方法的返回值是否为真(即结果是否为1)

move-result p0 //结果赋值给p0

if-eqz p0, :cond_43 //如果结果为0则跳转cond_43地址

const p0, 0x7f0d0018 //在arsc中的id索引,这个值可以进行查询

.line 37
invoke-virtual {p2, p0}, Landroid/widget/ImageView;->setImageResource(I)V //设置图片资源

const p0, 0x7f0d0008

.line 38
invoke-virtual {p3, p0}, Landroid/widget/ImageView;->setImageResource(I)V

const p0, 0x7f0d000a

.line 39
invoke-virtual {p4, p0}, Landroid/widget/ImageView;->setImageResource(I)V

.line 40
sget-object p0, Lcom/zj/wuaipojie/util/SPUtils;->INSTANCE:Lcom/zj/wuaipojie/util/SPUtils;

check-cast p1, Landroid/content/Context;

const/4 p2, 0x2 //p2赋值2

const-string p3, "level" //sp的索引

invoke-virtual {p0, p1, p3, p2}, Lcom/zj/wuaipojie/util/SPUtils;->saveInt(Landroid/content/Context;Ljava/lang/String;I)V //写入数据

goto :goto_50 //跳转地址

:cond_43

check-cast p1, Landroid/content/Context;

const-string p0, "\u8bf7\u5148\u5145\u503c\u5927\u4f1a\u5458\u54e6\uff01" //请先充值大会员哦!

check-cast p0, Ljava/lang/CharSequence;

invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

move-result-object p0

invoke-virtual {p0}, Landroid/widget/Toast;->show()V

:goto_50
return p5 //返回p5的值
.end method //方法结束

//判断是否是大会员的方法
.method public final isvip()Z
.registers 2

const/4 v0, 0x0 //v0赋值0

return v0 //返回v0的值

.end method
  • 然后解读反编译后的java代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public static final boolean m457onCreate$lambda2(Ref.IntRef intRef, ChallengeSecond challengeSecond, ImageView imageView, ImageView imageView2, ImageView imageView3, View view) {
if (intRef.element < 10) { //判断硬币的数量是否小于0
Toast.makeText(challengeSecond, "请先获取10个硬币哦", 1).show();
}
if (challengeSecond.isvip()) { // 判断是否是vip
ChallengeSecond challengeSecond2 = challengeSecond;
Toast.makeText(challengeSecond2, "当前已经是大会员了哦!", 1).show(); //提示当前已是大会员
imageView.setImageResource(R.mipmap.zan_active); // 然后替换图片
imageView2.setImageResource(R.mipmap.coin_active); // 替换图片
imageView3.setImageResource(R.mipmap.collect_active);// 替换图片
SPUtils.INSTANCE.saveInt(challengeSecond2, "level", 2); //
} else {
Toast.makeText(challengeSecond, "请先充值大会员哦!", 1).show(); // 如果不是会员就会弹出该句
}
return true;
}
}

修改smail代码

  • 在修改smail代码先要掌握下图方法,如何定位到需要修改的代码位置如何进行修改
  • 快速定位在之后还有一些方法,之后再进行介绍

image-20240719104116576

  • 先对程序逻辑分析
1
2
3
4
5
6
7
8
9
10
11
    0039037e: 3501 1000               0005: if-ge               p0, v0, :cond_0015
.line 34
00390382: 0721 0007: move-object p0, p1
00390384: 1f01 6300 0008: check-cast p0, Landroid/content/Context; # type@0063
00390388: 1a00 09ed 000a: const-string v0, "请先获取10个硬币哦" # string@ed09
0039038c: 1f00 e514 000c: check-cast v0, Ljava/lang/CharSequence; # type@14e5
00390390: 7130 ae11 0106 000e: invoke-static {p0, v0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;, Ljava/lang/CharSequence;, I)Landroid/widget/Toast; # method@11ae
00390396: 0c01 0011: move-result-object p0
00390398: 6e10 af11 0100 0012: invoke-virtual {p0}, Landroid/widget/Toast;->show()V # method@11af

// 这一段的逻辑是提示你要先获取10个硬币,所以我们不应该跳转到该位置,这就要对第一行代码语句进行修改
  • 再看看isvip这个逻辑判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                            cond_0015:
0039039e: 6e10 c39c 0200 0015: invoke-virtual {p1}, Lcom/zj/wuaipojie/ui/ChallengeSecond;->isvip()Z # method@9cc3
003903a4: 0a01 0018: move-result p0
003903a6: 3801 2a00 0019: if-eqz p0, :cond_0043
// 如果不是会员就会跳转到cond_0043这个代码段中
// 如果要修改逻辑,就不能让0019: if-eqz p0, :cond_0043,这个语句跳转到cond_0043
// 所以要修改该位置
cond_0043:
003903fa: 1f02 6300 0043: check-cast p1, Landroid/content/Context; # type@0063
003903fe: 1a01 07ed 0045: const-string p0, "请先充值大会员哦!" # string@ed07
00390402: 1f01 e514 0047: check-cast p0, Ljava/lang/CharSequence; # type@14e5
00390406: 7130 ae11 1206 0049: invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;, Ljava/lang/CharSequence;, I)Landroid/widget/Toast; # method@11ae
0039040c: 0c01 004c: move-result-object p0
0039040e: 6e10 af11 0100 004d: invoke-virtual {p0}, Landroid/widget/Toast;->show()V # method@11af
goto_0050:
00390414: 0f06 0050: return p5

  • 现在要对该汇编代码进行修改,由于jadx-gui是静态分析的,不能对反汇编代码进行修改,所以使用MT管理器进行修改

搜索关键字

  • 打开MT管理器,然后提取安装包,然后定位,查看apk文件
image-20240719105137894
  • 然后点击classes.dex文件,选择此方式打开
image-20240719105337399
  • 然后进行搜索,搜索内容如下,搜索到后点击进去
image-20240719105440968 image-20240719105522343

抓取按钮id

  • 这个方法也可以定位到相应的汇编代码,之前定位到硬币那边的这一步就不需要操作了

  • 打开开发者模式,然后进入示例程序中的挑战2,然后进行界面资源分析,点击一键三连,然后点击id-Hex,并复制

image-20240719111439547
  • 然后勾选上十六进制再去搜索
image-20240719111633414
  • 然后再点击进去,上下寻找,就会找到这个位置
image-20240719111721496 image-20240719111734230

修改判断

  • 找到判断的代码,图中是≥0跳转,所以我们应该修改成≤0跳转,即把ge该为le
image-20240719105617859
  • 然后再找到判断是不是vip的汇编语句,将这段代码注释掉,前面加一个#号,然后保存,签名,再安装一下
image-20240719105839055 image-20240719105918258
  • 然后就完成了修改
image-20240719110024417

修改寄存器

  • 也可以通过修改寄存器的值来达到跳过判断逻辑的目的
  • 先把刚刚修改过的apk应用删除,然后点击备份文件,修改备份
image-20240719110323074
  • 修改这个位置,将原来的0xa修改为0x0然后就得到如下所示
image-20240719110516896
  • 然后下滑到isvip这边,长按,之后点击跳转
image-20240719110616822
  • 要让vip是真的,就把0改为1
image-20240719110731600
  • 这样也能进行一键三连
image-20240719110847429

安卓弹窗与广告

工具

  • 教程Demo(更新)

  • MT管理器/NP管理器

  • 算法助手

  • 雷电模拟器

  • jadx-gui

  • 开发助手

  • 将算法助手拖入雷电模拟器安装,安装完后会出现这个提示,点击这个提示

image-20240719154120760

  • 点击启用模块,然后下滑,该应用勾选起来,然后重启算法助手即可,这个只是安装工具,具体使用在弹窗修改这边

image-20240719154245395

image-20240719154311431

  • 之前使用的开发助手,有些图片抓不到,所以现在换一个开发助手,直接拖入模拟器安装就行,主要使用的是布局查看,第一次使用要开启无障碍模式

image-20240719162840587

广告类型

  • 比较常见的广告
    • 启动广告:出现在软件刚启动的时候
    • 更新广告:弹窗广告,一些软件会开启强制更新
    • 横幅广告:在页面的最底部或者最中间

image-20240719121719899

  • 还有一些广告类型:插屏广告、悬浮广告、原生广告、视频广告

安卓四大组件

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

Activity与广告、弹窗

Activity的切换

  • 启动广告的流程:启动Activity---->广告Activity----->主页Activity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!---声明实现应用部分可视化界面的 Activity,必须使用 AndroidManifest 中的 <activity> 元素表示所有 Activity。系统不会识别和运行任何未进行声明的Activity。----->
<activity
android:label="@string/app_name"
android:name="com.zj.wuaipojie.ui.MainActivity"
android:exported="true"> <!--当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动-->
<!---指明这个activity可以以什么样的意图(intent)启动--->
<intent-filter>
<!--表示activity作为一个什么动作启动,android.intent.action.MAIN表示作为主activity启动--->
<action
android:name="android.intent.action.MAIN" />
<!--这是action元素的额外类别信息,android.intent.category.LAUNCHER表示这个activity为当前应用程序优先级最高的Activity-->
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.zj.wuaipojie.ui.ChallengeFirst" />
<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切换定位法

  • 除了前面使用字符串和使用十六进制进行定位,现在还提供了一个切换定位法进行快速定位

  • 先打开MT管理器,然后点开该位置,点击Activity记录,然后启动服务

image-20240719123743975
  • 然后启动Activity记录,开启即可(第一次使用该功能才需要在设置中给如下权限)
image-20240719124117130 image-20240719124127867
  • 完成操作后,再回到MT管理器,开启Activity记录,直到左上角出现如下界面
image-20240719124354967
  • 然后先将后台正在运行的demo关闭,然后重新点击示例程序,点击挑战3,然后Activity记录就会记录下我们所跳转到的Activity中
image-20240719124529718
  • 然后再回到MT管理器中,回到开启Activity记录的那个位置,点击后即可看到Activity记录,然后找到刚刚广告的那个Activity记录,单机复制
image-20240719124819837
  • 提取安装包,然后查看apk文件,继续使用Dex编辑器++ 打开classes.dex,使用搜索功能,按照下图搜索
image-20240719125151878
  • 然后点击该搜索结果

image-20240719125221340

  • 由于MP的将AdActivity转换为Java代码需要vip,所以将转而使用NP管理器。找到这个文件夹

image-20240719125431233

  • 查看apk文件,使用DEX编辑PLUS打开classes.dex,然后再搜索com.zj.wuaipojie.ui.AdActivity,搜索方式与上面一致,然后点击下图红框,再点击转化为Java代码

image-20240719125733612

image-20240719125802928

跳过广告1–修改smail代码

  • 修改方法:

    • 修改加载时间,将加载时间修改为0秒,这样就可以跳过广告时间了
    • Activity切换定位,修改Intent的Activity类名
  • 在快速定位到广告的Activity并转为JAVA代码,后先查看代码,发现这边红框要经过三秒(3000毫秒)的读秒才能进入广告,直接改为0秒,这样就会快速的执行完广告,但是肉眼看不到(这样就可以当做跳过了广告)

image-20240719141149684

  • 返回到smail代码,找到JAVA代码对应的smail代码,将0xbb8修改为0x0

image-20240719141518900

  • 这样就可以修改为0秒了,由于demo原因,出现非预期,该0秒是广告加载的秒数,也就是说修改成0秒后,广告会在开启第三关挑战的时候马上弹出来

image-20240719141614339

跳过广告2–修改类名

  • Activity切换定位,修改Intent的Activity类名

  • 先在Activity切换中了解到一些关于Activity的代码

  • 然后进行如下修改

  • 使用MT管理器,提取包,查看apk文件,然后查看xml文件,找到第三关的这个,并复制

image-20240719145249880
  • 然后将下图红框替换成第三关的路径

image-20240719145339194

  • 这里会直接跳转到广告界面,而且没有更新提示(可能是网络问题)
image-20240719145629144
  • 使用这个方法除了对xml文件进行修改之外,还可以更准确的定位到程序是在哪处代码来进行切换Activity,然后对切换处进行修改,即可跳过广告,这种方法相比于直接在xml文件里面修改会稳妥的多
  • 先搜索com.zj.wuaipojie.ui.AdActivity,然后搜索到后长按该文件处,复制Lcom/zj/wuaipojie/ui/AdActivity;(可能长按后复制功能显示不出来)
image-20240719150604311
  • 然后继续搜索
image-20240719150705315
  • 然后排除,得到具体实现广告跳转的代码所处位置

image-20240719150809138

  • 找到该位置

image-20240719150833973

对应的反编译java代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
switch (position) {  
case 0:
Intent intent = new Intent();
intent.setClass(it.getContext(), ChallengeFirst.class);
it.getContext().startActivity(intent);
return;
case 1:
Intent intent2 = new Intent();
intent2.setClass(it.getContext(), ChallengeSecond.class);
it.getContext().startActivity(intent2);
return;
case 2:
Intent intent3 = new Intent(); //new一个Intent,
intent3.setClass(it.getContext(), AdActivity.class); //传入要切换的Acitivity的类名
it.getContext().startActivity(intent3); //启动对应的Activity
return;
// 修改思路:将传入的Activity类名修改为其他的
case 3:
Intent intent4 = new Intent();
intent4.setClass(it.getContext(), ChallengeFourth.class);
it.getContext().startActivity(intent4);
return;
default:
return;
}

  • 所以就将该段字符复制下来

image-20240719151313881

  • 将下图红框字符替换掉,这里我替换成了 Lcom/zj/wuaipojie/ui/ChallengeThird;

image-20240719151345230

  • 然后保存、退出,进行签名

Activity生命周期

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

image-20240719152542010

  • 这边就是一个onCreate的方法
image-20240719152730721

跳过广告3–弹窗修改

  • 弹窗定位和堆栈分析
    • 修改方法
      • 修改xml中的versioncode
      • Hook弹窗(推荐算法动手开启弹窗定位)
      • 修改dex弹窗代码
      • 抓包修改响应体(也可以路由器拦截)

xml修改

  • 通过修改xml中的versioncode跳过更新弹窗
  • 先提取apk文件,查看apk,点击xml代码,注意到versionCode="1"将其修改成2

image-20240719153336250

image-20240719153401555

  • 然后进行保存、再进行签名,这里会出现闪退,而且示例demo应用从一开始就没有出现更新弹窗,所以问了AI。说明对方把服务器关闭了,不会自动检查更新了,就没有更新弹窗。这个可能也是造成闪退的原因

image-20240719153853206

hook修改

  • 打开算法助手,点击示例程序,打开应用总开关,然后下滑,继续将弹窗定位打开

image-20240719154555296

image-20240719154623781

  • 再点击右上角的启动图标,但是还是没有出现预期情况,返回键还是被劫持了,这里可能的原因是我用的是没有经过前面的修改,导致一打开应用程序没有直接跳转到第三关

image-20240719154648168

修改dex弹窗代码

  • 先将算法助手的屏蔽关键词关闭

image-20240719161105420

  • 然后打开demo应用

image-20240719154648168

  • 然后查看算法助手的日志,我这边的算法日志没有弹窗,正常应该是会有弹窗的
image-20240719161217325

image-20240719161259069

  • 然后点击最新的一个日志

image-20240719161547487

  • 复制选中的代码com.zj.wuaipojie.ui.ChallengeThird.onCreate

image-20240719161659327

  • 回到MT管理器,然后提取安装包,查看apk,使用dex++查看dex代码,使用搜索功能

image-20240719161859278

  • 然后点击下图的搜索结果

image-20240719161923159

  • 找到广告所在的代码行数
image-20240719162040261

image-20240719162057304

  • 然后找到最后的show方法,将show方法所在的这一段代码给注释掉

image-20240719162203841

image-20240719162213435

  • 注释后1号弹窗就没有了

image-20240719162304391

  • 再次寻找二号广告的show,并注释

image-20240719162420883

  • 现在二号广告也没有了
image-20240719162545378

抓包修改响应体

  • 这个之后再说

跳过广告4–横幅广告

  • 先使用开发助手进行布局查看,点击下图红框

image-20240719163045972

  • 然后找到id
image-20240719163121904
  • 使用MT管理器,查看apk后使用xml搜索
image-20240719163245001 image-20240719163333605
  • 找到相关文件后反编译,定位到如下位置

image-20240719163535709

  • 将宽度和高度都修改成0
image-20240719163634179
  • 然后保存、签名、安装,打开后就没有广告了
image-20240719163722710

第二种跳过横幅广告的方法

  • 先删除修改后的apk文件,恢复没有修改横幅广告之前的apk文件,然后查看,继续xml搜索,搜索刚刚搜索的内容,然后反编译
  • 找到该位置,添加一行代码android:visibility="gone"

image-20240719164058257

  • 然后老样子完,再进行安装,这样也可以隐藏横幅广告
image-20240719164200848