这篇文章上次修改于 1365 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

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"

有MainActivity的dex

通过jadx-gui挨个查看,确认只有0xcb696000.dex是需要的

这个不是需要的

不需要的dex

这个是需要的

需要的dex

继续分析,最终留下4个dex

分析是不是需要的还可以从主dex中的导入情况来看
例如有一个dex里面是umeng的东西,然后一搜索被导入使用了,那肯定是需要的dex

有umeng的dex
主dex用到了umeng

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"

观察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"

android.app.Dialog.onCreate

objection -g com.hello.qqc explore --startup-command "android hooking watch class_method android.app.Dialog.onStart --dump-args --dump-backtrace --dump-return"

android.app.Dialog.onStart

objection -g com.hello.qqc explore --startup-command "android hooking watch class_method android.app.Dialog.show --dump-args --dump-backtrace --dump-return"

android.app.Dialog.show

objection -g com.hello.qqc explore --startup-command "android hooking watch class_method android.app.Dialog.getWindow --dump-args --dump-backtrace --dump-return"

android.app.Dialog.getWindow

objection -g com.hello.qqc explore --startup-command "android hooking watch class_method android.app.Dialog.setCancelable --dump-args --dump-backtrace --dump-return"

android.app.Dialog.setCancelable

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.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.bean.VersionBean$Version

没错了,就是它!

去除弹窗

查看下反编译代码,再次确认弹窗逻辑就在这里

在jadx确认

再追踪一下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

cn.net.tokyo.ccg.ui.fragment.dialog.UpdateDialogFragment.b

这下怎么修改以去除弹窗就显而易见了

cn.net.tokyo.ccg.ui.activity.MainActivity.a

直接删除图中的代码!

删代码去弹窗