目录

一、环境准备

        1. 硬件(二选一):

        2.  软件:

                2.1. boot.img解包、打包工具

                2.2. dt.img解包工具(二选一)

                2.3. dtb编译、反编译工具 

                2.4. dt.img打包工具

                2.5. 整合包(不包含随身WiFi工具箱和device-tree-compiler)

二、实战

        1. 解包boot.img

         2. 解包dt.img

        3. 反编译dtb

        4. 查找设备使用的设备树

        5. 编译dtb

        6. 打包dt.img

        7. 打包boot.img

三、 参考文档


一、环境准备

        1. 硬件(二选一):

                一台支持WSL的Windows计算机(1和2均可),WSL中安装Ubuntu20.04或其他Linux发行版。

                一台安装了Ubuntu20.04或其他Linux发行版的计算机。

        2.  软件:

                2.1. boot.img解包、打包工具

                         unpackbootimg 

                2.2. dt.img解包工具(二选一)

                        dtimgextract

                        dtimg2dtb-python2 

                2.3. dtb编译、反编译工具 

                        sudo apt install device-tree-compiler

                2.4. dt.img打包工具

                        dtbToolCM

                2.5. 整合包(不包含device-tree-compiler)

                        download

二、实战

        1. 解包boot.img

                将boot.img放入unpackbootimg所在文件夹执行以下代码,其中unpack为解压文件存放目录。

mkdir unpack
./unpackbootimg -i boot.img -o unpack 

                 可以看到在unpack文件夹中生成了很多文件。

                其中 boot.img-dtb 为我们本次的目标。

         2. 解包dt.img

                将boot.img-dtb复制到dtimgextract文件夹中执行以下代码,其中unpack为解压文件存放目录。

mkdir unpack
cd unpack/
../dtimgextract ../boot.img-dtb

                 从日志中可以看到生成了204个设备树文件。(数量不固定,以实际情况为准)

        3. 反编译dtb

                在上一步解包的文件夹中执行以下代码进行反编译。

mkdir output
for i in $(ls *.dtb);do dtc -I dtb -O dts -o output/$i.dts $i;done

                 反编译会报出大量警告,出来的dts存放在output文件夹中,使用你趁手的文本编辑器打开即可修改。

        4. 查找设备使用的设备树

                以查找MSM 8916为例,使用以下代码进行查找。(字符串"MSM 8916 512MB MTP"为设备描述,具体寻找方法见附录)

cd output/
grep -rn "MSM 8916 512MB MTP" .

                可以看见本次查找出了四个文件,经过对比发现四个文件内容完全一致,修改其中一个 然后覆盖另外三个即可。

        5. 编译dtb

                修改完后对已修改的文件进行编译,使用以下代码,其中为ce_8_100_0.dtb.dts修改过的设备树源码,ce_8_100_0.dtb为编译后生成的设备树。

dtc -I dts -O dtb -o ce_8_100_0.dtb ce_8_100_0.dtb.dts

                同样会报出大量警告。(直接无视) 

        6. 打包dt.img

                把新生成的dtb文件替换掉第2步解包出来的unpack文件夹中对应的dtb文件,将替换后的unpack文件夹复制到dtbToolCM文件夹中,其中的output文件夹删掉,执行以下代码进行打包。

./dtbToolCM -o boot.img-dtb unpack/

        7. 打包boot.img

                把新生成的boot.img-dtb替换掉第1步解包出来的unpack文件夹中的boot.img-dtb,并将unpack文件夹复制到mkbootimg所在文件夹,执行以下代码进行打包。

./mkbootimg \
--kernel unpack/boot.img-zImage \
--ramdisk unpack/boot.img-ramdisk.gz \
--cmdline "$(cat unpack/boot.img-cmdline)" \
--board "$(cat unpack/boot.img-board)" \
--base "$(cat unpack/boot.img-base)" \
--pagesize "$(cat unpack/boot.img-pagesize)" \
--dt unpack/boot.img-dtb \
--kernel_offset "$(cat unpack/boot.img-kerneloff)" \
--ramdisk_offset "$(cat unpack/boot.img-ramdiskoff)" \
--second_offset "$(cat unpack/boot.img-secondoff)" \
--tags_offset "$(cat unpack/boot.img-tagsoff)" \
--os_version "0.0.0" \
--os_patch_level "2023-05" \
--hash "$(cat unpack/boot.img-hash)" \
--output newboot.img

                生成的newboot.img就是新的boot,刷入设备即可。

三、 参考文档

(15条消息) 我的4g网卡运行着GNU/Linux -- 某4g无线网卡的逆向工程与主线Linux移植 (一)_HandsomeHacker的博客-CSDN博客

How to pack my own ZImage (kernel) to a new boot.img · Issue #2 · xiaolu/mkbootimg_tools · GitHub

htc.v2ns.eu.org

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐