安卓逆向2
安卓反汇编
工具
- 教程Demo(更新)
- MT管理器/NP管理器
- 雷电模拟器
- jadx-gui
- 核心破解
jadx-gui
- 先找到该工具的压缩包,然后解压缩,打开该应用软件
- 打开后,进入该界面,打开文件,选择教程demo,这样就可以使用IDEA反汇编apk文件。
核心破解
-
有核心破解就可以将签名不一致的apk程序进行覆盖安装
-
先将核心破解拖入模拟器中,进行安装
- 安装完成后会出现如下情况,
xxx未激活
点击红色框框
- 会跳转到下图画面,然后点击
启用模块
和系统框架
,然后将模拟器重新启动
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。获取硬币后进行一键三连,会出现需要大会员才能进行一键三连
- 然后打开
jadx-gui
,选择更新的demo,进行反编译,找到搜索位置
- 然后输入关键字
大会员
,会出现两个包含大会员的代码段,点击请充值大会员哦
,找到关键语句
- 如果一开始没有搜到,可以修改一下设置,在
首选项
- 然后将该选项取消勾选,就可以通过中文搜索到
- 点击了
请充值大会员
,就会跳转到这个,这个就是反编译后的java代码,记住红色框的Create$lambda2
,m457
是反编译后的反混淆
- 点击如下位置查看
smail
代码
- 然后找到该位置,
Create$lambda-2
是一个方法名
- 然后对这个方法名的
smail
进行分析
1 | //一个私有、静态、不可变的方法 方法名 |
- 然后解读反编译后的java代码
1 | public static final boolean m457onCreate$lambda2(Ref.IntRef intRef, ChallengeSecond challengeSecond, ImageView imageView, ImageView imageView2, ImageView imageView3, View view) { |
修改smail代码
- 在修改
smail
代码先要掌握下图方法,如何定位到需要修改的代码位置
和如何进行修改
、 - 快速定位在之后还有一些方法,之后再进行介绍
- 先对程序逻辑分析
1 | 0039037e: 3501 1000 0005: if-ge p0, v0, :cond_0015 |
- 再看看isvip这个逻辑判断
1 | cond_0015: |
- 现在要对该汇编代码进行修改,由于
jadx-gui
是静态分析的,不能对反汇编代码进行修改,所以使用MT管理器进行修改
搜索关键字
- 打开MT管理器,然后提取安装包,然后定位,查看apk文件
- 然后点击
classes.dex
文件,选择此方式打开
- 然后进行搜索,搜索内容如下,搜索到后点击进去
抓取按钮id
-
这个方法也可以定位到相应的汇编代码,之前定位到硬币那边的这一步就不需要操作了
-
打开开发者模式,然后进入示例程序中的挑战2,然后进行界面资源分析,点击一键三连,然后点击id-Hex,并复制
- 然后勾选上十六进制再去搜索
- 然后再点击进去,上下寻找,就会找到这个位置
修改判断
- 找到判断的代码,图中是
≥0跳转
,所以我们应该修改成≤0跳转
,即把ge该为le
- 然后再找到判断是不是vip的汇编语句,将这段代码注释掉,前面加一个
#
号,然后保存,签名,再安装一下
- 然后就完成了修改
修改寄存器
- 也可以通过修改寄存器的值来达到跳过判断逻辑的目的
- 先把刚刚修改过的apk应用删除,然后点击备份文件,修改备份
- 修改这个位置,将原来的
0xa
修改为0x0
然后就得到如下所示
- 然后下滑到isvip这边,长按,之后点击跳转
- 要让vip是真的,就把0改为1
- 这样也能进行一键三连
安卓弹窗与广告
工具
-
教程Demo(更新)
-
MT管理器/NP管理器
-
算法助手
-
雷电模拟器
-
jadx-gui
-
开发助手
-
将算法助手拖入雷电模拟器安装,安装完后会出现这个提示,点击这个提示
- 点击启用模块,然后下滑,该应用勾选起来,然后重启算法助手即可,这个只是安装工具,具体使用在弹窗修改这边
- 之前使用的开发助手,有些图片抓不到,所以现在换一个开发助手,直接拖入模拟器安装就行,主要使用的是布局查看,第一次使用要开启无障碍模式
广告类型
- 比较常见的广告
- 启动广告:出现在软件刚启动的时候
- 更新广告:弹窗广告,一些软件会开启强制更新
- 横幅广告:在页面的最底部或者最中间
- 还有一些广告类型:插屏广告、悬浮广告、原生广告、视频广告
安卓四大组件
组件 | 描述 |
---|---|
Activity(活动) | 在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表Activity组件活动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理 |
Service(服务) | Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等 |
Broadcast Receiver(广播接收器) | 一个用于接收广播信息,并做出对应处理的组件。比如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等 |
Content Provider(内容提供者) | 作为应用程序之间唯一的共享数据的途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频,音频,图片,通讯录等) |
Activity与广告、弹窗
Activity的切换
- 启动广告的流程:启动Activity---->广告Activity----->主页Activity
1 | <!---声明实现应用部分可视化界面的 Activity,必须使用 AndroidManifest 中的 <activity> 元素表示所有 Activity。系统不会识别和运行任何未进行声明的Activity。-----> |
快速定位–Activity切换定位法
-
除了前面使用字符串和使用十六进制进行定位,现在还提供了一个切换定位法进行快速定位
-
先打开MT管理器,然后点开该位置,点击
Activity记录
,然后启动服务
- 然后启动
Activity记录
,开启即可(第一次使用该功能才需要在设置中给如下权限)
- 完成操作后,再回到MT管理器,开启Activity记录,直到左上角出现如下界面
- 然后先将后台正在运行的demo关闭,然后重新点击示例程序,点击挑战3,然后
Activity记录
就会记录下我们所跳转到的Activity中
- 然后再回到MT管理器中,回到开启Activity记录的那个位置,点击后即可看到Activity记录,然后找到刚刚广告的那个Activity记录,单机复制
- 提取安装包,然后查看apk文件,继续使用
Dex编辑器++
打开classes.dex
,使用搜索功能,按照下图搜索
- 然后点击该搜索结果
- 由于MP的将AdActivity转换为Java代码需要vip,所以将转而使用NP管理器。找到这个文件夹
- 查看apk文件,使用
DEX编辑PLUS
打开classes.dex
,然后再搜索com.zj.wuaipojie.ui.AdActivity
,搜索方式与上面一致,然后点击下图红框,再点击转化为Java代码
跳过广告1–修改smail代码
-
修改方法:
- 修改加载时间,将加载时间修改为0秒,这样就可以跳过广告时间了
- Activity切换定位,修改Intent的Activity类名
-
在快速定位到广告的
Activity
并转为JAVA代码,后先查看代码,发现这边红框要经过三秒(3000毫秒)的读秒才能进入广告,直接改为0秒,这样就会快速的执行完广告,但是肉眼看不到(这样就可以当做跳过了广告)
- 返回到
smail
代码,找到JAVA代码对应的smail
代码,将0xbb8
修改为0x0
- 这样就可以修改为0秒了,由于demo原因,出现非预期,该0秒是广告加载的秒数,也就是说修改成0秒后,广告会在开启第三关挑战的时候马上弹出来
跳过广告2–修改类名
-
Activity切换定位,修改Intent的Activity类名
-
先在
Activity切换
中了解到一些关于Activity的代码 -
然后进行如下修改
-
使用MT管理器,提取包,查看apk文件,然后查看xml文件,找到第三关的这个,并复制
- 然后将下图红框替换成第三关的路径
- 这里会直接跳转到广告界面,而且没有更新提示(可能是网络问题)
- 使用这个方法除了对xml文件进行修改之外,还可以更准确的定位到程序是在哪处代码来进行切换Activity,然后对切换处进行修改,即可跳过广告,这种方法相比于直接在xml文件里面修改会稳妥的多
- 先搜索
com.zj.wuaipojie.ui.AdActivity
,然后搜索到后长按该文件处,复制Lcom/zj/wuaipojie/ui/AdActivity;
(可能长按后复制功能显示不出来)
- 然后继续搜索
- 然后排除,得到具体实现广告跳转的代码所处位置
- 找到该位置
对应的反编译java代码如下
1 | switch (position) { |
- 所以就将该段字符复制下来
- 将下图红框字符替换掉,这里我替换成了
Lcom/zj/wuaipojie/ui/ChallengeThird;
- 然后保存、退出,进行签名
Activity生命周期
函数名称 | 描述 |
---|---|
onCreat() | 一个Activity启动后第一个被调用的函数,常数来此方法中进行Activity的一些初始化操作。例如创建View,绑定数据,注册监听,加载参数等。 |
onStart() | 当Activity显示在屏幕上,此方法被调用但此时无法进行与用户的交互操作 |
onResume() | 这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于栈顶,处于运行转态 |
onPause() | 这个方法是在系统准备去启动或者恢复另外一个Activity的时候调用,通常在这个方法中执行一些释放资源的方法,以及保存一些关键数据 |
onStop | 这个方法是在Activity完全不可见的时候调用的 |
onDestroy | 这个方法在Activity销毁之前调用,之后Activity的状态为销毁状态 |
onRestart | 当Activity从停止stop状态会进入start状态时调用状态 |
- 这边就是一个onCreate的方法
跳过广告3–弹窗修改
- 弹窗定位和堆栈分析
- 修改方法
- 修改xml中的versioncode
- Hook弹窗(推荐算法动手开启弹窗定位)
- 修改dex弹窗代码
- 抓包修改响应体(也可以路由器拦截)
- 修改方法
xml修改
- 通过修改xml中的versioncode跳过更新弹窗
- 先提取apk文件,查看apk,点击xml代码,注意到
versionCode="1"
将其修改成2
- 然后进行保存、再进行签名,这里会出现闪退,而且示例demo应用从一开始就没有出现更新弹窗,所以问了AI。说明对方把服务器关闭了,不会自动检查更新了,就没有更新弹窗。这个可能也是造成闪退的原因
hook修改
- 打开算法助手,点击示例程序,打开应用总开关,然后下滑,继续将弹窗定位打开
- 再点击右上角的启动图标,但是还是没有出现预期情况,返回键还是被劫持了,这里可能的原因是我用的是没有经过前面的修改,导致一打开应用程序没有直接跳转到第三关
修改dex弹窗代码
- 先将算法助手的屏蔽关键词关闭
- 然后打开demo应用
- 然后查看算法助手的日志,我这边的算法日志没有弹窗,正常应该是会有弹窗的
- 然后点击最新的一个日志
- 复制选中的代码
com.zj.wuaipojie.ui.ChallengeThird.onCreate
- 回到MT管理器,然后提取安装包,查看apk,使用dex++查看dex代码,使用搜索功能
- 然后点击下图的搜索结果
- 找到广告所在的代码行数
- 然后找到最后的show方法,将show方法所在的这一段代码给注释掉
- 注释后1号弹窗就没有了
- 再次寻找二号广告的show,并注释
- 现在二号广告也没有了
抓包修改响应体
- 这个之后再说
跳过广告4–横幅广告
- 先使用开发助手进行布局查看,点击下图红框
- 然后找到id
- 使用MT管理器,查看apk后使用xml搜索
- 找到相关文件后反编译,定位到如下位置
- 将宽度和高度都修改成0
- 然后保存、签名、安装,打开后就没有广告了
第二种跳过横幅广告的方法
- 先删除修改后的apk文件,恢复没有修改横幅广告之前的apk文件,然后查看,继续xml搜索,搜索刚刚搜索的内容,然后反编译
- 找到该位置,添加一行代码
android:visibility="gone"
- 然后老样子完,再进行安装,这样也可以隐藏横幅广告
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!
评论