一:
首先说说UPDATE.APP的大体结构。在这方面,三年前就已有第三方开发者进行了研究(如果这算是一种研究)。现在只是在前人的基础上分析华为固件的结构与工作方式.
windows中用winhex.exe将UPDATE.APP打开。桌面版linux下最好使用bless。
1. First 92 bytes are 0x00
2. Each file are started with 55AA 5AA5
3. Then 4 bytes for Packet(header) Length
4. Then 4 bytes for 0x00000001
5. Then 8 bytes for Hardware ID
6. Then 4 bytes for File Sequence (*)
7. Then 4 bytes for Data file length
8. Then 16 byts for File Date
9. Then 16 byts for File time
10.Then 16 byts for The word Input ?
11.Then 16 byts for Blank with 0x00
12.Then 2 bytes for the Checksum of the header(maybe?)
13.Then 2 bytes for always 0x1000 ?
14.Then 2 bytes for Blank [step 2-14 consumes 98bytes)
15.Then ($headerLength-98) bytes for file checksum
16.Then data file length bytes for files.
17.Then repeat 2 to 16
----------------------------------
二:
UPDATE.APP中单个模块分析:
这里定义 :
定义1:从某个55 aa 5a a5开始(含)到下一个55 aa 5a
a5(不含)间的(看起来连续的)数据称为一个模块(module)。
定义2:一个模块中,刷进手机分区的某部分数据,称为刷机文件。
定义3:一个模块中,去除刷机文件的另一个部分数据,称为模块的头文件,简称头文件;或者去除版本文件后剩余部分也称为头文件.(有两个模块分别包含crc.mbn,MD5_RSA。类似)
因此,模块=头文件+刷机文件
或者,模块=头文件+版本文件
模块=头文件+crc.mbn
模块=头文件+MD5_RSA 。
定义4:我们将不同模块的相对应位置的多个字节称为一种结构。各个模块是有规律可寻的,我们一个个结构分析。
以下是UPDATE.APP中的某个模块。经过编辑处理,模块分成十几个结构分析:
为适应UPDATE.APP整体结构的需要,模块结构从2开始计数。其中,2至15结构为头文件,第16结构为刷机文件或版本文件等.
| 结构 | 字节数 |
结构相对应的数据(值) | 简要说明 |
| 2. Each module are started 模块的开始 |
4 |
55 AA 5A A5 | 每个模块以55 aa 5a a5开始,它是UPDATE.APP的标识之一.解包工具首先以它为依据将强刷包分十几个模块(后去掉头文件,才将刷机文件与版本文件等输出到output目录)。 |
| 3. header Length 头文件长度 |
4 |
64 00 00 00 | 十六进制表示的字节数,高低位颠倒. 该值表示头文件的长度, 从55 aa 5a a5 开始(含)到真正刷机文件(或版本文件)开始为止的一段文件的大小.即2-15结构包含的总字节. 强刷程序根据它计算刷机文件(在sd卡中)的相对开始地址. |
| 4. 0x00000001 | 4 |
01 00 00 00 | 固定 |
| 5. Hardware ID 硬件ID |
8 |
48 57 38 78 32 35 FF FF | 8x25 |
| 6. File Sequence 模块序号 |
4 |
00 00 00 FB | (注意对比split_update.pl文件) 模块序号,作为模块标识,强刷程序根据它确定模块中刷机文件将要刷入哪个分区(当然有些文件不刷进手机,而用于效验). perl脚本根据该结构发现刷机文件. |
| 7. Data file length 刷机文件(等)的长度 |
4 |
28 00 00 00 | 该结构标明真正要刷进手机的刷机文件的大小.强刷程序根据它及前面算出的开始地址校验并读取内容. |
| 8. File Date 日期 |
16 |
32 30 31 33 2E 30 33 2E 32 32 00 00 00 00 00 00 | 注明日期 |
| 9. File time 时间 |
16 |
31 37 2E 35 39 2E 33 33 00 00 00 00 00 00 00 00 | 时间,精确到秒. |
| 10. The word "Input" 十六进制编辑器上看到的一个单词,“input” |
16 |
49 4E 50 55 54 00 00 00 00 00 00 00 00 00 00 00 | 固定的,作为UPDATE.APP的标识之一,与某些固定字节构成一种特定数据结构.强刷程序识别这样的数据结构是UPDATE.APP的一部分,才进一步将模块中的刷机文件写入手机存储芯片中. 由于sd卡中也可能存在其它包含55 aa 5a a5的数据结构.因而还需要其它标识构成特定结构. |
| 11. Blank with 0x00 16个0x00 |
16 |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 固定的16个 0x00字节.可以与前一结构(第10结构)合并看待. |
| 12. Unknow Checksum 官方的未知方法生成的效验值 |
2 |
96 86 | 目前这两个字节我们无法校验生成并通过强刷的效验机制.预计它与crc.mbn,MD5_RSA是配套的.外国在这方面断续研究几年没有结果.原计划的UPDATE.APP重新打包失败. |
| 13. always 0x1000 | 2 |
00 10 | 固定 |
| 14. 2 byte Blank with 0x00 2个0x00 |
2 |
00 00 | 固定,第13与14结构可合并看待. |
| 15. ($headerLength-98) bytes for file checksum 刷机文件(等)的效验值 |
不定 |
39 F3 | 特殊的crc16的效验结果.外国网友已编译出linux下的效验程序(工具中的crc). 另,这里字节数不是固定的.是与刷机文件的大小相关的.这是可以理解的:文件越长,其效验结果需要越多的字节表示。 |
| 16. DATA file 刷机文件(或者是版本文件,crc.mbn, MD5_RSA) |
不定 |
01 00 00 00 03 00 00 00 00 00 05 60 00 00 54 2D F0 A3 08 00 F0 A3 08 00 F0 A3 5C 2D 00 00 00 00 F0 A3 5C 2D 00 00 00 00 | 到这里刷机文件出现了. ( 该模块中前面部分是头文件. 头文件总字节=98+第15结构的字节数 .也就是,从第2结构到第14结构结束止,共98字节,是固定的98字节。而第15结构字节数是不固定的。) |
| 紧接着下一个模块: | |||
| 2.Each file are started by | 4 |
55 AA 5A A5 | |
| 3. header Length | 4 |
省略 | |
| 4. 0x00000001 | 4 |
省略 | |
| ... | ... |
... | |
| 16. DATA file | .. |
省略 | |
| 下一个模块 | ... |
----------------------------------------------
三:
解包工具的使用:
window下:
1.安装perl: http://www.activestate.com/activeperl/downloads
选择相应系统的版本安装。安装过程,其自动配置环境变量。
2.将UPDATE.APP文件置于与split_update-windows.pl批处理等在同一目录下。
3.双击“双击自动解包.bat”即可解包。
4.也可以使用工具自带的perl,但可能不能在某个系统版本中使用。
linux下的使用:
1.下载安装perl:sudo apt-get install perl
2.定位到工具文件目录,并将UPDATE.APP文件复制到该文件夹
3.给split_update-linux.pl以可执行权限:sudo chmod 755 split_update-linux.pl
给crc以可执行权限:chmod 755 crc
4.开始解包: ./split_update-linux.pl
UPDATE.APP
或者
./split_update-linux.pl
在工具目录output文件夹下大致生成20多个文件:
注意:以下所述文件对应分区仅限Y300,G510,G330的高通机型。其它型号与MTK机型不一定一样。更多信息可自行探讨。
方法也很简单,就是用dd命令从手机分区读出文件到sd卡,再adb
pull到电脑。后用十六进制编辑器对比就行了
| 文件 | 对应分区 | 作用 |
| partition0.bin | 乱改分区表文件,手机会变砖:分区描述文件,分为两部分。包括MBR与EBR。前512字节为MBR,后部分为EBR |
|
| qcsblhd_cfgdata.mbn | mmcblk0p1 | 随意修改该分区文件,手机会变砖:huawei bootloader , |
| qcsbl.mbn | mmcblk0p2 | 随意修改该分区文件,手机会变砖: huawei bootloader |
| fat.bin | mmcblk0p3 | modem,与网络有关 |
| oeminfo.mbn | mmcblk0p5 |
包含huawei bootloader与串号,识别码,版本型号等信息,强刷时受到检查。 |
| splash.raw565 | mmcblk0p5 | bootloader fastboot logo |
| oemsblhd.mbn | mmcblk0p6 | 随意修改该分区文件,手机会变砖:头文件 |
| oemsbl.mbn | mmcblk0p6 | 随意修改该分区文件,手机会变砖: huawei bootloader |
| modem_st1.mbn | mmcblk0p9 | 与网络有关 |
| modem_st2.mbn | mmcblk0p10 | 与网络有关 |
| emmc_appsboothd.mbn | mmcblk0p11 | 随意修改该分区文件,手机会变砖:头文件 |
| emmc_appsboot.mbn | mmcblk0p11 | 随意修改该分区文件,手机会变砖:引导系统启动,接收按键状态 |
| boot.img | mmcblk0p12 | ... |
| recovery.img | mmcblk0p13 | ... |
| cust.img.ext4 | mmcblk0p16 | ... |
| system.img.ext4 | mmcblk0p17 | ... |
| userdata.img.ext4 | mmcblk0p18 | ... |
| same_40Byte_1_boot_hd.mbn | 不刷入手机 |
... |
| same_40Byte_2_cust_hd.mbn | 不刷入手机 | ... |
| same_40Byte_3_system_hd.mbn | 不刷入手机 | ... |
| same_40Byte_4_userdata_hd.mbn | 不刷入手机 |
... |
| same_40Byte_5_recovery_hd.mbn | 不刷入手机 | ... |
| crc.mbn | 不刷入手机 | 强刷包效验依据 |
| MD5_RSA | 不刷入手机 | 效验值 |
| current_boot_version.txt | 不刷入手机 | 版本文件 |
| current_version.txt | 不刷入手机 | 版本文件 |
| boot_versions_list.txt | 不刷入手机 | 版本文件 |
| versions_list.txt | 不刷入手机 | 版本文件 |
这些文件相当有用,比以往用于制作刷机包有更多的应用。
---------------------------------
该工具在Y300,G510,G330的高通CPU机型间通用,正确文件名。其它机型未必得到正确文件名(即使没有异常提示)。MTK机型底层文件不同,所以文件名一定是不对应的。
据了解,u8825d的最新版本固件,并未发现partition0.mbn文件,也即分区表文件。也就是不更新的。这些需要注意。
如果有兴趣,可以给每个机型修正文件名。