openwrt - 固件中提取dts¶
环境: Linux binwalk
备份固件¶
首先查看分区情况
cat /proc/mtd
root@OpenWrt:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00030000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00010000 00010000 "factory"
mtd3: 01fb0000 00010000 "firmware"
mtd4: 00242872 00010000 "kernel"
mtd5: 01d6d78e 00010000 "rootfs"
mtd6: 01270000 00010000 "rootfs_data"
dump分区到文件中
dd if=/dev/mtd0 | gzip > u-boot.gz
dd if=/dev/mtd1 | gzip > u-boot-env.gz
dd if=/dev/mtd2 | gzip > factory.gz
dd if=/dev/mtd3 | gzip > firmware.gz
dd if=/dev/mtd4 | gzip > kernel.gz
dd if=/dev/mtd5 | gzip > rootfs.gz
dd if=/dev/mtd6 | gzip > rootfs_data.gz
其中firmware部分就是系统固件
解出固件¶
binwalk -Me firmware.gz
会得到一个文件夹,其中有一个名为40
的文件,dtb数据就在其中
使用免费的16进制编辑器wxMEdit
编辑此文件
查找字符串OWRTDTB:
,包含此字符串和往前的数据删除
接着找dtb的末尾,这里是linux,code
结尾,一般都会跟随一大段数据为0的区域,后面这一段也删除
留下中间的部分就是dtb数据
保存此文件,使用dtc命令即可反编译成dts文件
dtc -I dtb -O dts -o openwrt.dts 40
dts编译时会和dtsi拼在一起,因此得到的dts也是如此