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
- 调用链:
- 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可以修复