首页 科技内容详情
Realtek WiFi 固件和使用 RealWOW 手艺的键盘纪录器

Realtek WiFi 固件和使用 RealWOW 手艺的键盘纪录器

分类:科技

网址:

反馈错误: 联络客服

点击直达

欧博亚洲客户端

欢迎进入欧博亚洲客户端(www.aLLbetgame.us),欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

,

Realtek rtl8821ae 芯片

wifi 芯片位于 m.2 模块上,可以条记本电脑中被替换。它具有 2.4GHz 和 5GHz wifi 支持等功效,与 wifi 芯片的通讯通过 PCIe 举行。

要找到这些固件很容易,它在 Linux 上启动时从 /lib/firmware/rtlwifi 加载。现实上有两套固件:一套用于正常使用(rtl8821aefw_29.bin),另一套稍小一些用于远程叫醒 (rtl8821aefw_wowlan.bin),这是一种通过 wifi 叫醒装备的手艺,英文名为Wake-on-WLAN)。 ..._29.bin 在 ip link set dev wlan0 up 上加载,..._wowlan.bin 在 ip link set dev wlan0 down 上加载。它们不是永远固件,而只是加载到芯片的 RAM 中。

该芯片尚有一个由realtek编写的Linux内核中的上行wifi驱动程序,这并不能说明它的质量,由于它仍然是由realtek编写的驱动程序。

在统一芯片上尚有一个蓝牙芯片,可以通过 USB 2.0 举行通话。内核中似乎实现了一些 BT-Coexistence 协议,以确保 wifi 和 BT 部门不会滋扰。

与rtl8821ae的所有通讯都是内存映射的:有一个4K巨细的设置空间,可以写入和读取。此外,尚有一个64K的tx缓冲区和一个64K的rx缓冲区用于发送和吸收数据包。

基本固件结构

查看固件,它显然是基于 8051 的。然则,它不会在 0x0000 处加载。当直接在固件映像上运行时,at51 base 返回 0x3fe0。效果发现有一个 0x20 字节的标头,因此固件自己在 0x4000 处加载。

从 0x4000 最先的代码路径也通向 main 函数:在典型的 Keil 编译器方式中,它跳转到 ?C_START 函数,该函数用于初始化由 Keil C(X)51 编译器发出的用于初始化静态变量的静态变量,之后它跳转到 MAIN 函数。

MAIN 函数有点新鲜:它设置一些内存,然后将一个地址压入客栈,设置一个计时器并返回到它刚刚压入客栈的地址。事实证实,realtek 正在使用 RTX51 tiny,这是一个异常小的实时内核,用于治理义务和信号。内核基本上会跟踪义务状态并在切换义务客栈时重新定位它们。 at51 libfind 会找出种种 Keil 库的位置,作为其中的一部门,它还会找到 rtx51 内核函数,如 OS_SWITH_TASK 或 _ISR_SEND_SIGNAL。

通俗固件有两个义务(另外一个只用于初始化):一个只在特定信号时被激活,另一个在无限循环中运行。

虽然没有果然数据表纪录 8051 端的 I/O 寄存器,但大部门内容很容易找到:Linux 驱动程序从主机端界说设置空间中的寄存器。通过查看 8051 未接见的寄存器,可以看到当映射到 XDATA 偏移量 0x0 时,这些寄存器与驱动程序源中未界说的寄存器类似。然后很容易对界说寄存器的 reg.h 文件举行一些处置,以将所著名称导入 ghidra。

转储Mask ROM

MASK ROM,是制造商为了要大量生产,事先制作一颗有原始数据的ROM或EPROM看成样本,然后再大量生产与样本一样的 ROM。固件在 0x4000 处加载,但它仍然会挪用 0x4000 以下的函数,这意味着芯片上有一个永远Mask ROM,它也卖力将固件下载到芯片上。不知道这些功效会使逆向工程有点难题,因此获得该固件会很好。

最简朴的方式是修改固件并将字节从 CODE 空间复制到设置空间寄存器中,由于我们已经知道这些是若何映射的。然则有一个障碍:固件的最后两个字节似乎是一个校验和,这意味着我们需要知道校验和是若何盘算的。然而,校验和将在Mask ROM 内盘算,以是我们不能只看固件来领会它是若何完成的。幸运的是,delsum 很快就注释它只是一个 16 位 XOR 校验和,相当于 poly=0x0001 的 CRC。

从用户空间读取和写入设置空间通常是不能能的,以是我需要重新编译内核,以添加对/dev/ mems举行此操作的支持。我选择通过在VM中执行内核并使用VFIO将wifi卡映射到其中来完成此操作,由于重新编译流传服务器内核对我来说时间太长,而且尺度设置险些只适用于 VM。另外,我知道 modconfig 可用,然则 VM 方式在尺度设置下仍然可以正常事情,而且不会破费太多时间。

内核与芯片上的固件通讯主要使用的是所谓的H2C,它基本上把一些简短的(好比8字节)下令放入设置空间,并让固件读取。通过在ghidra中查看从固件到该点的引用,很容易找到读取该点的固件代码。不幸的是,当我自己处置这些事务时,我无法获得固件的响应。

于是我决议硬编码读取到固件的地址,修改 0x4000 处的跳转,将字节从硬编码地址复制到未使用的设置空间寄存器 (REG_ROM_VERSION),然后继续执行主程序。对于每个读取地址,固件都市被修改,内核模块会重新加载使用新地址修改的固件。这种方式的读取速率约莫为每秒 3 个字节。虽然花了几个小时,但可能仍然比找出固件不响应 H2C 下令的缘故原由要快。

蓝牙固件

有一件事我一最先没有意识到,但回首起来似乎很显著,那就是芯片尚有一个单独的蓝牙固件(在/lib/firmware/rtlbt中)。这一次它不是基于8051的,然则我不能容易地找出它的架构是什么。为领会决这个问题,我制作了一个工具,对照差其余版本的固件通过对照他们使用成对对齐,以便在差其余固件版本之间的相同但在差异地址的部门仍然显示并排。


需要注重的是,在许多地方,都插入了字节00 65,在此之后,两个地址都以4个字节对齐,这意味着它被用作一种填充。固然,用于填充的完善指令应该是NOP。以是我举行了搜索,但“0065 NOP”并没有真正发生任何效果,然则搜索“6500 NOP”(相反的字节序)确实发生了一些有趣的效果,注释 mips16e(mips 的拇指扩展)使用该操作码举行 NOP,事实上,这确实准确地剖析了固件,使之变得有意义。

然而,我对蓝牙固件自己不是那么感兴趣,由于它不是基于8051,以是我继续我的wifi固件的剖析。首先,我并没有真正拥有任何蓝牙装备。

驱动程序若何发送数据包

wifi的事情方式是在802.11规范中划定的。打开它,你会看到3500页密密麻麻的缩写词。

802.11 帧具有以太网帧的某种作用,但除了承载数据之外,尚有林林总总的控制帧来执行某些操作,例如与 AP 关联、与 AP 举行身份验证、电源治理等。数据帧(以及一些控制帧)也可以使用种种密码和协议举行加密。

在加密帧的情形下,尚有一些分外的数据,如序列号,其目的是重放珍爱,这也意味着 802.11 数据帧可以凭证是否加密而具有差其余巨细。加密通常由 rtl8821ae 自己完成,驱动程序只是将未加密的内容放入加密通常所在的帧中,然后芯片使用硬件对其举行加密。

Allbet代理

欢迎进入Allbet代理(www.aLLbetgame.us),欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

在 802.11 数据帧内部有一个 LLC 标头,在大多数情形下,它仅用于见告内容的 EtherType。

发送数据包时,驱动程序将整个帧放入 tx 缓冲区,在其前面有一个 40 字节的标头。标头告诉 wifi 硬件帧的巨细、是否使用加密、发送的速率和类似的器械。 802.11 帧内尚有一个延续时间字段,指示数据包发送所需的时间,这也是由硬件盘算的。

硬件有 8 个用于差异目的的行列,可以在标头中指定,一个用于信标帧,一个 MGQ(治理行列?)无论行列若何,数据包都以循环方式在 256 字节界线上放入 tx 缓冲区。

迎接使用 Realtek RealWoW Tech

在 Linux 驱动程序中,有一个名为 rtl8821ae_set_fw_rsvdpagepkt 的函数,它会在加载新固件时挪用。它将信标帧等帧和包罗 ARP 响应的数据帧加载到 tx 缓冲区的高端,驱动程序将其视为保留区域,然后这些帧的偏移量通过一些H2C下令发送到固件。

这显然也是出于wowlan的目的,这样固件就可以在主机休眠时响应ARP请求,这样数据包就可以通过IP发送到wifi芯片。wowlan固件卖力的另一件事是GTK握手,当装备脱离或加入网络时,AP 向所有装备发送一个新的组加密密钥,用于广播/多播目的。

要领会固件若那边理这些,可以查看保留这些偏移量的 H2C 下令。它将它们写入一些 XDATA 位置,因此通过查看引用这些位置的内容,可以找出固件的哪个部门发送了帧。

效果是在XDATA 0xfc00-0xfcff的tx缓冲区中有一个256字节的窗口,地址的更高的8位可以用0xfd10的XDATA寄存器设置。类似地,可以从XDATA 0xfb00-0xfbff接见rx缓冲区,0xfd11有更高的8位。

发送数据包时,很难弄清晰详细是什么发送了数据包,由于有许多事情要做。固件在 tx 标头中设置一些字段,还在 802.11 标头中设置一些位,盘算是否加密以找出内容的偏移量,对于 ARP 数据包,它还检查诸如 EtherType 之类的内容并举行响应。固然,剖析数据包时会泛起更高的庞大性。发送数据包的要害部门似乎是将REG_TXPKTBUF_MGQ_BDNY设置为txbuffer地址的高8位。注重,数据包是256字节对齐的,然后向REG_CPU_MGQ_INFORMATION + 3写入0x20。

查看wowlan固件,可以发现尚有一个H2C下令,它似乎为分外的数据包设置了更多设置。在剖析代码中,尚有一个地方是在帧数据内容的最先处检查字节0x45,这就是IPv4数据包的最先。剖析代码然后检查由上述 H2C 下令给出的目的地址和 UDP 端口,并凭证应该放入 tx 缓冲区的模式检查数据。若是一切都匹配,则将字节 0x30 作为 wowlan 叫醒缘故原由并叫醒主机。

在Linux驱动程序源代码中,这个缘故原由被命名为FW_WOW_V2_REALWOW_V2_WAKEUPPKT(并没有真正处置)。那么这个所谓的 RealWoW 是什么呢?


不幸的是,Linux 驱动程序没有实现 Realtek RealWoW Tech,而且不清晰若何从 realtek 获得新 ID,以是我放弃了对它的实验。

然则对固件的剖析注释它可能通过定期向服务器发送 UDP 数据包(由驱动程序提供)来事情,服务器以某种 ACK 响应。当在网站中输入准确的 ID 后,服务器会向装备发送一个叫醒 UDP 数据包。可以举行此操作,由于定期发送UDP数据包,以是毗邻已经打开,wifi固件然后通过PCIe叫醒装备。

一个纯粹基于 8051 的键盘纪录器

既然固件已经解决了一些问题,那么我们自己做些改变怎么样?设计是让 EC 获取条记本电脑键盘的按键,并将它们发送到 wifi 芯片,然后由 wifi 芯片将它们发送到网络。

DMA 不能从 EC 事情,由于它位于 LPC 总线后面,这意味着它将依赖 ISA DMA,这异常糟糕,而且只能接见最低 的16MB 的内存。因此,无法通过 DMA 举行通讯。

在上一篇文章中,我剖析了EC固件,让我们看一下上一篇文章中的图表:


现在我写到 wifi m.2 芯片上没有毗邻 EC_TX 和 EC_RX 跟踪(EC 和 rtl8821ae 之间的右下方)。但请注重,EC_RX 跟踪也通过另一个引脚毗邻到 rfkill(bt) 线,而且在通往 CPU 的路上有一个电阻器,以便 EC 可以有用地笼罩 CPU 而不会造成短路,可以试着用它来传输数据。

经由一些测试,似乎该方式也阻止了wifi的射频能力。但事实证实,若是在使用后再次将其拉低,那就不是什么大的问题,由于主机和固件似乎只看到一些数据包被下载。

由于只有一条迹线,以是控制器必须以某种方式同步,而不是单独的时钟线。我决议接纳 UART-ish 方式,这意味着位只是一个接一个地传输,它们之间有一个设定的时间距离。

EC 已经使用了 1ms 计时器,因此我只是修补了计时器中止以检查 16 字节密钥缓冲区中的新密钥,并以 1 位/毫秒的速率通过 EC_RX 引脚发送它们。

在wifi端,执行固件时泛起了问题。事实证实,wifi固件只是在短时间内住手执行以节约电量。与其实验读取 realtek 驱动程序以领会电源治理的事情方式,还不如定期写入似乎使其保持苏醒的设置空间。

现在wifi固件也需要知道一些时间观点,其中有尺度的 8051 外设,但它们似乎不会发生中止,因此必须在主循环中举行轮询。一个快速的实验注释,它的频率约莫为6.67 MHz,这意味着8051使用了一个80MHz时钟源,这似乎是由驱动程序源中提到的80MHz所备份的。

另一个实验注释,更改 rfkill(bt) 行会更改 REG_GPIO_PIN_CTRL_2 的第 3 位,这样就可以实现UART的另一端。我只是将准时器设置为每 1/3 ms 发生一次溢出,以便有一个更高的采样率使UART正常事情。一旦传输了一个字节,EC会在下一个字节之前暂停一段时间。

在 EC 守候时代,wifi芯片将发送一个包罗一个字节的UDP数据包到设置的IP地址和端口,这是通过未加密的wifi实现的。

虽然加密可能是可行的,但它也需要支出一些起劲。序列号必须更新,若是主机也在传输数据包,则必须通过tx缓冲区来找到当前的数据包。由于重复的序列号,它也无法从主机发送一些数据包。固件也有可能扫描周围未加密的wifi网络,与它们关联,然后通过DNS发送数据,这通常会绕过潜在的强制门户。

在树莓派上,我设置了一个小程序,它接受 UDP 数据包并将 PS/2 代码转换为 uinput 事宜。 这样,键盘就可以有用地充当树莓派的键盘了。

有趣的是,这现实上是一个键盘纪录器,它在运行时不会在 CPU 上运行任何代码。 只需要刷新一次EC的固件,替换wifi固件即可加载修改后的版本。

本文翻译自:https://8051enthusiast.github.io/2021/07/05/002-wifi_fun.html

发布评论