openwifi · 2021年02月01日

one man army(孤胆英雄)1 - WiFi固件

最近调试openwifi(开源WiFi芯片),觉得FPGA里的low MAC状态机错综复杂,实在头大(自食其果,自作自受)。于是萌生了“重构”的念头。我深知这是一个危险的想法,但也是一个充满诱惑的想法,想想就刺激。但不妨碍先想想,想想而不动手,这就是传说中的yy吧。

用FPGA状态机来实现WiFi low MAC最大的好处是实时性无人能敌,在低于0.01us的时间上精确地闪转腾挪,如入无人之境,但可惜可维护性,易读性,调试性,实在不好。当功能随着协议的升级越来越复杂,这些状态机令人头大的程度呈几何级数增长。理想的low MAC应该是一套实时软件来实现,兼顾实时性和可维护性等方面。就像大多数高级点的WiFi芯片那样,芯片内有个小MCU,跑着程序,掌控一切。

这些WiFi芯片上跑的程序的binary image一般是Linux加载WiFi网卡驱动的时候由网卡驱动加载到芯片内。这个binary就叫做blob,泛指不开源的firmware image,firmware也称作固件。根据wiki(Proprietary device driver https://en.wikipedia.org/wiki...),提供非开源blob形式驱动的主要有显卡(比如著名的被Linus竖中指的Nvidia),无线网卡和RAID控制器
torvaldsnvidia-640x424.jpg

上面这些当然也都是Linux生态比较头疼的重灾区。首先从Linux的驱动程序层面,要想为这些芯片的驱动打补丁(比如厂家早就停止支持这款芯片,只能社区自己维护,或者有时候就算厂家支持,时效性也难以保证),或者写更好的开源驱动,就得对芯片里固件的功能十(猜)分(来)了(猜)解(去)。不过这一步好歹有原厂的驱动程序做参考,大概的样子是知道的。

如果要比Linux驱动更进一步(进入驱动之下的芯片),比如想修改这些芯片里的固件或者给芯片写一个开源固件?那更是难上加难。你面对一个黑黑的芯片,需要搞清楚里面用了什么CPU,这个CPU在芯片内有什么外设,相应的寄存器定义,地址空间定义,开发工具是什么,固件如何加载进去(加密、校验、保护什么的),这个CPU如何和外部的主机通信,又是如何控制芯片里的Radio部分的,等等等等。

想修改或者重写WiFi芯片里的固件,就要搞清楚上面这些问题。目前社区里的黑客们搞清楚上面这些问题的主要手段就是反向工程。反向工程的具体手段包括但不限于:

  • 对固件的反编译(毕竟固件文件是从Linux这边传过去的,可以拿得到)
  • 对固件加载过程的监测
  • 尝试找到WiFi板子上的调试接口(JTAG,串口等),然后进入一探究竟
  • 泄露出来的芯片内部文档(比如从这个芯片的某些大客户那里)
  • 一些芯片厂员工(或者离职员工)在某些论坛上的只言片语
  • 社工
  • 对于某些WiFi芯片,上面的那些问题已经搞的比较清楚,人们甚至已经可以修改、重写WiFi芯片里的CPU(ARM居多)上的程序,让WiFi芯片的DAC发射任意信号(IQ sample,类似USRP那样)。比如这个nexmon项目(seemoo-lab/nexmon)。

未完待续。

推荐阅读
关注数
2177
内容数
35
开源Wi-Fi芯片openwifi项目相关技术进展,欢迎加入
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息