@Caddi,我还有另一个线索,IDA Pro提示我文件校验和不正确。这是一个“Intel Hex”文件,看起来它内置校验和,可能需要使用专用编辑器进行修改。
Intel Hex文件格式:https://zhuanlan.zhihu.com/p/420620471
记录格式:
一个英特尔HEX 文件由一些HEX记录组成。每个记录由如下所示的五部分组成:
:llaaaatt[dd……]cc
:
冒号代表了每个记录的开始- ……
cc
是校验和的校验码。是计算了所有前面的数据的和后,除以256后的余数,一般是补码,所以要对和取反再加一。
@Caddi,
.hex
是用bin2hex
方式存储的单片机固件,对于stm32f103c8t6
,采用ARM32机器语言。IDA Pro可以把它转换为ARM32汇编语言,就像这样:
但转换后的汇编语言只能用来看(因为转换不完整,不可能得到原始源代码),不能用来修改或编译。想修改还是只能修改
.hex
文件本身。
可以理解成控控官方内置了防止刷新的程序?
@Caddi,我虽然刷入成功了
但重启后ID没有变,我正在查找原样。也许MCU固件被以下脚本还原了(
/etc/init.d/S16mcu_helper
):cur_version=$(cat /etc/version | grep 'mcu' | awk -F ':' {'print $2'}) mcu_version=$(/usr/sbin/oraymcu_helper -v | awk -F ',' {'print $2'} | awk -F ':' {'print $2'}) #读取mcu版本号失败或者与本固件的mcu版本不匹配,则将本固件的mcu固件刷入到mcu中 [ $? -ne 0 -o "$mcu_version" != "$cur_version" ] && { burn_mcu_firmware }
@Caddi,还有这一段:
burn_mcu_firmware() { /usr/sbin/oraymcu_helper -f /usr/share/oray_mcu_firmware.hex [ $? -eq 0 ] || { echo "burn mcu failed..." sleep 2 /usr/sbin/oraymcu_helper -f /usr/share/oray_mcu_firmware.hex } return $? }
我仔细看了一下,您62楼教程里写的是对的
另外我偏个题,请教hex文件里写的这堆数字怎么能转换成中文来看(什么编码方式?我比较好奇😂)@老虎会游泳,
@Caddi,注意我在教程中可能会写错SSH端口,用户名和密码,因为我的固件和默认固件不一样。
你应该使用
44022
端口,用户名是admin
,密码是oray.com
。对于
scp
命令,端口用-P
指定,而ssh
命令则是-p
。
@Caddi,我通常会这样做(
admin
密码是oray.com
):scp -P44022 oraymcu_helper oray_mcu_firmware.hex [email protected]:. ssh -p44022 [email protected] # chmod +x ./oraymcu_helper # ./oraymcu_helper -f ./oray_mcu_firmware.hex
至于
/usr/sbin/oraymcu_helper -f /usr/share/oray_mcu_firmware.hex
,它最大的用途是告诉你这两个文件在压缩包里的什么位置,以及命令的参数类型。
@Caddi,我还没刷。等我试试。
收到文件,谢谢!@老虎会游泳,请问您尝试这样是可以成功了吗
所以需要我们找到linbstdc++.so.6这个库一起scp进去?
结果得到
./oraymcu_helper: can't load library 'libstdc++.so.6'
,看起来还有一些库要上传
收到 再次感谢
收到@老虎会游泳,我们采购的是控控a2
收到 谢谢老虎哥 我明天回公司尝试一下
再请教两个问题:
刷入的命令是:/usr/sbin/oraymcu_helper -f /usr/share/oray_mcu_firmware.hex吗
scp传文件的位置任意即可吗?还是/usr/sbin和/usr/share?(这个sbin有点儿奇怪
@Caddi,注意:固件应该不适用于控控A2 pro,弄错可能会导致USB失灵。
@Caddi,我猜可以,你先解压固件获得
/usr/sbin/oraymcu_helper
和/usr/share/oray_mcu_firmware.hex
,然后修改oray_mcu_firmware.hex
里的id,把它和oraymcu_helper
一起用scp传到控控,然后用命令刷入,再断电重启即可(reboot
命令没有用,要物理断电才能重启单片机)。固件:kvm_upgrade_1.4.0_firmware.bz2(12.77 MB)(使用7-zip解压,然后再用7-zip解压
rootfs.squashfs
)控控的SSH监听在44022和44033端口。44022端口的用户名是
admin
,密码是oray.com
,会话根目录被chroot了(所以要自己传文件上去)。44033的用户名是root
,密码未知,会话根目录未被chroot,但因为不知道密码我们也连不上。
抱歉我不知道 大概理解成把hex里面的832042b57随便修改成其他的就可以是吗?
@Caddi,如果我给你这张图以及这个命令,你知道怎么修改吗?
/usr/sbin/oraymcu_helper -f /usr/share/oray_mcu_firmware.hex
注意ID要按照 Little Endian 反转:
0483:572b
->83042b57
也就是说空空的usb设备信息都可以通过linux-ssh连接-stm32相关的命令来重新写入吗