吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 22949|回复: 268
收起左侧

[调试逆向] 机械键盘USB协议逆向和利用

    [复制链接]
JuncoJet 发表于 2021-6-7 16:45
本帖最后由 JuncoJet 于 2021-6-9 09:29 编辑

[.前言]
Hello大家好,我应该有好久没在52发帖了吧,灌水除外。原因大概,近段时间都在搞(补习)硬件(模电)方面的东西,不涉及软件/逆向等。不过现在终于得住机会,能够有个擦边内容可以拟个帖子分享大家了。
最近新入手了个D87 RGB单模机械键盘,整体都不错,奢华内涵有档次,就这。
IMG_20210602_202043.jpg
以前用过的键盘不少,青轴60%、青轴104、静电容108等,大多数没有RGB灯,有灯的只有蓝牙控制,台式电脑也没蓝牙,用手机去控制也不方便,这就问尴尬不尴尬。这次新键盘有比较完善的键盘驱动,可以设置键盘宏和灯效,软件界面友好功能完善。只可惜灯效方面只能内置(动态)和自定义静态灯效。然后萌生出一个新奇的想法,能否让键盘灯效玩贪吃蛇,像某贼船键盘一样。但后来我放弃了,原因并不是不行,而是这灯厂太华丽了。
下面内容由逆向分析展开,以及程序验证POC,最终写成一个完整的开发框架。


[.USB协议逆向]
逆向,其实是挺有意思的东西,和推理一样,把已知的线索都罗列出来,推理是用时间线贯穿,逆向则是用逻辑贯穿。去除掉所有的干扰和不可能,剩下的无论怎么不可思议,他都是正确的结果。虽然会有弯路,但总是乐此不疲。
说了这么多,只是要告诉大家,逆向分析都是会比较绕,有很多弯路,请耐心看完。


首先,安装驱动、打开键盘设置软件,灯效设置。使用USBlyzer进行抓包。
Image 197.jpg
设置第一个按键(ESC)为红色,然后我们可以看到抓取到的USB数据如下图
Image 196.jpg
接着我们把颜色改成绿色,可以看到抓取的数据如下图,看上去没有加密,这是个好兆头。
Image 198.jpg

然后抓取第二个键F1,
Image 199.jpg
发现这好像有空了3个字节
Image 200.jpg
继续验证后面的按键,可能键盘空的地方,其实是存在按键的?
经过一系列的抓包,然后整理出来一些猜测,比如每个按键的控制都是明码,传输的是RGB数据占用3字节。
每条报文(是这么叫的么?)头部有12字节是协议头或者命令,共计发送6条数据给键盘

QQ截图20210607154520.jpg
分析之初其实还是有很多弯路的,这是我的笔记,避免把你们看的云里雾里的我就略过了,比如猜测RGB数据是RGB还是RGBA。
很多错误的东西我就不提了,感兴趣可以看下这个笔记的截图


最终整理得到这样的一组信息,后面还会介绍到

[.程序验证POC]
本来打算用VB6来写的,开发速度快,贼好用。后来想想还是算了,QT来写,使用C++开发框架,这样的话方便开源大家一起来完善。而且还能移植到Linux等环境,底层USB库使用libusb-1.0本身具备跨平台性。

第0个简单的验证程序如图,点亮所有LED,变幻颜色。验证失败!
键盘死了,USB Bulk数据发送给键盘后貌似需要读出返回的数据,不然键盘会假死(可能真)状态。
返回的数据,明面上看的话可能是覆盖灯效前的原始数据,未具体研究和验证,因为对我来说用途不大。修正BUG后,接着验证。
如此低级错误,就不补图了,例子同下面,只是缺少发送后接收数据的代码。

第1个简单的验证程序如图,点亮所有LED,变幻颜色。验证成功!
Image 203.jpg
20210604_222607_4769.gif

第2个验证程序如图,顺序点亮所有的LED。验证失败!
20210604_234149_4963.gif
失败的主要原因,猜测可能存在空键位,当顺序点亮到空键位的时候,会出现IO错乱问题
D87灯效数据(修正).png
因为一般键盘或者LED灯(无关共阴极、共阳极),都采用矩阵结构,这样可以减少MCU GPIO的使用。如果不使用矩阵结构的话,87个RGB LED,需要261 GPIO来控制,这是相当烧钱的(需要更高级的MCU或者更多MCU分工、或者使用到锁存器)。
对协议分析,大致的能够推测出空键位所在位置,然后对键位建立映射关系,实现一个完整的控制、开发框架。经过很漫长的分析,最终结果就是上面一张图说明问题。


[.完整开发框架]
通过逆向和上面的验证,基本上了解到了几个信息,USB协议共计发送数据6次,每次发送的是一行键位的RGB数据,每个RGB以3字节存储。键位有可能存在空位,也就是我们必须去除掉这些空位,并且提升实际对键盘灯效操作时的简洁度。所以我大致的把程序写成这么几层

TKbdObj 键盘类。继承下面这些东西,改动下面内容可保持上层名称统一。


TKeyMap 按键映射层。负责转换键盘键值名称到XY
矩阵数据,提供on/off和转换方法。
Image 792.jpg

TLEDS LED逻辑控制层。负责实际控制LED XY矩阵数据逻辑,以及提供R、G、B->RGB的转换方法和向下发送USB层功能。
Image 791.jpg

TUSB USB驱动层。负责主机->键盘底层协议交互。
Image 790.jpg
介绍完框架结构完了,给大家分享几个简单的实例。因为懒,所以没有使用多线程或者Timer之类,QT里面的Timer需要代码自己码,相比VB6难用很多。

点亮键盘最右侧按键,用于检测KeyMap映射数据是否缺损
[C++] 纯文本查看 复制代码
void MainWindow::on_pushButton_3_clicked()
{
    if(!kbd)return;
    int rgb=kbd->rgb(0,0,255);//blue
    kbd->on("pause",rgb);
    kbd->on("pu",rgb);
    kbd->on("pd",rgb);
    kbd->on("\r",rgb);
    kbd->on("up",rgb);
    kbd->on("right",rgb);
    kbd->show();
}

显示I Love You,简单的字节数组显示点亮键盘LED
20210606_014417_297.gif
[C++] 纯文本查看 复制代码
void MainWindow::on_pushButton_2_clicked()
{
    if(!kbd)return;
    char d[2]={0},str[]="iloveyou";
    for(int x=0;x<3;x++){
        kbd->clear();
        for(int i=0;i<sizeof(str);i++){
            d[0]=str[i];
            kbd->on(d,0xFF0000);//red
            if(i){
                d[0]=str[i-1];
                kbd->on(d,0xFF00);//green
            }
            kbd->show();
            Sleep(300);
        }
    }
}

扫描灯,看过霹雳游侠的应该有记忆,童年经典必须复刻一下
[C++] 纯文本查看 复制代码
void MainWindow::on_pushButton_5_clicked()
{
    if(!kbd)return;
    int i;
    char d[2]={0},str[]="asdfghjkl;'";
    for(int x=0;x<3;x++){
        for(i=0;i<sizeof(str)-1;i++){
            d[0]=str[i];
            kbd->on(d,0xFF0000);
            if(i){
                d[0]=str[i-1];
                kbd->off(d);
            }
            kbd->show();
            Sleep(30);
        }
        for(i=sizeof(str)-1;i>=0;i--){
            d[0]=str[i];
            kbd->on(d,0xFF0000);
            if(i<sizeof(str)){
                d[0]=str[i+1];
                kbd->off(d);
            }
            kbd->show();
            Sleep(30);
        }
    }
    kbd->clear()->show();
}

渐变点亮,简单的由暗到亮点亮
[C++] 纯文本查看 复制代码
void MainWindow::on_pushButton_9_clicked()
{
    if(!kbd)return;
    for(int x=0;;x+=20){
        if(x>255)x=255;
        int rgb=kbd->rgb(0,x,0);
        for(int i=0;i<17;i++){
            kbd->on(i,rgb);
        }
        kbd->on("ins",rgb);
        kbd->on("home",rgb);
        kbd->on("pu",rgb);
        kbd->on("del",rgb);
        kbd->on("end",rgb);
        kbd->on("pd",rgb);
        kbd->on("up",rgb);
        kbd->on("down",rgb);
        kbd->on("left",rgb);
        kbd->on("right",rgb);
        kbd->show();
        if(x==255)break;
        Sleep(30);
    }
}


完整的效果如下,例子还有很多,感兴趣可以自行下载源码研究
Untitled.gif
Image 789.jpg


程序需要QT Creator 4编译,没有包含QT库,无法直接运行。
连接键盘时依赖 libusb-1.0 驱动,可以使用zadig来安装,后期将会在github上发布更新目前没上传。

ANNE_EXPLOIT.zip

208.01 KB, 下载次数: 138, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 120吾爱币 +110 热心值 +110 收起 理由
0xC05 + 1 + 1 我很赞同!
levelhan + 1 + 1 谢谢@Thanks!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
0stardust0 + 1 + 1 谢谢@Thanks!
Booneey + 1 + 1 谢谢@Thanks!
心比天傲 + 1 + 1 我很赞同!
Behold + 1 我很赞同!
5a1t + 1 + 1 谢谢@Thanks!
houxiaobai + 1 + 1 用心讨论,共获提升!
wxbz666 + 1 + 1 我很赞同!
maxbyg + 1 谢谢@Thanks!
DSugar + 1 我很赞同!
meng9934 + 1 + 1 我很赞同!
xiaoxiao78 + 1 + 1 我很赞同!
hzl3128 + 1 我很赞同!
slaap + 1 + 1 用心讨论,共获提升!
pobpob1412 + 1 + 1 用心讨论,共获提升!
wangziyi + 1 + 1 谢谢@Thanks!
lyangbao + 1 + 1 热心回复!
zhnb233 + 1 用心讨论,共获提升!
AntDown + 1 + 1 谢谢@Thanks!
fofawb + 1 + 1 用心讨论,共获提升!
Link28 + 1 用心讨论,共获提升!
h5152436 + 1 + 1 用心讨论,共获提升!
Sage-XiQi + 1 + 1 我很赞同!
不二家24122 + 1 谢谢@Thanks!
52HEE + 1 + 1 我很赞同!
csxy999 + 1 我很赞同!
SykinLee + 1 + 1 我很赞同!
anguagua + 1 + 1 我很赞同!
liuy666 + 1 + 1 谢谢@Thanks!
wwq0312 + 1 + 1 用心讨论,共获提升!
xiahhhr + 1 + 1 用心讨论,共获提升!
努力加载中 + 1 + 1 热心回复!
weiye588 + 1 + 1 热心回复!
Camus2021 + 1 + 1 用心讨论,共获提升!
wjsjwr + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
WorldCosplayGir + 1 + 1 谢谢@Thanks!
有人氏 + 1 + 1 我很赞同!
连晋 + 1 + 1 厉害厉害
qwewuhe + 1 谢谢@Thanks!
BBQ789631 + 1 + 1 我很赞同!
Mzb920 + 1 用心讨论,共获提升!
奥怪 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
The-rapist + 1 + 1 用心讨论,共获提升!
zjw912555576 + 1 用心讨论,共获提升!
my2340715 + 1 + 1 高手···厉害哦~
5omggx + 1 + 1 用心讨论,共获提升!
蓝颜永生 + 1 + 1 这就是我仰望的大佬
不爱everyone + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
幼儿园小班 + 1 + 1 强....学习到了.
linden007x + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
生存 + 1 + 1 学到了
huangyuhou + 1 + 1 谢谢@Thanks!
小酒窝 + 2 + 1 必须加分!
pidan瓜 + 1 用心讨论,共获提升!
duyi324 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
VirtualYMonster + 1 + 1 用心讨论,共获提升!
kingty_x + 1 + 1 公众号来的,膜拜大佬
f393349145 + 1 + 1 谢谢@Thanks!
cuishuaishuai + 1 + 1 热心回复!
羽飞仙381 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
学学习系 + 1 + 1 我很赞同!
lianghuajun + 1 + 1 热心回复!
hanxiao666 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Nick_Z + 1 + 1 谢谢@Thanks!
StandUpPLZ + 1 + 1 谢谢@Thanks!
asa888709 + 1 + 1 谢谢@Thanks!
韩小邶 + 1 谢谢@Thanks!
Asser12345 + 1 + 1 谢谢@Thanks!
孤单地走 + 1 + 1 热心回复!
JohnSmith2333 + 1 + 1 用心讨论,共获提升!
pimlapas + 1 + 1 我很赞同!
idol0088 + 1 + 1 没有背光的键盘是不是也可以改~~!
大肉骨头 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
不染 + 1 + 1 用心讨论,共获提升!
q110 + 1 + 1 用心讨论,共获提升!
peterzzx + 1 + 1 我很赞同!
assa + 1 + 1 我很赞同!
卡拉肖克倩 + 1 + 1 这就是我仰望的大佬
a13131154 + 1 + 1 大佬是厉害!!
岁月的纤伴 + 1 + 1 热心回复!
抱歉、 + 1 谢谢@Thanks!
sakura521 + 1 + 1 我很赞同!
叼烟的声音 + 1 + 1 谢谢@Thanks!
OLIKUJYHTGRF + 1 + 1 热心回复!
吾爱Po解啊 + 1 + 1 我很赞同!
_小白 + 1 + 1 我很赞同!
今晚吃dian啥 + 1 + 1 谢谢@Thanks!
kdrew + 1 + 1 谢谢@Thanks!
CWJYBB + 1 + 1 我很赞同!
RainH + 1 + 1 用心讨论,共获提升!
StarvedFish + 1 谢谢@Thanks!
shuaibiliao + 1 + 1 鼓励转贴优秀软件安全工具和文档!
nessuby + 1 + 1 我很赞同!
亦木小鱼鱼 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Gleam + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xyl52p + 1 + 1 酷毙了!
汤姆和托尼 + 1 我很赞同!
DaiTian + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hjadu0720 发表于 2021-6-7 16:54
虽然看不懂,但是肯定很厉害
bachelor66 发表于 2021-6-24 08:52
真的是很厉害的样子啊                                          
chenzhichao 发表于 2021-6-7 16:56
头像被屏蔽
First丶云心 发表于 2021-6-7 16:56
谢谢分享,学习学习!!
Apocalypse 发表于 2021-6-7 16:59
gayhub上有雷蛇的灯光驱动hack
aylitat 发表于 2021-6-7 16:59
哇 这个有点厉害诶。。。而且还挺好玩的
whofly 发表于 2021-6-7 17:03
好厉害的技术贴
race_002 发表于 2021-6-7 17:06
牛人总是让人仰望
孤星s 发表于 2021-6-7 17:32
还能这样。。
yang威武 发表于 2021-6-7 17:33

虽然看不懂,但是肯定很厉害
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 19:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表