高中时候写的草稿,到了大学了应该能放心发了吧_(: з」∠)_
教室门口的智能班牌是个跑 AOSP 8.1 的 rk3399,平时我们当平板用。但被维护员更新 launcher 后,开机就会自动屏蔽状态栏和导航栏,无法退出班牌程序,除非输入密码进入维护模式。好在咕咕此前已提取了 launcher 和软件,尝试反编译破解发现逻辑并不难,故分享。
确定密码是否为联网下发
首先进入对应界面随便输入个密码,并在此时打开抓包工具。两个 App 在提交密码时都没有出现任何网络请求 —— 说明其密码均为本地算法生成。
那很好了,直接解包开干😋
破解 MDM launcher
以下是班牌的默认桌面:

首先打开密码输入界面,查看提示文字以定位 class。

那么直接解包 APK,打开它的 dex,搜索 “请输入密码”,找到了该对话框所在的 class。

要想分析输入密码后发生了什么,就看点击文字为 “确定” 的按钮后会发生什么。该按钮的代码即 .line 1407 中的内容:
new-instance v2, Lcom/eyijiao/mdm/MainActivity$3;
invoke-direct {v2, p0, v0}, Lcom/eyijiao/mdm/MainActivity$3;-><init>(Lcom/eyijiao/mdm/MainActivity;Landroid/widget/EditText;)V
const-string v0, "确定"
invoke-virtual {v1, v0, v2}, Landroid/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
第 1 行,创建了类 com.eyijiao.mdm.MainActivity$3 的实例,保存到名为 v2 的寄存器。第 2 行,调用了实现了 DialogInterface.OnClickLinstenerAPI 的类 v2,将寄存器 v1(即用户输入的密码,见图第 9611 行)的内容作为参数传递了过去。
而根据 Android API 文档,用户点击按钮时会调用实现该 API 的类的 onClick() 抽象方法。此时我们就可以定位到 com.eyijiao.mdm.MainActivity$3 的 onClick 方法,它就是密码被传递的地方:

第 6784 行,程序将传入的 97 行),非空则将 p1 赋给 v0,并以 v0 为参数调用 EditText 数据转为字符串存储在 p1 中,然后程序比对 p1 是否为空(第 86MainActivity.access$1700() 方法:成功则跳转 AppInfosActivity(第 112126 行,即维护界面),失败则提示密码错误(第 128141 行)
然而找到 access$1700,发现它传给 getPsd() 方法了😅搁这套娃呢

回到 MainActivity 找到 getPsd,发现也是纯逆天 —— 这玩意儿是当天日期生成的!
首先,给 Calendar 对象设置为当前日期。

然后获取该对象的月份和日,分别存储在 v1 和 v0。

将 v1(月)和 v0(日)以字符串形式拼接起来,存储在 v0。举个栗子:今天是 7 月 21 日,那么 v0 寄存的就是 “721”。

最后转换为数字再乘以 0x141,即十进制的 321,就是密码!比如 721×321=231441,那么 231441 就是 7 月 21 日的密码。(我去这不是三角洲吗)

现在 MDM laucher 已经被顺利破开了,接下来就是班牌主程序了。乖乖躺好吧我要开动啦~~
破解主程序
由于主程序 APK 及用于破解的网页现已因意外丢失,故暂无法更新,希望理解~
如果有样本,欢迎在评论区联系,感谢!
样本下载
MDM launcher:mdm.apk - 蓝奏云
说结论!
MDM 桌面的密码是:当月和当日拼接后乘以 321。举个栗子,721×321=231441,那么 231441 就是 7 月 21 日的密码。
班牌主程序的密码需要打开这个链接(注:已失效)扫描二维码即可~
https://blog.crrashh.com/posts/18-eyijiao-esign-crack.html
除特殊声明转载之外,本文由博主云萧原创且非 AI 生成内容,依据 CC BY-SA 4.0 许可协议授权,若需转载请注明出处及本声明。
尚未开启评论功能,敬请期待