前言
由于Vivo的骚操作,我们无法直接 使用[fastboot oem unlock] 命令来解锁。Vivo的解锁命令 为{fastboot vivo_bsp unlock_vivo],{ 但是安卓官 方的fastboo饼不会识别这个 命令,而是直接当作unknowh command: 因此需要在fastboot的代码 中添加一条else 汗条件并调用 do_oem_command函数:
XDA上也有大神编译了修改版 (例如https://forum.xdo -developers.com/t/how -to-unlock-bootloader-of -vivo-phones.36866907)。 然而网上似乎并没有找到适用于 Mac0S的修改版fastboot的可 执行文件,由于硬盘容量有限,本人 也未能自行编译fastboot。爱限 于此,本人通过对fastboot进行 usb抓包分析,并使用pyusb模拟 fastboot对手机发包,来实现同 等效果。我的型号是Vivo Y315高 通版,其他型号也可以作为叁考。该 方条并非官方方案,解锁有风险,摇 作前记得先备份好数据。 U5B抓包 在抓包之前,首先需要重启进入 恢复模式,在终端输入[csrutil disable]关闭SIP。重启之后,在 终端输入[tcpdump -D]查看接口 列表:
这里我连接手机使用的usb接口对 应的是XHC1,所以接着在终端输入 (sudo ifconfig XHC1 up]来升 启接口。手机关机后长按电源键+音 量+键进入fastboot模式。 接着打开Wireshark,选择XHC1 开始抓包。如果是通过hab来连接手 机的,需要在系统报告中找到对应的 接口的位置1D,然后在flter中用 [usb.darwin.location_id == 位置1D]来过滤出手机的包,例如 [usb.darwin.location_id == 0x01130000]。 例如,打开fastboot对手机发一 个[fastboot oem unlock], 可以得到如下几个包: 可以观察到,当发送一个命令的时 候,首先会给i和out两个端点分别 发送一个clear halt的请求,再通 过out端点向手机发一个bu!k包Q 最后从in端点从手机接收一个buik包
这里仅以发送命令为例,别的操作 就不一—展示了。总之,抓取了这些 usb包之后,就可以根据它们来写代 码复现。 Python复现 首先安装libusb和pyusb: [shell]
- brew install libusb
- brew install libusb-compat
- pip3 install pyusb
完整代码放在了GitHub上,这里主要说说几个步 骤。
首先是初始化,根据厂商和产品1D 找到对应的设备,并且对接口进行 Claim操作。网上看到的代码好像者 没写claim这一步,但是我如果不 写这一步的话,在发包的时候就会找 不到端点,不知道这是不是Mac的 问题,我在这里纠结了很久,最后慢 慢摸索出来的。同样,在结束运行之 后,也需要对接口调用release操 作。 在发包之前,还要先对两个端点进行 clear halt操作: 后面的刷vendor和解锁操作都是 通过这个函数发送bulk包:
我之前也没搞懂vendor.img是 哪来的,后来我发现这个文件的内 容就只是一堆0而已,所以可以自 己生成。3个qetvar命令似平没 啥必要,不过我还是一并复现了, 没试过去掉有没有影响。在发送 vendor数据本身之前,需要先发 一个download命令,后面接的是 vendor的数据大小。 至于刷vendor有什么用,我也没 搞懂,虽然刷不进去,但在这之后再 解锁就不会出现签名错误的问题了。 解锁和锁定差不多,都是发送一个命 令,只不过在解锁之前要先刷一遍 vendor。
运行的输出结果如下
重启手机,
可以看到解锁后的提示 以及清除数据的要求。