前言
最近看见了这个多亲 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)
友情提示:玩机有风险,刷机需谨慎,由刷机带来的一切后果本人概不负责
异曲同工,有趣,这里有一篇8月14日破解1s+的。
https://www.myworldbooks.cn/archives/683
* Migrated from the old blog system
无法访问了
* Migrated from the old blog system
是大佬…我只进行到更改包名装个应用跳转activity打开adb调试就推进不下去了
* Migrated from the old blog system