AppraiserPatcher11:Win11强制更新

大类
Env
技术标签
原理研究-Windows
开发-HookPatch-Windows
优先级
High
开始日期
Sep 26, 2021
状态
Finalized
Public
Public
最后更新
Jan 22, 2022

Windows更新的基础知识

更新流程

  • 下载更新
  • WinUpdateBox被拉起,用于管理更新目录$WINDOWS.BT
  • SetupHost被WinUpdateBox拉起,用于具体处理更新任务
  • SetupHost中会使用setupcompact检查兼容性,而setupcompact进一步调用appraiser根据ini中的规则检查是否符合条件
  • 其中
    • SetupHost、WinUpdateHost均不能用IFEO,原因不明

调试方法

  • 查看各个地方的setupact.log可以确定不同流程的日志
  • 爆搜更新目录确定具体问题位置

破解限制的方案

已有方案

  • 直接删除appraiser.dll (22445前)
  • 删除appraiserRes.dll(未明)
  • 使用DLL hijack劫持SetupHost并hook使appraiser认为我们是VM,并放宽限制(22468时这个策略消失了)

我的稳定方案

劫持进WinUpdateBox中,hook CreateProcessAsUser拦截对SetupHost的调用,并在调用前替换掉更新目录中的文件

各个版本出现问题的追踪

22445

首个版本,这个版本下WinUpdateBox会提前校验Appraiser.dll是否被篡改,如果被篡改则将其恢复后再执行SetupHost

22463

仔细研究了一下Appraiser.ini和Appraiser.dll,认为最后失败的结果是通过DT_ANY_SYS_BlockingSystem导出的,尝试将该字符串改为DT_ANY_SYS_NonblockSystem成功绕过

22494

setupcompact中也引入了检查,因此同样需要patch
notion image
  • 调用链:
    • ConX::Compatibility::CAggregatedCompatibilityChecker::AddChecker CArrayConX::Compatibility::CCompatibilityCheckerAutoPtr,ConX::Compatibility::CCompatibilityCheckerAutoPtr,CAdaptorDefault,CPoliciesDefault::Append
  • patch点位:直接将Append函数return 0掉

22538

由于我使用MBR+UEFI的方法启动,导致数个dll中的GetSystemDisk函数导向GPT检查逻辑,出现C0000452错误
通过patch GetFirmwareType可重新导向MBR逻辑
45 33 C9 44 8D 43 1F 8D 4B 59 48 FF 15 ? ? ? ? .text:0000000180012747 45 33 C9 xor r9d, r9d ; ReturnLength .text:000000018001274A 44 8D 43 1F lea r8d, [rbx+1Fh] ; SystemInformationLength .text:000000018001274E 8D 4B 59 lea ecx, [rbx+59h] ; SystemInformationClass .text:0000000180012751 48 FF 15 B0 3C+ call cs:__imp_NtQuerySystemInformation
45 33 C9 44 8D 43 1F 8D 4B 59 90 90 B8 FF FF FF FF
 
后续发现这样不行,会导致BcdOpenStore函数报错找不到文件)
通过patch GetSystemDisk让他强制使用BIOS 模式找system disk可以修复