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

发布时间:2026/7/4 18:46:03
利用sinowealth-kb-tool逆向分析键盘固件:从原理到实战 1. 项目概述当你的键盘固件不再“黑盒”最近在折腾Leobog Hi75这把键盘起因很简单官方驱动软件的功能实在有限想改个灯效或者自定义个宏要么不支持要么操作起来反人类。相信不少玩过中低端国产机械键盘的朋友都有同感硬件素质可能不错但软件生态总差那么一口气。与其被官方软件束缚不如看看键盘的“大脑”——固件本身。这就是我接触sinowealth-kb-tool这个开源工具的契机它让我能直接读写基于中颖电子Sinowealth8051内核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版本和工具。# 安装rustupLinux/macOS curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh # 安装后需要重启终端或运行 source $HOME/.cargo/env安装好Rust后通过CargoRust的包管理器直接从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然后加入以下内容将xxxx和yyyy替换为你键盘的实际VID和PIDSUBSYSTEMSusb, ATTRS{idVendor}xxxx, ATTRS{idProduct}yyyy, MODE0660, GROUPplugdev SUBSYSTEMSusb, ATTRS{idVendor}0603, ATTRS{idProduct}1020, MODE0660, GROUPplugdev第二行是针对另一个常见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 逆向分析辅助工具选型读写固件只是第一步要“分析”它我们还需要逆向工程工具。这里的主角是反汇编器和十六进制编辑器。IDA Pro / Ghidra这是专业级的逆向分析工具。IDA Pro是付费软件但其对8051架构的支持非常成熟。Ghidra是NSA开源的工具免费且功能强大同样支持8051。它们能将二进制文件反汇编成可读的汇编代码并允许你重命名函数、添加注释、分析程序流程是深度逆向的利器。对于“哪个AI可以分析IDA逆向”这种热词目前并没有成熟的AI能完全替代人工进行复杂的逆向工程分析但一些插件或辅助工具如IDA的插件、Ghidra的脚本可以提升效率。逆向分析专用工具像“易盾点选逆向分析”这类热词通常指针对特定验证码或安全组件的逆向与我们分析键盘固件的目标不同。我们的重点在于理解硬件控制逻辑而非破解安全机制。十六进制编辑器对于初步探查一个优秀的十六进制编辑器必不可少比如010 Editor付费功能极强支持模板解析二进制结构或HxD免费轻量。它们能让你直观地查看固件文件的每一个字节搜索特定字符串如厂商信息、错误提示并手动修改尝试。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可能为0x024f或0x1020的设备。例如你可能会看到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.hex3.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字节序列。例如找到一段数据其值在0x00到0xE7之间USB HID键盘用法的范围并且长度合适那很可能就是键值表。4. 固件逆向分析与关键结构挖掘4.1 反汇编与主流程分析有了二进制文件真正的逆向工作才开始。将hi75_firmware.bin加载到IDA Pro或Ghidra中。第一步是正确设置处理器类型选择8051。然后需要设置正确的ROM起始地址和大小。对于SH68F90A其Flash可能是64KB用户固件区可能占用前60KB0xF000ISP引导程序占用最后4KB0xF000-0xFFFF。在加载时你需要告诉反汇编器正确的加载地址通常是0x0000。加载后反汇编器会从0x0000开始尝试解析代码。如前所述0x0000处应该是一个LJMP指令跳转到主初始化代码CSTARTUP或main函数。你需要顺着这个跳转找到程序的入口点。在8051的逆向中有几个关键点需要注意内存模型8051有独立的代码空间ROM、内部数据存储器IRAM128/256字节、特殊功能寄存器SFR和外部数据存储器XRAM。反汇编器需要知道哪些地址访问的是SFR如P0, P1, TC0N等这通常通过一个.sfc或.xml格式的处理器定义文件来配置。中断服务程序ISR除了复位向量其他中断向量如定时器、串口、外部中断也值得分析。键盘扫描通常由一个定时器中断驱动定期检查按键矩阵的状态。函数识别反汇编器可能无法自动识别所有函数。你需要根据调用约定8051通常用寄存器或固定内存位置传递参数、常见的序言/尾声指令序列来手动定义函数。分析主循环你可能会发现它大致做以下几件事初始化设置IO口方向矩阵的行线为输出列线为输入带上拉、配置定时器用于去抖和扫描、初始化USB控制器。主循环或定时器中断扫描按键矩阵将物理位置转换为键值处理长按、连击等。USB报告处理将当前的按键状态、修饰键状态打包成USB HID报告描述符规定的格式通过USB发送给主机。RGB控制根据模式读取LED颜色数据通过PWM或类似协议如WS2812B的时序控制LED灯珠。4.2 关键数据结构定位与修改逆向的最终目的往往是修改。对于键盘固件最常见的修改目标是键值映射表和RGB灯效数据。定位键值映射表搜索法在反汇编后的代码中搜索对按键矩阵进行解码的函数。这个函数通常会读取某个IO口的状态对应列扫描然后经过计算得到一个索引值。数据引用追踪找到这个索引值被使用的地方它很可能被用来从一个表中查找对应的USB键值。在反汇编代码中你会看到类似MOVC A, ADPTR的指令这条指令常用于从代码空间ROM的表中读取数据。DPTR寄存器指向的就是表的基地址。交叉验证找到疑似表后对照USB HID Usage ID表网上可查看看表中的数值是否对应合理的键值如0x04是a/A0x05是b/B0x1D是z/Z0x29是ESC0xE0是左Ctrl等。表的长度应该等于或略大于键盘的物理按键数。定位RGB灯效数据寻找PWM或时序控制代码搜索对特定IO口控制LED数据线进行操作的指令。对于WS2812B这类灯珠控制代码会包含精确的延时循环来产生0和1码元。查找颜色数组灯效模式如彩虹、呼吸、单色通常对应一个预定义的颜色值数组。这些颜色值可能是24位的RGB每个颜色8位连续存储在ROM中。模式索引固件中可能有一个变量或常量用来选择当前灯效模式。修改这个索引值或者直接修改颜色数组中的数据就能改变灯效。一旦定位到这些关键数据你就可以用十六进制编辑器直接修改.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.hexwrite命令会擦除并写入主固件区不会触及ISP引导程序除非你指定-s full。写入完成后工具默认会尝试让设备重启。断开USB线再重新连接正常连接不按ISP键键盘应该以新固件启动。核心风险与救砖指南最坏情况写入的固件有致命错误导致键盘无法正常启动也无法进入ISP模式因为ISP是独立的通常不会损坏。救砖方法只要ISP引导程序完好就有救。确保键盘完全断电包括拔掉电池如果有的话然后严格按照ISP进入方法如按住Esc插线操作。如果ISP引导程序损坏概率极低则需要使用专业的编程器如CH341A通过MCU的SWIM或ISP接口进行烧录这需要焊接线缆门槛较高。安全准则永远先备份在进行任何写操作前确保你有至少一份已知完好的固件备份。小步快跑每次只修改一个明确的目标比如改一个键值测试成功后再进行下一个。理解修改不要盲目替换大段代码。尽量理解你修改的字节代表什么含义。使用校验和有些固件可能有校验和。如果你修改了数据但没更新校验和固件可能拒绝运行。在逆向时要注意是否有校验和计算代码。5. 常见问题排查与进阶思路5.1 工具使用与通信问题即使按照步骤操作你也可能会遇到各种问题。下面是一个快速排查清单问题现象可能原因解决方案sinowealth-kb-tool报错No device found或hid_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 逆向分析中的难点与技巧逆向分析固件是个细致活尤其是面对没有符号表的二进制文件。识别库函数和厂商代码固件中可能链接了厂商提供的库函数用于处理USB协议、Flash读写等。这些函数往往有固定的模式。例如USB相关函数可能会频繁访问USBCON、USBADR这类SFR。通过识别这些访问模式可以给函数重命名简化分析。理解硬件寄存器必须有一份SH68F90A的数据手册Datasheet。你需要知道每个特殊功能寄存器SFR的地址和功能。例如控制某个IO口是输入还是输出的寄存器、控制定时器计数值的寄存器等。没有这份手册很多代码将无法理解。利用字符串和常量固件中任何可打印的字符串都是宝贵的线索。错误信息如“USB Init Fail”、版本字符串“V1.2.3”能帮你快速定位到相关功能模块。动态分析与模拟如果条件允许可以尝试在8051模拟器如Simplicity Studio中的Simulator中运行固件片段观察寄存器和内存的变化。但这需要将固件适配到模拟环境门槛较高。社区协作像sinowealth-kb-tool这样的项目本身就是社区协作的成果。如果你在逆向Leobog Hi75时发现了键值表或灯效数据的准确位置分享到相关的论坛如Geekhack, Reddit的r/MechanicalKeyboards或项目Issue中能帮助更多人。5.3 从逆向分析到自定义固件逆向分析的终极目标可能是摆脱原厂固件刷入像QMK这样的开源固件。但这需要硬件支持足够的Flash和RAM以及对应的引脚定义和大量的移植工作。对于SH68F90A这类MCU由于其资源限制和专有性直接移植QMK可能不现实。一个更可行的路径是基于逆向分析的结果开发一个轻量级的、针对特定键盘的“补丁”工具或自定义固件生成器。例如你可以编写一个Python脚本读取原厂固件根据用户提供的JSON配置文件定义新的键位映射和灯效自动修改二进制文件中对应的数据块生成可刷写的.hex文件。如果原厂固件功能足够只是界面难用你可以逆向其配置协议可能与Windows驱动通信然后编写一个跨平台的配置工具。这个过程不仅需要逆向技能还需要对USB HID协议、键盘矩阵扫描原理有深入的理解。但回报也是巨大的你将获得一把完全按照自己心意工作的、独一无二的键盘。逆向分析Leobog Hi75的固件就像一次数字考古。你通过sinowealth-kb-tool这把“铲子”小心翼翼地挖掘出键盘内部运行的秘密。每一次成功的键位修改或灯效自定义都是对设备掌控感的提升。这个过程充满挑战但也正是极客精神的体现——不满足于黑盒非要打开看看里面究竟是怎样一番天地。只要胆大心细做好备份你的键盘就能在你的手中获得新生。