利用sinowealth-kb-tool逆向分析键盘固件:从原理到实战

📅 2026/7/4 19:06:25 👁️ 阅读次数 📝 编程学习
利用sinowealth-kb-tool逆向分析键盘固件:从原理到实战

1. 项目概述:当你的键盘固件不再“黑盒”

最近在折腾Leobog Hi75这把键盘,起因很简单,官方驱动软件的功能实在有限,想改个灯效或者自定义个宏,要么不支持,要么操作起来反人类。相信不少玩过中低端国产机械键盘的朋友都有同感,硬件素质可能不错,但软件生态总差那么一口气。与其被官方软件束缚,不如看看键盘的“大脑”——固件本身。这就是我接触sinowealth-kb-tool这个开源工具的契机,它让我能直接读写基于中颖电子(Sinowealth)8051内核MCU的键盘固件,把Hi75从里到外研究了个透。

简单来说,sinowealth-kb-tool是一个命令行工具,它利用了这些键盘MCU内部普遍存在的一个ISP(在系统编程)引导程序。这个引导程序原本是厂商用于生产烧录和后期维护的“后门”,现在被逆向工程并封装成了工具,让我们普通用户也能通过USB-HID协议,直接读取或写入键盘闪存(Flash)里的内容。这意味着,只要你的键盘主控是列表中支持的型号(比如Hi75用的SH68F90A),你就能绕过官方软件,直接操作固件二进制文件,进行备份、分析甚至修改。

这不仅仅是换个灯效那么简单。通过逆向分析固件,你可以彻底理解键盘的键值映射表、RGB灯光控制逻辑、宏命令存储格式,乃至发现一些未公开的硬件功能。对于开发者或极客玩家,这相当于拿到了键盘的“源代码”(虽然是二进制的),可以打造完全个性化的固件,或者为开源固件项目(如QMK、VIA)提供底层支持。当然,风险与机遇并存,操作不当确实有“变砖”的可能,但遵循正确的方法和充分的备份,这个过程是可控且极具探索乐趣的。

2. 核心原理与工具链搭建

2.1 中颖8051 MCU与ISP引导程序揭秘

要玩转sinowealth-kb-tool,首先得明白它在和谁打交道。Leobog Hi75以及列表里一大批键盘,如NuPhy Air系列、RK、Redragon等,其核心都是一颗来自中颖电子(Sinowealth)的8位微控制器,基于经典的8051内核,例如SH68F90A。这类MCU成本低、功耗控制不错,在消费级外设中非常常见。

这些MCU出厂时,通常会在闪存的最后预留一小块区域(比如4KB),写入一个特殊的ISP引导程序。这个引导程序的作用,是在MCU上电或收到特定信号时,不运行用户的主固件,而是进入一个等待编程的状态。在这个状态下,MCU可以通过特定的通信接口(在这里是USB-HID)接收新的固件数据并烧写到闪存中。对于键盘厂商,这是高效的生产和售后工具;对于我们,这就是一个现成的、无需额外硬件的“调试接口”。

sinowealth-kb-tool的核心工作,就是通过USB-HID协议,向这个ISP引导程序发送符合其通信规范的数据包,从而实现对闪存的读写。工具作者carlossless和贡献者gashtaan逆向分析了多种型号键盘的ISP协议,将其封装成了一个统一的Rust命令行工具,大大降低了使用门槛。

2.2 环境准备与工具安装

工欲善其事,必先利其器。sinowealth-kb-tool是Rust项目,因此第一步是安装Rust工具链。如果你还没有安装,可以去Rust官网下载rustup安装脚本,它会帮你管理Rust版本和工具。

# 安装rustup(Linux/macOS) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 安装后需要重启终端或运行 source $HOME/.cargo/env

安装好Rust后,通过Cargo(Rust的包管理器)直接从GitHub克隆并安装sinowealth-kb-tool是最简单的方式:

# 克隆仓库 git clone https://github.com/carlossless/sinowealth-kb-tool.git cd sinowealth-kb-tool # 编译并安装(需要stable版本的Rust) cargo install --path .

编译完成后,在终端输入sinowealth-kb-tool --help,如果能看到详细的帮助信息,说明安装成功。

注意:在Linux系统上,直接运行可能会遇到权限问题,因为普通用户默认无法直接访问USB HID设备。你需要创建一个udev规则。根据工具的README,对于Vendor ID为0x05ac(这是很多此类键盘的VID,注意它和苹果的VID相同,但产品ID不同)、Product ID为0x024f的设备(Hi75可能使用此ID,具体需用lsusb命令查看),可以创建如下规则文件:

sudo nano /etc/udev/rules.d/99-sinowealth.rules

然后加入以下内容(将xxxxyyyy替换为你键盘的实际VID和PID):

SUBSYSTEMS=="usb", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", MODE="0660", GROUP="plugdev" SUBSYSTEMS=="usb", ATTRS{idVendor}=="0603", ATTRS{idProduct}=="1020", MODE="0660", GROUP="plugdev"

第二行是针对另一个常见ISP桥接芯片的规则。保存后,重新加载udev规则并确保你的用户加入了plugdev组:

sudo udevadm control --reload-rules sudo udevadm trigger sudo usermod -aG plugdev $USER

注销并重新登录后生效。

在macOS上,如果遇到hid_open_path: failed to open IOHIDDevice from mach entry...错误,需要为你的终端应用(如Terminal或iTerm2)授予“输入监控”权限。在“系统设置” -> “隐私与安全性” -> “输入监控”中添加你的终端应用即可。

Windows用户相对省心,通常无需额外配置即可运行。

2.3 逆向分析辅助工具选型

读写固件只是第一步,要“分析”它,我们还需要逆向工程工具。这里的主角是反汇编器和十六进制编辑器。

  1. IDA Pro / Ghidra:这是专业级的逆向分析工具。IDA Pro是付费软件,但其对8051架构的支持非常成熟。Ghidra是NSA开源的工具,免费且功能强大,同样支持8051。它们能将二进制文件反汇编成可读的汇编代码,并允许你重命名函数、添加注释、分析程序流程,是深度逆向的利器。对于“哪个AI可以分析IDA逆向”这种热词,目前并没有成熟的AI能完全替代人工进行复杂的逆向工程分析,但一些插件或辅助工具(如IDA的插件、Ghidra的脚本)可以提升效率。

  2. 逆向分析专用工具:像“易盾点选逆向分析”这类热词,通常指针对特定验证码或安全组件的逆向,与我们分析键盘固件的目标不同。我们的重点在于理解硬件控制逻辑,而非破解安全机制。

  3. 十六进制编辑器:对于初步探查,一个优秀的十六进制编辑器必不可少,比如010 Editor(付费,功能极强,支持模板解析二进制结构)或HxD(免费,轻量)。它们能让你直观地查看固件文件的每一个字节,搜索特定字符串(如厂商信息、错误提示),并手动修改尝试。

  4. Python + 一些库:对于自动化分析或提取特定数据块(如键值表、灯效数据),写Python脚本是最灵活的方式。binascii,struct等标准库就足够处理基本的二进制数据。

对于Leobog Hi75的逆向分析,我的建议是:先用sinowealth-kb-tool完整备份固件,然后用010 Editor或HxD进行初步的“肉眼”扫描,寻找规律性数据(比如每隔一定偏移出现的疑似键值),最后将感兴趣的部分导入IDA或Ghidra进行反汇编和深入分析。

3. Leobog Hi75固件提取实战

3.1 进入ISP模式与设备识别

要让键盘进入ISP模式,通常需要一个特定的按键组合。对于Leobog Hi75,根据社区经验,常见的方法是:断开键盘USB连接,按住Esc键不放,然后重新插入USB线。此时,键盘的主固件不会启动,而是停留在ISP引导程序状态。你会发现键盘的RGB灯不亮,且操作系统可能会识别出一个新的USB设备。

在Linux下,你可以使用lsusb命令来查看新设备:

lsusb

寻找一个Vendor ID为0x05ac(中颖常用)或0x0603,且Product ID可能为0x024f0x1020的设备。例如,你可能会看到:

Bus 003 Device 007: ID 05ac:024f Sinowealth

在Windows下,可以通过设备管理器查看“通用串行总线设备”下的新增条目。

实操心得:进入ISP模式有时不太稳定,如果一次不成功,多试几次(换USB口、确保按键按实、快速插拔)。成功进入后,键盘本身不会有任何视觉或触觉反馈(灯不亮,按键无反应),这是正常现象。此时,sinowealth-kb-tool才能与ISP引导程序通信。

3.2 使用sinowealth-kb-tool读取固件

确认键盘进入ISP模式后,就可以开始读取固件了。sinowealth-kb-tool已经内置了Leobog Hi75的设备配置文件(从GitHub的Supported Hardware列表可知),我们可以直接用-d参数指定设备型号。

首先,我们进行最安全的操作——完整备份固件(包含用户固件和ISP引导程序):

sinowealth-kb-tool read -d leobog-hi75 -s full hi75_full_backup.hex

命令解释:

  • read:执行读取操作。
  • -d leobog-hi75:指定设备为Leobog Hi75。工具会根据内置数据库自动匹配正确的VID/PID、固件大小、页大小等参数。
  • -s full:指定读取范围是“完整”的,包括用户固件区和ISP引导程序区。
  • hi75_full_backup.hex:输出的Intel HEX格式文件。

重要警告:工具的README明确指出,读取操作可能会在固件末尾的特定地址(<firmware_size-5>)写入一个LJMP指令(操作码0x02)。如果这个位置原本不是这个指令,引导程序会认为主固件已启用,并在下次正常上电时跳转过去。对于绝大多数已出厂设备,这个指令本来就存在,所以读取操作通常是安全的。但为了绝对保险,在尝试任何操作前,先做一次完整备份

除了完整备份,你还可以分别读取:

# 仅读取主固件(默认行为,也是最常用的) sinowealth-kb-tool read -d leobog-hi75 hi75_firmware.hex # 仅读取ISP引导程序 sinowealth-kb-tool read -d leobog-hi75 -s bootloader hi75_bootloader.hex

如果工具的内置数据库没有你的设备(虽然Hi75已在列),或者你想手动指定参数,可以使用完整的自定义命令格式。这需要你先通过其他方式(如查阅数据手册、分析现有固件)确定参数:

sinowealth-kb-tool read \ --platform sh68f90 \ --vendor_id 0x05ac \ --product_id 0x024f \ --firmware_size 61440 \ --bootloader_size 4096 \ --page_size 2048 \ --isp_iface_num 1 \ --isp_report_id 5 \ custom_firmware.hex

3.3 固件文件格式解析与初步探查

sinowealth-kb-tool默认输出的是Intel HEX格式(.hex)。这是一种文本格式,每行代表一段数据记录,包含地址、记录类型、数据和校验和。这种格式的好处是可读性好,且能清晰地表示不连续的数据段。不过,对于逆向分析,我们通常需要将其转换为纯二进制文件(.bin)。

可以使用objcopy工具(来自GNU Binutils)进行转换:

# 将 .hex 转换为 .bin objcopy -I ihex -O binary hi75_firmware.hex hi75_firmware.bin

现在,用十六进制编辑器打开hi75_firmware.bin。首先映入眼帘的通常是大量的FF(未编程的闪存单元)和零星的数据。8051架构的程序通常从地址0x0000开始执行,所以我们可以重点关注文件开头部分。

一个典型的8051程序开头是中断向量表。8051有若干个中断源(如外部中断0、定时器0溢出、串口接收等),每个中断源对应一个4字节的入口地址(实际是LJMP指令的地址)。你可以尝试在文件起始位置搜索02这个字节(LJMP的操作码),后面跟着的2个字节就是跳转的目标地址。例如,在地址0x0000看到02 10 00,意味着复位后程序跳转到0x1000执行。

接下来,可以搜索一些可能的字符串。在十六进制编辑器中,切换到文本视图或使用搜索功能,查找像“LEOBOG”、“HI75”、“VERSION”这样的ASCII字符串。这些字符串可能包含版本信息、调试信息或厂商标识,能帮你快速定位到固件中的信息区。

另一个关键区域是键值映射表。键盘固件必须存储每个按键位置对应的USB HID键值(如A键对应0x04)。这个表通常是连续排列的,大小等于按键数量(对于75%配列,大概在80个左右)。你可以尝试在固件中搜索连续的、看起来有规律的非零非0xFF字节序列。例如,找到一段数据,其值在0x000xE7之间(USB HID键盘用法的范围),并且长度合适,那很可能就是键值表。

4. 固件逆向分析与关键结构挖掘

4.1 反汇编与主流程分析

有了二进制文件,真正的逆向工作才开始。将hi75_firmware.bin加载到IDA Pro或Ghidra中。第一步是正确设置处理器类型:选择8051。然后需要设置正确的ROM起始地址和大小。对于SH68F90A,其Flash可能是64KB,用户固件区可能占用前60KB(0xF000),ISP引导程序占用最后4KB(0xF000-0xFFFF)。在加载时,你需要告诉反汇编器正确的加载地址,通常是0x0000

加载后,反汇编器会从0x0000开始尝试解析代码。如前所述,0x0000处应该是一个LJMP指令,跳转到主初始化代码(CSTARTUPmain函数)。你需要顺着这个跳转找到程序的入口点。

在8051的逆向中,有几个关键点需要注意:

  1. 内存模型:8051有独立的代码空间(ROM)、内部数据存储器(IRAM,128/256字节)、特殊功能寄存器(SFR)和外部数据存储器(XRAM)。反汇编器需要知道哪些地址访问的是SFR(如P0, P1, TC0N等),这通常通过一个.sfc.xml格式的处理器定义文件来配置。
  2. 中断服务程序(ISR):除了复位向量,其他中断向量(如定时器、串口、外部中断)也值得分析。键盘扫描通常由一个定时器中断驱动,定期检查按键矩阵的状态。
  3. 函数识别:反汇编器可能无法自动识别所有函数。你需要根据调用约定(8051通常用寄存器或固定内存位置传递参数)、常见的序言/尾声指令序列来手动定义函数。

分析主循环,你可能会发现它大致做以下几件事:

  • 初始化:设置IO口方向(矩阵的行线为输出,列线为输入带上拉)、配置定时器(用于去抖和扫描)、初始化USB控制器。
  • 主循环或定时器中断:扫描按键矩阵,将物理位置转换为键值,处理长按、连击等。
  • USB报告处理:将当前的按键状态、修饰键状态打包成USB HID报告描述符规定的格式,通过USB发送给主机。
  • RGB控制:根据模式读取LED颜色数据,通过PWM或类似协议(如WS2812B的时序)控制LED灯珠。

4.2 关键数据结构定位与修改

逆向的最终目的往往是修改。对于键盘固件,最常见的修改目标是键值映射表RGB灯效数据

定位键值映射表

  1. 搜索法:在反汇编后的代码中,搜索对按键矩阵进行解码的函数。这个函数通常会读取某个IO口的状态(对应列扫描),然后经过计算得到一个索引值。
  2. 数据引用追踪:找到这个索引值被使用的地方,它很可能被用来从一个表中查找对应的USB键值。在反汇编代码中,你会看到类似MOVC A, @A+DPTR的指令,这条指令常用于从代码空间(ROM)的表中读取数据。DPTR寄存器指向的就是表的基地址。
  3. 交叉验证:找到疑似表后,对照USB HID Usage ID表(网上可查),看看表中的数值是否对应合理的键值(如0x04是a/A,0x05是b/B,0x1D是z/Z,0x29是ESC,0xE0是左Ctrl等)。表的长度应该等于或略大于键盘的物理按键数。

定位RGB灯效数据

  1. 寻找PWM或时序控制代码:搜索对特定IO口(控制LED数据线)进行操作的指令。对于WS2812B这类灯珠,控制代码会包含精确的延时循环来产生0和1码元。
  2. 查找颜色数组:灯效模式(如彩虹、呼吸、单色)通常对应一个预定义的颜色值数组。这些颜色值可能是24位的RGB(每个颜色8位),连续存储在ROM中。
  3. 模式索引:固件中可能有一个变量或常量用来选择当前灯效模式。修改这个索引值,或者直接修改颜色数组中的数据,就能改变灯效。

一旦定位到这些关键数据,你就可以用十六进制编辑器直接修改.bin文件中的对应字节,然后再用sinowealth-kb-tool写回键盘。但务必极度小心:修改代码或数据时,一个字节的错误就可能导致键盘无法启动。务必在修改前备份原文件,并且每次只做微小、可逆的改动进行测试。

4.3 固件回写与风险控制

修改并保存二进制文件后,需要将其转换回Intel HEX格式,然后写回键盘。

# 将 .bin 转换为 .hex (需要知道起始地址,通常是0x0000) objcopy -I binary -O ihex --change-addresses 0x0000 hi75_firmware_modified.bin hi75_firmware_modified.hex # 写回键盘(键盘需处于ISP模式) sinowealth-kb-tool write -d leobog-hi75 hi75_firmware_modified.hex

write命令会擦除并写入主固件区,不会触及ISP引导程序(除非你指定-s full)。写入完成后,工具默认会尝试让设备重启。断开USB线再重新连接(正常连接,不按ISP键),键盘应该以新固件启动。

核心风险与救砖指南

  1. 最坏情况:写入的固件有致命错误,导致键盘无法正常启动,也无法进入ISP模式(因为ISP是独立的,通常不会损坏)。
  2. 救砖方法:只要ISP引导程序完好,就有救。确保键盘完全断电(包括拔掉电池,如果有的话),然后严格按照ISP进入方法(如按住Esc插线)操作。如果ISP引导程序损坏(概率极低),则需要使用专业的编程器(如CH341A)通过MCU的SWIM或ISP接口进行烧录,这需要焊接线缆,门槛较高。
  3. 安全准则
    • 永远先备份:在进行任何写操作前,确保你有至少一份已知完好的固件备份。
    • 小步快跑:每次只修改一个明确的目标(比如改一个键值),测试成功后再进行下一个。
    • 理解修改:不要盲目替换大段代码。尽量理解你修改的字节代表什么含义。
    • 使用校验和:有些固件可能有校验和。如果你修改了数据但没更新校验和,固件可能拒绝运行。在逆向时要注意是否有校验和计算代码。

5. 常见问题排查与进阶思路

5.1 工具使用与通信问题

即使按照步骤操作,你也可能会遇到各种问题。下面是一个快速排查清单:

问题现象可能原因解决方案
sinowealth-kb-tool报错No device foundhid_open_path failed1. 键盘未进入ISP模式。
2. 系统权限不足。
3. 工具内置的设备ID与你的键盘不匹配。
1. 重新尝试进入ISP模式(换按键组合、USB口)。
2. Linux检查udev规则和用户组;macOS检查输入监控权限。
3. 使用lsusb(Linux)或设备管理器(Windows)查看VID/PID,并用--vendor_id--product_id参数手动指定。
读取或写入过程卡住或报超时错误1. USB连接不稳定。
2. 固件/引导程序不兼容。
3. 指定的--page_size等参数错误。
1. 换用高质量的USB数据线,直接连接电脑后置USB口。
2. 确认你的键盘型号在支持列表里,或ISP MD5匹配。
3. 尝试不指定参数,让工具自动探测(如果支持),或查阅同主控其他键盘的参数。
写入后键盘无反应,无法进入ISP1. 写入的固件有错误,导致启动失败。
2. 意外改写了ISP引导程序区域。
1.这是最需要避免的。确保你写入的是正确的、针对主固件区的、经过验证的hex文件。
2. 尝试强制进入ISP模式(有时需要更长的按键时间或特殊顺序)。如果ISP引导程序完好,仍可救砖。
反汇编工具无法正确识别代码1. 处理器类型或内存模型设置错误。
2. 加载地址不正确。
3. 固件经过压缩或加密(可能性较低)。
1. 确保选择8051家族的正确变体(如SH68F90A可能兼容标准8051指令集,但SFR不同)。
2. 尝试不同的加载地址(如0x0000)。如果固件是从0x8000开始执行的,你需要相应设置。
3. 观察固件开头是否有异常高的熵值(看起来像随机数据),这可能是加密迹象。对于消费级键盘,纯明文固件更常见。

5.2 逆向分析中的难点与技巧

逆向分析固件是个细致活,尤其是面对没有符号表的二进制文件。

  1. 识别库函数和厂商代码:固件中可能链接了厂商提供的库函数,用于处理USB协议、Flash读写等。这些函数往往有固定的模式。例如,USB相关函数可能会频繁访问USBCONUSBADR这类SFR。通过识别这些访问模式,可以给函数重命名,简化分析。
  2. 理解硬件寄存器:必须有一份SH68F90A的数据手册(Datasheet)。你需要知道每个特殊功能寄存器(SFR)的地址和功能。例如,控制某个IO口是输入还是输出的寄存器、控制定时器计数值的寄存器等。没有这份手册,很多代码将无法理解。
  3. 利用字符串和常量:固件中任何可打印的字符串都是宝贵的线索。错误信息(如“USB Init Fail”)、版本字符串(“V1.2.3”)能帮你快速定位到相关功能模块。
  4. 动态分析与模拟:如果条件允许,可以尝试在8051模拟器(如Simplicity Studio中的Simulator)中运行固件片段,观察寄存器和内存的变化。但这需要将固件适配到模拟环境,门槛较高。
  5. 社区协作:像sinowealth-kb-tool这样的项目本身就是社区协作的成果。如果你在逆向Leobog Hi75时发现了键值表或灯效数据的准确位置,分享到相关的论坛(如Geekhack, Reddit的r/MechanicalKeyboards)或项目Issue中,能帮助更多人。

5.3 从逆向分析到自定义固件

逆向分析的终极目标,可能是摆脱原厂固件,刷入像QMK这样的开源固件。但这需要硬件支持(足够的Flash和RAM,以及对应的引脚定义)和大量的移植工作。对于SH68F90A这类MCU,由于其资源限制和专有性,直接移植QMK可能不现实。

一个更可行的路径是,基于逆向分析的结果,开发一个轻量级的、针对特定键盘的“补丁”工具或自定义固件生成器。例如,你可以:

  1. 编写一个Python脚本,读取原厂固件,根据用户提供的JSON配置文件(定义新的键位映射和灯效),自动修改二进制文件中对应的数据块,生成可刷写的.hex文件。
  2. 如果原厂固件功能足够,只是界面难用,你可以逆向其配置协议(可能与Windows驱动通信),然后编写一个跨平台的配置工具。

这个过程不仅需要逆向技能,还需要对USB HID协议、键盘矩阵扫描原理有深入的理解。但回报也是巨大的:你将获得一把完全按照自己心意工作的、独一无二的键盘。

逆向分析Leobog Hi75的固件,就像一次数字考古。你通过sinowealth-kb-tool这把“铲子”,小心翼翼地挖掘出键盘内部运行的秘密。每一次成功的键位修改或灯效自定义,都是对设备掌控感的提升。这个过程充满挑战,但也正是极客精神的体现——不满足于黑盒,非要打开看看里面究竟是怎样一番天地。只要胆大心细,做好备份,你的键盘就能在你的手中获得新生。