Skip to content

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:,包含此字符串和往前的数据删除

dts-front

接着找dtb的末尾,这里是linux,code结尾,一般都会跟随一大段数据为0的区域,后面这一段也删除

留下中间的部分就是dtb数据

end

保存此文件,使用dtc命令即可反编译成dts文件

dtc -I dtb -O dts -o openwrt.dts 40

dts编译时会和dtsi拼在一起,因此得到的dts也是如此