这篇文章上次修改于 1346 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
title: 去APP强制升级弹窗
date: 2020/09/05 18:27:47
updated: 2020/09/05 18:27:47
permalink: remove-force-upgrade-dialog/
toc: true
环境和工具
- kali linux 2019.4
- frida-server 12.11.14
- Android Studio 4.0.1 (android-studio-ide-193.6626763-linux.tar.gz)
- apktool
- objection
- wallbreaker
步骤
脱壳
objection -g com.hello.qqc explore
plugin load /root/.objection/plugins/dexdump/frida_dexdump
plugin dexdump dump
脱壳结果如图
可以看到有很多dex,但其中很多都是需要排除的,通过过滤MainActivity
查找有入口的dex
grep -ril "MainActivity"
通过jadx-gui挨个查看,确认只有0xcb696000.dex是需要的
这个不是需要的
这个是需要的
继续分析,最终留下4个dex
分析是不是需要的还可以从主dex中的导入情况来看
例如有一个dex里面是umeng的东西,然后一搜索被导入使用了,那肯定是需要的dex
defpackage这种是没有类名的包,一般不是需要的
解包+重打包
apktool -s选项不会把dex转到smali
apktool -s d apk名
然后删除解包文件夹里的classes.dex
将得到的4个dex放进来,并按从大到小按classes.dex、classes2.dex、classes3.dex ...这样的规律命名
然后就可以打包签名了
apktool b 解包文件夹名
jarsigner -verbose -keystore abc.keystore -signedjar newsigned.apk new.apk abc.keystore
验证APP正常运行
安装签名后APP打开看看有没有正常运行,正常运行说明脱壳没问题
分析弹窗
类似于前面一篇去弹窗的方法
https://blog.seeflower.dev/remove-upgrade-dialog-and-rebuild-apk/
既然是弹窗,那就从android.app.Dialog
查找吧!
objection -g com.hello.qqc explore --startup-command "android hooking watch class android.app.Dialog"
黄线后面部分是点击了立即升级的部分
分析黄线前后部分,可以看到一些关键的方法,show,onCreate等
但结合点击过程的现象:升级框之外的部分不能点击,返回也没有用
注意到setCancelable和setCanceledOnTouchOutside,其中setCanceledOnTouchOutside)是设置对话框外是否可以执行返回按钮的
这个时候大致能确定弹窗的相关动作就在这附近了
尝试观察一些可疑的方法
objection -g com.hello.qqc explore --startup-command "android hooking watch class_method android.app.Dialog.onCreate --dump-args --dump-backtrace --dump-return"
objection -g com.hello.qqc explore --startup-command "android hooking watch class_method android.app.Dialog.onStart --dump-args --dump-backtrace --dump-return"
objection -g com.hello.qqc explore --startup-command "android hooking watch class_method android.app.Dialog.show --dump-args --dump-backtrace --dump-return"
objection -g com.hello.qqc explore --startup-command "android hooking watch class_method android.app.Dialog.getWindow --dump-args --dump-backtrace --dump-return"
objection -g com.hello.qqc explore --startup-command "android hooking watch class_method android.app.Dialog.setCancelable --dump-args --dump-backtrace --dump-return"
cn.net.tokyo.ccg.ui.fragment.dialog.UpdateDialogFragment.onCreateDialog
看起来就是这里触发的强制升级弹窗,UpdateDialogFragment中的Update看起来也和升级有关系
objection -g com.hello.qqc explore --startup-command "android hooking watch class cn.net.tokyo.ccg.ui.fragment.dialog.UpdateDialogFragment"
从名字上看cn.net.tokyo.ccg.bean.VersionBean$Version
是一个版本有关的东西
然后调用了onCreateDialog进行了弹窗,现在弹窗还在,那么传入的这个版本相关的对象应该还在
尝试搜索一有没有该类型的对象,然后查看下属性
android heap search instances cn.net.tokyo.ccg.bean.VersionBean$Version
android heap print fields 126887844
没错了,就是它!
去除弹窗
查看下反编译代码,再次确认弹窗逻辑就在这里
再追踪一下cn.net.tokyo.ccg.ui.fragment.dialog.UpdateDialogFragment.b
这个方法,看看在哪儿调用的
objection -g com.hello.qqc explore --startup-command "android hooking watch class_method cn.net.tokyo.ccg.ui.fragment.dialog.UpdateDialogFragment.b --dump-args --dump-backtrace --dump-return"
没错就是cn.net.tokyo.ccg.ui.activity.MainActivity.a
这下怎么修改以去除弹窗就显而易见了
直接删除图中的代码!
没有评论