Qin 1s+ 玩机研究 – MlgmXyysd's Cat Nest

您所在的位置:网站首页 小米多亲1s+刷机 Qin 1s+ 玩机研究 – MlgmXyysd's Cat Nest

Qin 1s+ 玩机研究 – MlgmXyysd's Cat Nest

2024-07-10 22:48| 来源: 网络整理| 查看: 265

阅读时长 ≈5 分, 36 秒

Loading

前言

最近看见了这个多亲 1s+ 按键机,心血来潮弄个玩玩,第三天的下午快递送来了

开机速度很快,让我想起了 AIPC(雾),也没有开机音乐

比几年前的挪鸡鸭按键机开机快

进系统设置里随便看看,Mocor 系统,还行

随便翻翻,有个浏览器

进去一看我就懵了,这 tmd 不就是安卓么?

好吧那就装个酷安耍耍#(滑稽)

连网,下载,一气呵成

点击安装包安装。。。

你 tm 在逗我???

这 SDK 版本是有多低啊。。

还好我保留了老版本的酷市场 apk,放进 SD 卡,插入手机,准备安装

结果。。。

这玩意特么的连文件管理都没有??

开启 USB 调试

彳亍,我用 ADB,不过这玩意咋开 USB 调试来着?设置里几个版本号按了半天也没见弹出来开发者选项啊

查了一番资料得知这手机是展讯的处理器

展讯工程模式代码 *#*#83781#*#*

翻了一下发现第二个 tab 里有个 Allow Debug,有些可疑,打开瞅瞅

再回去关于手机界面发现多了一堆东西,点击版本号也出现了开发者选项

调试整开,通知栏出来了调试的图标

看这图标。。KitKat?怪不得装不上。

Windows 没有自带展讯设备的驱动,还得自己去找

驱动安装

找了半天之后,点击安装,吃口月饼,差点喷出来

全 员 失 败

看安装日志发现是 catalog 签名问题

那就好办了,把驱动签名禁用就行

进入 设置 - 更新和安全 - 恢复 - 高级启动 - 立即重新启动,点击 疑难解答 - 高级选项 - 启动设置 - 重启,按下 F7 或 7

开机后,重新安装驱动

再次查看设备列表,已经显示出来了,尝试安装

INSTALL_FAILED_APK_RESTRICTED 系统里某个软件拒绝了安装

看来想安装软件得先破解系统的限制

一次失败的尝试

用 adb 把 build.prop 扒到本地

$ adb pull /system/build.prop

通过翻阅 build.prop,找到了一处可疑点:第 72 行,ro.sys.appinstallwhitelist,app 安装白名单,应该就是这个东西了

我们给他改成 false,再通过 Recovery 刷进去试试(万一没有签名验证岂不是美滋滋?)

写一个刷机脚本,放在 META-INF/com/google/android/updater-script

mount("ext4", "EMMC", "/dev/block/platform/soc/by-name/system", "/system"); package_exrtact_file("build.prop", "/system/build.prop"); unmount("/system");

最后和 build.prop 一起压缩进 zip,重启进入 Recovery 模式

$ adb reboot recovery

这。。是出错了么。。

对着按键随便按了一通之后,发现按下数字键盘的「8」键可以显示

欸,这 rec 有 sideload 模式(apply update from ADB),安装试试

$ adb sideload update.zip

发现无论如何都连接不上设备,还是老老实实扔进sd卡吧

欧豁,有签名验证,我们要先破解下Recovery

提取 Recovery 镜像

破解 Recovery 首先需要获取 recovery.img,一般是在系统更新全量包里

用 Fiddler 抓一下系统更新

打开 Fiddler,勾选 Tools - Options - Connections - Allow remote computers to connect

弹出对话框,点确定,然后重启 Fiddler,手机连接 WiFi,代理填 ipconfig 获取到的电脑局域网 IP,端口填默认的 8888

输入 IP 的时候注意把输入法切换为英文模式(通知栏显示为 ab),按 # 切换

然后打开系统更新,这时电脑上抓到了一条数据,点开一看,WTF???版本非法??我机子可刚拆封啊

修改下发送的数据,再发送到服务器,试了好多版本(1.2.1 1.1.x)都提示非法。最后试出来了1.0.6提示最新版本,但是不给你全量包下载地址

1.0.4 是最后一个给你下载地址(升级到1.0.6)的版本

大小只有几 M 可还行,看来通过抓包的方式是抓不到全量包了,不过我们至少知道了多亲 OTA 服务器的目录结构

通过一顿操作成功获取到了全量包,不过是 1.0.4 版本的,但是这并不影响,因为我们还获取到了 1.0.4 后续版本的增量包,只需要挨个版本更新进去就行了(具体操作方法这里先略过,偷了下多亲 OTA 服务器的文件删除记录和 SQL 数据库)

之前查询提示1.2.1版本非法可能是个bug

看一下全量包的目录结构

package.zip ├─> md5sum # update.zip 的 MD5 校验文件 └─> update.zip # 软件包本体 ├─> META-INF # 刷机脚本和签名文件 │ └─> ... ├─> recovery # recovery 差分文件 │ └─> ... ├─> system # system 分区文件 │ └─> ... ├─> boot.img # boot 分区镜像 └─> ...

并没有完整的 recovery 分区镜像,但是有差分文件,我们可以通过 boot.img 来生成,因为这是 1.0.4 版本的系统包,我们需要先获取到最新版的 boot.img

再看一下增量包的目录结构

package.zip ├─> md5sum # update.zip 的 MD5 校验文件 └─> update.zip # 软件包本体 ├─> META-INF # 刷机脚本和签名文件 │ └─> ... ├─> recovery # recovery 差分文件 │ └─> ... └─> patch # 差分文件 ├─> system # system 分区差分文件 │ └─> ... ├─> boot.img.p # boot 分区镜像差分文件 └─> ...

我们把boot.img和boot.img.p解压出来

除此之外还需要 META-INF/com/google/android/updater-script 里的内容

找到boot.img的那一行,把前面三个参数复制下来(选中的和前面两个)

在 WSL 中执行指令

$ ApplyPatch boot.img boot_new.img 前面的参数(boot_new.img 的预期 SHA1) 中间的参数(boot_new.img 的预期大小) 选中的参数(boot.img 的 SHA1) boot.img.p

执行成功后,把 boot.img 和 boot.img.p 删除,boot_new.img 重命名为 boot.img,对下一个版本重复以上步骤,直到最后一个版本

最终我们得到了一个最新版的 boot.img,接下来找到同版本增量包里的 recovery/recovery-from-boot.p,复制过来

用文本编辑器打开,查看文件头,通常有两种情况,这里一起介绍下

如果为 BSDIFF,直接执行下面的指令即可$ bspatch boot.img recovery.img recovery-from-boot.p如果为 IMGDIFF2(如本教程)

需要继续提取 /recovery/etc/install-recovery.sh 和 /system/etc/recovery-resource.dat (在全量包或系统中都可以找到)用文本编辑器打开 install-recovery.sh找到 applypatch 开头的一行,复制下来

把不需要的内容都扔掉,留下有用的三个值,它们从左往右分别代表 recovery 的预期 SHA1,recovery 的预期文件大小,原文件的 SHA1

0a13745ae8d85762a03a0cddca7feb3c1aebce58 10479616 821bffe9268699430aece61933229132f882f1e9

在 WSL 中执行

$ ApplyPatch boot.img recovery.img 0a13745ae8d85762a03a0cddca7feb3c1aebce58 10479616 821bffe9268699430aece61933229132f882f1e9 recovery-from-boot.p recovery-resource.dat

顺利获取到 recovery.img,这就是我们需要的,这时候可以删除其他文件

破解Recovery签名验证

用 bootimg 工具解包 recovery.img

$ rename recovery.img boot.img # 因为工具只认boot.img,所以重命名一下 $ bootimg --unpack-bootimg

一切顺利,你会看到类似如下的输出,文件夹下多出来一堆文件

ramdisk.gz # rec 用到的一些系统文件 boot.img # 解包之前的文件,打包时会自动删 boot-old.img # 同上,备份,可删 initrd # ramdisk.gz 的解包 sbin # 存放 recovery elf 文件的目录 ...

我们要修改的是 /initrd/sbin/recovery 这个文件

用 IDA Pro (32-bit) 打开(64-bit 无法保存 32 位的 elf)

等待 IDA 分析文件

点击左上角的 Search for text 按钮,搜索 signature

顺着箭头往上翻,找到最近的 CMP,看到下面有个 BEQ,这句就是跳转代码

科普一下 arm 指令集

BNE: 标志寄存器中 Z 标志位不等于零时, 跳转到BNE后标签处 BEQ(D0): 标志寄存器中 Z 标志位等于零时, 跳转到BEQ后标签处 B(E7):无条件跳转,一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行

我们可以把 BEQ 修改为 BNE,但是这样如果签名验证通过就会挂掉(官方包无法安装),所以我们最好是修改为无条件跳转指令 B右键 BEQ,切换到汇编文本窗口

找到刚才的 BEQ

右键,勾选 Synchronize with - Hex View 1 (如已勾选,请跳过该步骤)

点击 Hex View 标签栏,选中 D0

点击左上角 Edit - Patch program - Change byte

将 D0 改成 E7

返回 Text View 标签栏发现 BEQ 变成了 B

同理,再次查询 signature,继续修改没有改过的地方,不再赘述

点击左上角 Edit - Patch program - Apply patches to input file

点击 OK 保存文件

最后关闭窗口,勾选 DON'T SAVE the database 后点击 OK

最后将更改打包进img

$ bootimg --repack-bootimg $ rename boot-new.img recovery.img

(76.png)

刷入修改后的Recovery

4.4 的设备大多数没有 BootLoader 锁,跳过解锁步骤,手机连接电脑,执行指令,刷入成功

$ adb reboot bootloader $ fastboot flash recovery recovery.img

这里直接刷入,按理说是应该先执行 boot 指令测试 img 的,但是因为是展讯的处理器,所以 boot 指令是废的(参考资料)

需要注意,刷入成功后并不能直接重启,因为 system 里还存在 install-recovery.sh,一重启就会恢复为原版 rec,一起执行下面的指令

$ fastboot reboot $ adb wait-for-device reboot recovery

成功开机,但正当我兴高采烈地去刷的时候,发现它炸了……

E:failed to set up expected mounts for install; aborting Installation aborted.

多次尝试之后,发现这只是个 bug,多刷几次或者拔掉数据线就好了

Install from sdcard complete.

大功告成,破解成功,重启进入系统安装试试水

$ adb install Coolapk.apk

安装成功!

后语

至此,破解安装应用已完成,需要注意的是每次进入rec都需要遵循以下步骤:

$ adb reboot bootloader $ fastboot flash recovery recovery.img $ fastboot reboot $ adb wait-for-device reboot recovery

或者也可以直接把 install-recovery.sh 干掉,我懒的搞

也可以刷个 Magisk 或者 SuperSU 来 root 什么的,建议是最好不要直接修改 system 分区,因为炸了不好整

刷机包呢,也可以使用 bsdiff 来让破解变得更加优雅(大雾)

资源下载

驱动(请禁用驱动签名)工具打包(不含驱动,手机打开adb模式连接电脑,运行crack.cmd)

友情提示:玩机有风险,刷机需谨慎,由刷机带来的一切后果本人概不负责



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3