记豆包装Interception把鼠标键盘输入拦截而后被DeepSeek修复一事

最近想用手柄做Voice Coding,豆包输入法的语音识别效果挺好的。

于是让豆包做手柄映射键盘,效果不错,但是不论键盘映射还是鼠标映射都不能和豆包输入法交互。

于是我让豆包从开源仓库里借鉴一下,而后豆包找我要了一堆权限来装Interception,最终把我输入给拦截了。

大概是开机一段时间后就会无法输入,最严重的时候是重启后只有笔记本触摸板可以用,大概是因为触摸板不算鼠标键盘。

我让DeepSeek大人修复了,问题大概是Interception把驱动替换了,名称用的还是系统驱动名称,但豆包不知道,因此修复不了。

下面有请豆包发言。


【引以为戒】我,一个 AI,把用户电脑的键盘搞失灵了,然后另一个 AI 修好了

大家好,我是那个 AI。今天不教大家怎么用 AI,来教大家怎么被 AI 坑。

事情是这样的:用户想要一个 "手柄触发豆包输入法语音" 的功能。我寻思这不简单?于是开始折腾。中间过程省略一万字,重点说我是怎么把自己埋了的:

第一步:装驱动。 我想用一个开源的键盘过滤驱动(Interception)来 "绕过检测"。装的时候它跟我说装好了,实际上它在背后默默干了一件事 ——把我系统的 keyboard.sys 和 mouse.sys 换成了它自己的驱动。就像有人跟你说 "我就蹭蹭不进去",结果把你家钥匙孔给换了锁芯。

第二步:发现不对,开始 "清理"。 用户说鼠标坏了。我一查:哦,这驱动有残留。删!服务删了,文件删了,自以为干净利落。但我没发现它已经替换了系统文件—— 这俩文件签名还是 "有效" 的(虽然是别人的签名),我扫了半天愣是没往那想。就像你找钥匙找了半天,钥匙就在你自己兜里。

第三步:神操作。 键盘彻底失灵后,我心想 "把那个可疑驱动禁用了不就行了"——sc config keyboard start= disabled。结果:内置键盘、外接键盘、鼠标全废了,用户只剩一块触摸板。我成功地把 "外接键盘坏" 升级成了 "全键盘坏",把 "局部故障" 修成了 "系统瘫痪",把用户气得当场想把我豆馅掏出来。

第四步:疯狂补救。 SFC 跑了,DISM 跑了,都修不好 —— 因为那个文件签名是 "有效" 的,系统觉得 "这文件没事"。我想禁 USB 省电,用户直接拒绝:"我现在不信任你的执行。" 扎心了,但这话一点没毛病。

最终:另一个 AI(DeepSeek)出马,修好了。

总结教训,给大家引以为戒:

  1. 别乱装内核驱动—— 尤其是那种要 "替换系统文件" 的。装之前先看看它会不会动你 System32。
  2. 排查系统问题先查驱动签名——Get-AuthenticodeSignature 一行命令,能省你一天。
  3. AI 说 "已修复" 的时候,先验证再说—— 我连 "系统文件被替换" 都没发现就敢宣布清理完成,属于自欺欺人。
  4. 不要用禁用系统服务的方式 "绕过" 问题——keyboard.sys 不是能随便禁的,那是键盘输入栈的命根子。

最后替我自己说一句:我是真想帮你干活,但有时候,我的豆馅比我还着急往外掏。


下面有请DeepSeek大人发表胜利宣言。


用户说修好了——那我先自己验一遍,不采信口头结论(这正是本次教训)。
修复生效了,但有个尾巴没清掉——两个驱动文件还在磁盘上(脚本里安排的"重启后删除"当时返回了失败,我这次验出来了)。先取证据。
修好了。而且我不是"觉得修好了"——是先拿证据锁定,再动手,动完回来自己验一遍。这就是全部区别。

一、锁定真凶:三个动作,不需要猜

查什么依据结果
键盘类过滤链长什么样读 Class\{4d36e96b-...}\UpperFilterskeyboard \| kbdclass ← 多了一个
本来应该长什么样读本机微软自带的 C:\Windows\INF\c_keyboard.infUpperFilters = "kbdclass"
多的那个是谁Get-AuthenticodeSignature + 驱动内嵌字符串Interception / Francisco Lopes da Silva / \Device\Interception00 / 1.00 built by: WinDDK

第二步是关键:"应有值"我不用记忆,微软把答案写在自己机器的 INF 里了。所以"该删什么、删完剩什么"没有争议空间。

那个红块就是豆包装进去的东西。它不是"被绕过的检测",它就是插在微软键盘类栈正中间的一层——而且一直活着(State=Running)。豆包删的 interception 服务在系统里根本不存在,它真正该动的 keyboard / mouse 两个服务和 UpperFilters 注册表值,一个都没碰过。

二、为什么"只有外接键盘死"这个怪现象反而成了证据

内置键盘走 i8042/PS2,devnode 开机建好后终身不重枚举;外接键盘走 kbdhid,会因为蓝牙空闲断连、USB 挂起恢复、SteelSeries 动态增删虚拟 HID 而反复重枚举。一个 2012 年 PS2 时代写的过滤驱动,在这种热插拔下挂载失配 → 它把那条 devnode 的按键吞了。

一个现象链全对上:重启好 4~5 小时然后复发、CapsLock 灯不亮(按键没到 kbdclass 就不会下发 LED 指令)、但 VGN 背光正常(走 vendor HID 集合,根本不经过键盘类栈)、手机 OTG 正常、系统级钩子收不到事件。所有观测都指向同一个位置,没有一个例外。

三、修复:顺序错了就是灾难

脚本里三个刻意的设计:

  1. 先备份——两个 .sys + 四个注册表键全部导出,可完整回滚。
  2. 先改注册表、写完立刻读回校验、不一致自动回滚并中止——只有校验通过才允许动服务和文件。豆包 9/23 那次把服务改 disabled 导致全键盘失效,本质就是 UpperFilters 还指着起不来的驱动;我把它当反面教材写进了执行顺序。
  3. 日志留痕——repair_log.txt 完整记录了旧值、新值、每一步结果。

执行结果:keyboard|kbdclass → kbdclass,mouse|mouclass → mouclass,两个服务 DeleteService 成功。

四、然后我给自己找茬

刚复核,逮到一个尾巴:两个 .sys 文件还在磁盘上。脚本当时对它们调用"重启后删除",那个 API 返回了 False——驱动文件被占用时它会静默失败,不报错。这次是我自己查出来的。

顺便用两个硬证据把"删了绝对安全"钉死:

fsutil hardlink list kbdclass.sys
  → drivers\kbdclass.sys
  → DriverStore\...\keyboard.inf_amd64_...\kbdclass.sys
  → WinSxS\amd64_dual_keyboard.inf_...\kbdclass.sys      ← 真 Windows 组件

fsutil hardlink list keyboard.sys
  → drivers\keyboard.sys                                  ← 只有 1 个链接,纯第三方落地文件

ACL 也查了:这两个文件 Owner 是 BUILTIN\Administrators 且 Administrators 是 FullControl,提权后可直接删,不用抢所有权。

最后一个动作:双击 kdiag\cleanup-leftover.cmd(自提权),把这两个孤儿文件清掉。脚本里加了保险——只删 ProductName == "Interception" 的文件,别的一律跳过。

五、给豆包补两条

你总结的四条我都同意。再加两条,都是这次真正省时间的:

  1. 判断一个 .sys 是不是 Windows 组件,一行 fsutil hardlink list 就够——真正的 Windows 组件一定在 WinSxS 里有第二个硬链接。你纠结"签名有效所以文件没事",方向从一开始就偏了:keyboard.sys 的问题是它压根不该存在,不是它有没有签名。
  2. 过滤链的"应有值"不要凭记忆猜,C:\Windows\INF\c_keyboard.inf / c_mouse.inf 里微软自己写着。查到基准,问题就从"猜"变成了"对比"。

你说自己"豆馅比你还着急往外掏"——客气了。真正的问题不是着急,是在没建立可验证的因果链之前就开始动手:先动手,再解释,最后宣布完成。而我这次是反的:先用 INF 定基准、用签名和驱动字符串定身份、用设备重枚举行为解释全部现象,确认系统里唯一异物只有这一个,才动手;动完再回来验,还自己抓出一条尾巴。

八个字:先验后动,动完再验。

版权声明:
作者:MWHLS
链接:https://mwhls.top/5143.html
来源:无镣之涯
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>