致敬下H大的breed帖子:https://www.right.com.cn/forum/thread-161906-1-1.html
H大的这个breed很好用,但是可能是因为NDA的关系,不开源就有点可惜。最近遇到一个TL-WAR308路由器,但是去了H大的仓库看了下http://breed.hackpascal.net/,发现只有breed-qca953x-letv-lba-047-ch.bin这个breed能用,但是这个breed的reset键设置的是gpio17,而我的路由器复位键是gpio 14。去帖子上看了下说明,发现只有结尾是blank的breed才能通过环境变量设置gpio,我这个没带blank就不行。
那该怎么办呢?就硬怼。首先使用binwalk来分析breed固件的结构:
1 | binwalk breed-qca953x-letv-lba-047-ch.bin |
发现breed固件又两部分组成,一部分是前面部分的raw数据,另一部分是通过LZMA压缩过的数据。
使用命令:binwalk -e breed-qca953x-letv-lba-047-ch.bin
解压出一个名为2998的文件以及一个名为2998.7z的文件,这个应该就是LZMA解压出来的数据以及LZMA压缩数据。
使用010editor在这里面看了看,好像没有明细看到定义gpio的地方,于是就想到做对比。
使用相同方法分别解压h大的固件breed-qca956x-uart_rx18_tx20-reset1.bin和breed-qca956x-uart_rx18_tx20-reset2.bin,发现了神奇的现象:
发现这两个固件的lzma解压出来的部分只有一处不同,而且恰好对应reset1 和reset2
即24 04 00 01 24 05 00 01与24 04 00 02 24 05 00 01
再次比对了下breed-mt7620-reset11.bin和breed-mt7620-reset12.bin发现也是只有一位不同,也恰好对应的是0xB和0xC也就是reset11和reset12
即0B 00 04 24 01 00 05 24和0C 00 04 24 01 00 05 24
发现和前面那对固件差不多,那应该是大小端不同的原因导致不同。
由于我要刷的路由器固件是qca9533的所以更应该参考qca956x即前面这对固件的信息。
那么接下来的问题就是对lzma解压出来的数据进行修改然后重新打包回lzma。
使用binwalk解压breed-qca953x-letv-lba-047-ch.bin果然发现了24 04 00 11 24 05 00 01,0x11是17,那么改成0xe就可以改成14了
但是lzma算法有很多种参数形式,到底哪种合适呢?
于是我使用7z看了一下发现算法是 LZMA:25:lc1:lp2
也就是数据字典大小是25的LZMA算法。
正好,我看了下openwrt的工具链里面提供这个工具
https://downloads.openwrt.org/releases/17.01.0/targets/ar71xx/generic/lede-sdk-17.01.0-ar71xx-generic_gcc-5.4.0_musl-1.1.16.Linux-x86_64.tar.xz
解压工具链使用工具链里面的lzma工具可以看到一些选项:
1 | ubuntu@ubuntu:~/lede-sdk-17.01.0-ar71xx-generic_gcc-5.4.0_musl-1.1.16.Linux-x86_64/staging_dir/host/bin$ ./lzma -h |
那么,我们使用dictionary size为25,number of literal context bits为1,number of literal pos bits为2的LZMA算法就行了。
1 | ./lzma e -d25 -lc1 -lp2 2998 2998.lzma |
把压缩好的数据2998.lzma替换到breed里面相同偏移的位置就可以了。因为这种lzma算法压缩出来的数据开头是6D 00 00 00对应前面的2998.7z
之后插电开机发现果然修改成功了。
把压缩好的数据2998.lzma替换到breed里面相同偏移的位置就可以了。因为这种lzma算法压缩出来的数据开头是6D 00 00 00对应前面的2998.7z
之后插电开机发现果然修改成功了。
至于怎么检测复位键属于哪个GPIO使用breed里面的内置命令btntst就可以了(详见H大原帖五楼),通过ttl连上breed之后,开启了btntest之后会显示类似下面这种信息,序号对应的就是breed。
1 | GPIO#14 (<gpio0,14>) changed to 0 |
如果是led的可以用gpio get set命令来测,可以看到lo和hi高低电位的变化。
说些什么吧!