论小米多看的小小逆向

作者 : Iseri Nina

小米多看1,相当廉价的6寸电子书;
配置倒是相对于Kindle Paperwhite 2/3/4/Kindle Voyage/Oasis/Kindle 7th(499/558/咪咕)和Remarkable 1的I.MX6 SoloLite (注:2012年量产的单核armv7l 512M)阳间多了:全志B300(2019年量产,28nm制程,4核armv7l,据说CPU核心部分直接使用的A50),1+16的存储,Android 8.1(大概全志只给了这个底包)

而多看/墨案做的很草台班子:

由于墨案的系统签名使用的是testkey,因此用户可以使用公开的testkey对自己想刷入的包进行签名,从而通过系统recovery的检测,刷入magisk,成功root,小米多看电纸书系列也是使用testkey签名,方案通用。

所以我们可以提取Boot.img用Magisk修补后给升级包签名,步骤见此

然后你就获得了一个有root权限的电子书(注:可以顺带按照此指南更换锁屏与关机画面)。

但是我们的探索不止于此——前几天心血来潮在闲鱼挂了一个救砖链接,于是有人前来询问是否能解锁密码(注:如果不需要保数据,直接用PhoenixSuit刷救砖包就完事了)。

遂探寻其解锁屏幕的详细过程,用adb shell dumpsys activity得知密码输入的activity是com.android.systemui/.keyguard.KeyguardService

于是去google一通,发现原生锁屏服务也是这个KeyguardService。但是很明显密码输入界面不是个原生(非MD主题,也只有数字密码支持——如果用activity Launcher启动原生的锁屏密码机制会导致com.android.settings立刻崩溃)

前往/system/priv-app/抓systemUI的原始apk,然后发现android 8.0开始使用vdex,将apk里的dex直接分拆以优化性能。于是提取systemui.vdex文件,用VdexExtractor将systemui.vdex拆成原始dex文件,再用dex2jar拆回jar文件:

./d2j-dex2jar.sh /home/***/sysui/SystemUI_classes.dex

获得SystemUI_classes-dex2jar.jar一份,使用JD-GUI反编译jar即可。

不过并没有获取到什么太有趣的内容(也许是水平不精)。

于是继续查找,发现多看的设置(com.mgs.settings)并非系统原生设置(com.android.settings),而原生设置诸多内容被阉割(会直接crash),遂继续提取其vdex拆回jar文件。

对jar分析可找到setPswActivity.class等一系列设置密码的class,而其中最有趣的一段是:

  private void clickEnter() {
    this.mySecondPsw = this.psw.getText().toString();
    if (this.mySecondPsw.length() >= 4) {
      if (this.mySecondPsw.equals(this.myFirstPsw)) {
        Settings.Global.putString(getContentResolver(), "mas_lock_psw", this.mySecondPsw);
        Toast.makeText((Context)this, getString(2131558511), 1).show();
        finish();
      } else {
        Toast.makeText((Context)this, getString(2131558498), 1).show();
      } 
    } else {
      Toast.makeText((Context)this, getString(2131558498), 1).show();
    } 
  }

着眼于Settings.Global.putString(getContentResolver(), "mas_lock_psw", this.mySecondPsw);

查询资料后可知

Settings.Global:全局系统设置,包含始终以相同方式应用于所有已定义用户的偏好设置。 应用程序可以读取这些内容,但不允许写入;与“安全”设置一样,这些设置适用于用户必须通过系统 UI 或这些值的专用 API 显式修改的首选项。常用设置项有蓝牙开关状态、adb开关状态等。

于是可得

(背景知识:android6设置数据库从/data/data/com.android.providers.settings/databases/settings.db迁移进了/data/system/users/0/settings_global.xml等几个xml)

virgo-perf1:/data/system/users/0 # cat settings_global.xml |grep mas
  

直接写了个明文密码

于是好玩的出现了,在adb里可以直接settings get global mas_lock_psw(直接获得密码)

乃至settings put global mas_lock_psw <数字密码>(覆盖密码)

难绷之至。


版權聲明: 本部落格所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源 Iseri Nina !
  目錄