这篇文章主要讲述了作者在实施defendnot工具过程中的经历,该工具通过直接使用 Windows 安全中心(WSC)服务 API 来禁用 Windows Defender。
主要经历和成果:
- 一年前曾发布no-defender工具,利用特殊 Windows API 让系统知道有其他杀毒软件而无需运行 Defender 扫描,其通过让第三方杀毒软件在 WSC 中注册来实现,后因杀毒软件开发商的 DMCA 下架请求而删除。
- 此次在首尔 Airbnb 中,因未带 x86 笔记本,仅带 MacBook 进行其他开发,5 月 4 日收到 MrBruh 消息称在研究能否创建“干净”的[no-defender]实现,开始初步研究。
- 第一天通过参考一年前使用的 AV 的 WSC 注册实现,在约 1 小时内重建其所有操作并在 arm64 Windows 中测试,虽获访问被拒错误,但推测 WSC 会验证调用 API 的进程签名,后注入代码成功注册新杀毒软件,在 Twitter 上分享成果。
- 第一天尝试摆脱 AV 二进制文件,选择
cmd.exe
作为受害者进程但 API 拒绝调用,深入研究发现二进制文件在检查调用者进程的 PPL 时出现问题,后因时间太晚去睡觉。 - 第二天开始设置环境,因在 arm64 MacBook 上无法模拟 x86 Windows,向朋友 pindos 借电脑在其虚拟机中调试 WSC 服务,设置过程艰难,包括在不同设备间共享构建工件等。
- 第二天调试 WSC 服务时,发现 WSC 服务是由 svchost 运行的 dll,通过在虚拟机中启用测试模式并编写驱动去除 PPL 保护后得以进行调试,追踪到
WscServiceUtils::CreateExternalBaseFromCaller
函数失败,该函数用于检查调用 RPC 方法的进程是否具有WinDefend
SID。 - 第二天尝试模拟
WinDefend
,经过学习后提出理论并实现,但实际运行时发现虽 COM 调用返回STATUS_SUCCESS
但未注册新 AV,无任何效果。 - 第三天继续分析,发现之前认为通过的 SID 检查实际上未通过,且若通过该检查会操作 Windows Defender 的 WSC 对象但无法直接禁用它,于是开始研究代码的另一分支,发现若
WinDefend
检查未通过,服务会检查调用二进制文件是否提升以及检查特定的DllCharacteristics
标志和签名。 - 第三天使用
Taskmgr.exe
作为受害者进程,因之前代码读取无效的ctx.bin
文件作为 AV 名称导致 WSC 拒绝而出现错误,修复后成功注册新 AV。 - 第三天清理代码,一直工作到 8 点完成除自动运行外的所有工作,后发现自动运行代码不工作是因为笔记本未插电,设置相关复选框后正常工作,又花几小时清理代码。
结论和致谢:
- 这是一次有趣的经历,但不想重复,感谢阅读,稍后会有其他人发布关于 WSC 的更技术文档。
- 感谢 pindos 为调试 WSC 服务加热房间,感谢 MrBruh 的督促和倾听,感谢其他在这几天联系的人,喜欢 Kimchi,还吐槽了墙上被涂鸦的事。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。