-
-
[原创]修改某款lora固件库以支持接收错误数据包
-
发表于:
2019-5-23 20:51
12051
-
[原创]修改某款lora固件库以支持接收错误数据包
目前有一个 需求,为了研究lora 在不同干扰情况下数据包字节错误的情况,我必须将错误的数据包也记录下来,即没有通过CRC校验的数据包。但是现有的lora固件,会直接将没有通过CRC的数据包丢弃,无法查看错误的情况。因此,有了这个记录。
研究的是lora 2.4的通信,因此针对的芯片是sx1280的,这里就不把集成了该芯片的厂商说出来了。下面主要介绍一些思路。
整体过程为:
厂商提供的是一个封装起来的LIB库,利用ubuntu 的file工具发现是一个AR格式的打包文件,搜索的解包的方式:(参考AR解压缩)
修改之后,可以用下面的方式打包回来:
其中后面的src1.o src2.o src3.o就是共享库。dest.lib是最终打包的文件名。
之后,我发现其中的sx1280.0的库比较关键,就尝试专注分析该库。
还有另外两个厂商提供的封装库,提供了一些MAC层的操作。这里就叫manufactory.o.
我初步分析时,首先尝试分析manufactory.o.里面和MAC消息有关的操作。
我分析到两个关键的位置,1,正确接收到lora的消息时的操作
可以发现几个关键的步骤就是利用SX1280的库来获取payload并且存储起来。
另一个方面,我发现了几个处理lora接收错误情况的流程:
,那么基本的思路,就是在上述所有反馈了lora rx error的地方,仍然将上述SX1280获取和拷贝数据的操作添加在逻辑里面。但是操作起来很复杂,拷贝payload的汇编代码整理一下有这些。而且对于某些条件跳转的地址,还得仔细的修改:
看到上述都是基于sx1280的操作,那么我想能不能直接在sx1280找到一些突破口。
然后发现sx1280的库实现时开源的。sx1280
这是非常幸运的。我直接就搜索CRC有关的位置,发现在SX1280::ProcessIrqs( void )的这个函数里面,有这样一个逻辑:
正如代码中分析的,只要if( ( irqRegs & IRQ_CRC_ERROR ) == IRQ_CRC_ERROR )永远为真,那么就可以上报数据包成功接收消息,那么就可以把错误的数据包保留。
如果收到底层CRC不通过的ERROR,就向上层汇报IRQ_CRC_ERROR_CODE。那么MAC层就会根据这个error进行相应的处理,也即是上面看到的丢包处理。理论上,我们只要使得该语句永远为False就会一直跳转到下面的rxDone中,始终汇报数据包接收成功即可。
我们发现,直接修改sx1280是最简单的。
在0x228的代码位置,如果上述比较不等于0才会跳转执行下面的0x238的操作,即rxDone操作。因此,只要将BNE loc_238修改成无条件跳转B loc_238即可。汇编中D1是BNE跳转,E0是无条件跳转即B。因此在对应位置如下修改:
修改的工具路径是:edit->patch program->change byte,(IDA pro 7.0)。
修改完之后,再看看程序逻辑已经被修改:
因此,我们修改一个字节就能够达到效果了。
保存修改。edit->patch program-> apply patched to input file ,就可以保存修改了。
再重新利用AR打包回来,测试效果。
发现错误的数据包也可以接受了。
本文仅供学习交流,如作他用所承受的法律责任一概与作者无关。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-5-28 10:30
被二当家a编辑
,原因: