首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >WorkBuddy 实战:一次搞定 Windows「内存完整性」开不了的顽疾——不兼容驱动排查全记录

WorkBuddy 实战:一次搞定 Windows「内存完整性」开不了的顽疾——不兼容驱动排查全记录

原创
作者头像
用户12825353
修改于 2026-10-17 21:41:04
修改于 2026-10-17 21:41:04
720
举报

WorkBuddy 实战:一次搞定 Windows「内存完整性」开不了的顽疾——不兼容驱动排查全记录

全文基于真实排查过程整理,所有命令均可直接复用。


一、问题现场

Windows 安全中心 → 设备安全性 → 内核隔离 → **内存完整性**:开关是灰的、关着的,系统提示「存在不兼容的驱动程序」。

点开「查看不兼容的驱动程序」,列出 7 个 .sys 文件:

代码语言:txt
复制
ew_usbccgpfilter.sys

hw_cdcacm.sys

hw_quusbmdm.sys

hw_usbdev.sys

USBDrv.sys

PassGuard_x64.sys

内存完整性(HVCI,基于虚拟化的代码完整性保护)是 Windows 里防护等级很高的一项安全能力,它会拒绝加载任何试图直接改动内核的驱动。**只要有一个不兼容驱动在,开关就打不开。**

这篇文章记录的是:如何用 WorkBuddy 从「一串文件名」一路查到「每个驱动的身世」,再安全地清理掉它们。


二、核心思路:三步定位法

**千万别只看文件名就下结论。** 这是本次排查最大的教训,后面会详说。

| 步骤 | 手段 | 可信度 |

| -- | -------------------------------------------- | ------- |

| 1 | 看 .sys 文件名猜归属 | ❌ 只能当线索 |

| 2 | 读 INF 的 Provider / Class 字段 | ✅ 确定厂商 |

| 3 | 从 .sys 二进制里提取 CompanyName 和 **PDB 调试路径** | ✅✅ 铁证 |

| 4 | 查注册表卸载项 / 服务项,确认软件真名 | ✅✅ 最终确认 |

第 3 步是这次能破案的关键。驱动编译时会在二进制里留下 PDB 符号文件路径,那个路径常常直接暴露开发者的工程目录名——比任何文件名都准。


三、实操过程

3.1 先摸清全量:扫一遍所有已安装驱动包

Windows 把第三方驱动包安装成 C:\Windows\INF\oemNN.inf。

代码语言:bash
复制
cd /c/Windows/INF

for f in oem\*.inf; do

  if grep -aqiE "huawei|hw\_|ew\_|usbdrv|sdt|passguard" "$f" 2>/dev/null; then

    echo "--- $(basename $f)"

    grep -aiE "^\s\*(Provider|Class|DriverVer)\s\*=" "$f" | head -3 | tr -d '\r'

  fi

done

这一步的价值是**拿到 oem 编号**,后续 pnputil /delete-driver 就靠它。

注意:这里扫出来的数量往往比 Windows 安全中心列出的**更多**。安全中心只列它判定为不兼容的,实际同族驱动可能有好几份。

3.2 读 INF 确认厂商

代码语言:bash
复制
grep -aiE "ProviderName|Class=|DriverVer" /c/Windows/INF/oem89.inf | head -5

华为那几个都返回 Provider = Huawei Technologies Co., Ltd.,版本 2012–2016 年。

3.3 反查 .sys 归属(关键一招)

Windows 的 Get-Item.VersionInfo 在某些环境下读不出驱动文件的版本信息,直接解析二进制更可靠:

代码语言:python
复制
import re

path = r"C:\Windows\System32\drivers\PassGuard\_x64.sys"

data = open(path, 'rb').read()



res = []

# UTF-16LE 字符串(Windows 资源段的常见编码)

for m in re.finditer(rb'(?:[\x20-\x7E]\x00){4,}', data):

    res.append(('U16', m.group().decode('utf-16-le')))

# ASCII 字符串

for m in re.finditer(rb'[\x20-\x7E]{5,}', data):

    res.append(('A', m.group().decode('ascii')))



keys = ['Company','FileDescription','Product','Copyright','Internal',

        'Original','Version','.pdb','Guard','Bank','Key']

seen = set()

for tag, s in res:

    for k in keys:

        if k.lower() in s.lower() and len(s) < 120 and s not in seen:

            seen.add(s)

            print(f"[{tag}] {s}")

PassGuard\_x64.sys 的输出里有这么一行:

代码语言:txt
复制
[A] C:\workdriver\workspace\PassGuard\_driver\...\SysEnterHook.pdb

从驱动二进制里提取的字符串:PDB 路径直接暴露了工程名 **SysEnterHook**——一个 2011 年的系统调用钩子驱动,这是内存完整性的典型“一级通缉犯”。

3.4 查注册表,拿到软件真名

代码语言:bash
复制
reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" \

  /s /f "PBCCRC" | grep -iE "DisplayName|Publisher|UninstallString"

四、教训:一个差点酿错的误判

我在排查中看到 PBCCRC 和目录 C:\Windows\SysWOW64\PBCCRCNew\,第一反应是「**农行网银**」——因为 ABC 才是农行,PBCCRC 看着也像某个银行缩写。

**错了。** 查卸载项名称才看到真身:

代码语言:txt
复制
DisplayName: 人行征信中心密码控件非插件版

PBCCRC = People's Bank of China Credit Reference Center —— **中国人民银行征信中心**,不是农业银行。这个控件用于登录 ipcrs.pbccrc.org.cn 查个人信用报告时的密码安全输入。

**如果只凭文件名和目录名猜,就可能给用户一个错误的卸载建议。** 卸载后果完全不同:一个是网银,一个是查征信。

这条原则值得写进任何排查流程:**文件名只是线索,卸载项名称 / PDB 路径才是证据。**


五、动手前的安全确认(不可跳过)

删驱动前必须确认「没有设备在用」。

5.1 查设备是否还在线

代码语言:bash
复制
cd /c/Windows/System32

./pnputil.exe /enum-devices /instanceid "USB\VID\_12D1&PID\_107E\9FK5T19525006989"

华为 VID 是 12D1。这次查到的状态是**已断开连接**(幽灵条目/Phantom),且当前系统里没有任何华为 USB 设备在线 —— 清理是安全的。

5.2 移除幽灵设备条目

代码语言:bash
复制
./pnputil.exe /remove-device "USB\VID\_12D1&PID\_107E\9FK5T19525006989"

这个设备的 UpperFilters 正挂在 ew\_usbccgpfilter 上,不先摘掉设备,驱动包删不掉。


六、执行清理:优先官方卸载器,其次脚本化批处理

6.1 有官方卸载程序的,走官方

密码控件目录里有 uninst.exe,先确认它是什么安装器打的包:

代码语言:bash
复制
python -c "

d=open(r'C:\Windows\SysWOW64\PBCCRCNew\uninst.exe','rb').read()

for p in [b'Nullsoft',b'NSIS',b'Inno Setup',b'/VERYSILENT']:

    print(p, b'YES' if p in d else 'no')

"

确认是 **NSIS**,于是用静默参数走官方卸载流程,而不是手撕文件:

代码语言:bat
复制
"C:\Windows\SysWOW64\PBCCRCNew\uninst.exe" /S

卸载后:服务 PBCCRCPassGuardXInputService 完全移除;内核服务 PassGuard 被标记 DeleteFlag=1(重启后消失);PassGuard\_x64.sys 因被占用需要重启后删。

6.2 纯残留驱动包,用 pnputil 删

代码语言:bat
复制
pnputil /delete-driver oem89.inf /uninstall /force

pnputil /delete-driver oem90.inf /uninstall /force

pnputil /delete-driver oem91.inf /uninstall /force

pnputil /delete-driver oem63.inf /uninstall /force

pnputil /delete-driver oem29.inf /uninstall /force

pnputil /delete-driver oem1.inf  /uninstall /force

pnputil /delete-driver oem49.inf /uninstall /force

6.3 顽固的 DriverStore 目录

有些目录只躺在 C:\Windows\System32\DriverStore\FileRepository\ 里、没有对应 oem INF,受 TrustedInstaller 保护,普通删除无效:

代码语言:bat
复制
takeown /F "C:\Windows\System32\DriverStore\FileRepository\usbdrvco.inf_amd64\_87cd3882f8de0a03" /R /A /D Y

icacls "C:\Windows\System32\DriverStore\FileRepository\usbdrvco.inf_amd64\_87cd3882f8de0a03" /grant Administrators:F /T /C /Q

rmdir /s /q "C:\Windows\System32\DriverStore\FileRepository\usbdrvco.inf_amd64\_87cd3882f8de0a03"

6.4 提权执行

需要管理员权限时,把命令写成 .bat,再用:

代码语言:powershell
复制
Start-Process -FilePath 'C:\path\to\clean.bat' -Verb RunAs

成脚本执行比逐条手工敲要稳,也方便复查和复用。


七、重启后的收尾与验证

代码语言:bash
复制
# 1. 驱动文件是否已删

ls /c/Windows/System32/drivers/PassGuard\_x64.sys



# 2. 服务是否已消失

sc query PassGuard



# 3. oem INF 里是否还有残留

grep -rliE "huawei|usbdrv|passguard" /c/Windows/INF/oem\*.inf



# 4. HVCI 状态

reg query "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity"



# 5. 固件层虚拟化是否就绪

systeminfo | grep -iE "虚拟机监控|Hyper-V"

最后回到 Windows 安全中心 → 内核隔离,点**重新扫描**,开关即可打开。

本次结果:**内存完整性成功开启 ✅**,并额外解锁了「内核模式硬件强制堆栈保护」。


八、踩坑清单(照着避)

| 坑 | 现象 | 解法 |

| ----------------- | ----------------------------- | --------------------------------------- |

| PowerShell 输出不回显 | exit 0 但没有 stdout | 改用 Bash + find / grep / reg query |

| 中文输出乱码 | sc query / pnputil 返回 GBK | 管道接 iconv -f GBK -t UTF-8 |

| DriverStore 目录删不掉 | 拒绝访问 | takeown + icacls + rmdir /s /q |

| 驱动文件删不掉 | 被占用 | 重启后删,服务 DeleteFlag 也要等重启 |

| **漏网之鱼** | 同一驱动有多份 INF | 必须全量扫 oem\*.inf,不能只删安全中心列出的 |

| **误判归属** | 只看文件名 | 用 PDB 路径 + 卸载项 DisplayName 交叉验证 |

本次就吃了一个漏网之鱼的亏:安全中心只列了一个 USBDrv.sys,实际系统里藏着两套 SDT 残留——usbdrvco.inf 目录 + 真正安装过的 oem49.inf,两套都得清。


九、⚠️ 一条必须写下来的安全警告

**本文的「清理华为驱动」逻辑,只适用于「华为软件卸载后的残留」。**

如果你用的是**华为原厂笔记本**,华为驱动是硬件正常工作所必需的(指纹识别、电源管理、显卡切换、快捷键、多屏协同),**严禁套用本文的清理操作**,误删会直接导致硬件功能失效。

判断标准很简单:设备管理器里还有没有在用的华为设备?有,就一个都别动。


十、为什么这类任务适合交给 WorkBuddy

回顾整件事,真正耗时的不是执行,而是**在几十个 oem INF、几百兆的驱动库里做交叉比对和归属判定**。这类工作有三个特点:

  1. **读操作远多于写操作** —— 枚举、解析、追踪占了八成工作量;
  2. **需要跨工具串联** —— 文件系统、注册表、二进制解析、pnputil 得配合着用;
  3. **错了代价不对称** —— 删错一个硬件驱动,可能要重装系统。

WorkBuddy 的价值在于:它能把这些串成一条流水线自己跑完,只在真正要删除的那一刻停下来确认。**读和查它全权处理,删之前它会先告诉你影响范围。**

最后一点体会:**AI 给结论前,也要给它交叉验证的习惯。** 这次如果不是查了卸载注册表项,就会把央行征信中心的控件当成农行网银,给出一个听起来很自信、实际完全错误的建议。


附录:命令速查表

代码语言:bash
复制
# 列出所有第三方驱动包

ls /c/Windows/INF/oem\*.inf



# 按关键字搜驱动包

grep -rliE "关键字" /c/Windows/INF/oem\*.inf



# 读 INF 厂商信息

grep -aiE "^\s\*(Provider|Class|DriverVer)\s\*=" /c/Windows/INF/oemXX.inf



# 枚举驱动包

pnputil /enum-drivers



# 删除驱动包

pnputil /delete-driver oemXX.inf /uninstall /force



# 枚举/移除设备

pnputil /enum-devices /instanceid "<实例ID>"

pnputil /remove-device "<实例ID>"



# 查服务

sc query <服务名>

reg query "HKLM\SYSTEM\CurrentControlSet\Services\<服务名>"



# 查软件卸载项(拿真名)

reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /s /f "关键字"

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • WorkBuddy 实战:一次搞定 Windows「内存完整性」开不了的顽疾——不兼容驱动排查全记录
    • 一、问题现场
    • 二、核心思路:三步定位法
    • 三、实操过程
      • 3.1 先摸清全量:扫一遍所有已安装驱动包
      • 3.2 读 INF 确认厂商
      • 3.3 反查 .sys 归属(关键一招)
      • 3.4 查注册表,拿到软件真名
    • 四、教训:一个差点酿错的误判
    • 五、动手前的安全确认(不可跳过)
      • 5.1 查设备是否还在线
      • 5.2 移除幽灵设备条目
    • 六、执行清理:优先官方卸载器,其次脚本化批处理
      • 6.1 有官方卸载程序的,走官方
      • 6.2 纯残留驱动包,用 pnputil 删
      • 6.3 顽固的 DriverStore 目录
      • 6.4 提权执行
    • 七、重启后的收尾与验证
    • 八、踩坑清单(照着避)
    • 九、⚠️ 一条必须写下来的安全警告
    • 十、为什么这类任务适合交给 WorkBuddy
    • 附录:命令速查表
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档