干掉 Windows 10 21390 的时间炸弹
为什么要这么做呢,因为 Windows 10 19045 并不支持USB4, 而 20348 即 Server 2022 的 Client 转化版在笔记本上安装会导致随机蓝屏并且没有声音。天杀的微软一定要你用非常之难用的 Windows 11。
注: 21390的 USB4 Host Router 驱动显示代码31,因此还是无法使用,微软你妈死了
根据以下这篇文章参考得: (https://computernewb.com/wiki/How_to_debomb_Windows_10/Server_2016_betas)
在 UEFI 启动下, 需要 Patch 的文件有如下:
- bootmgfw.efi
- winload.efi
- winresume.efi
- ci.dll
三个 efi 文件需要打补丁的内容都一样, 就是需要忽略 ImgpValidateImageHash
返回值并强制设置为 0, 这边偷懒一点可以直接在调用完之后将 eax 的值设置为 0, 有好几个位置, 每个都要打。(那我为什么不直接改这个函数呢, 因为别人也是这么改的(bushi))

三个 efi 还有一个地方需要打补丁就是 BlImgQueryCodeIntegrityBootOptions
内, 强制开启无完整性验证的选项, 即第二个参数, 直接将其设置为 1 即可

而 ci.dll 需要打补丁的内容位于 MinCryptVerifyCertificateWithPolicy2
函数内, 其中可以找到设置返回值为 0xC0000605
(STATUS_IMAGE_CERT_EXPIRED) 的代码,通过修改跳转使得代码不跳转到这段代码内即可


ci.dll 还承担了获取测试版 Windows 过期日期的的功能, 函数名叫CiGetBuildExpiryTime
,将其输出直接改为 0 即可让 Windows 认为这个版本不会过期

由于这个版本的 Windows 是有符号的, 所以修改起来非常简单。
修改完之后将这些文件替换回 Windows 中即可获得拆除了时间炸弹的 Windows 10 21390, 即为最后的 Windows 10.

由于 21390 已经被微软在更新服务器上删除了, 所以通过 uupdump 并不能下载到, 这边使用的是 webarchive.org 上存留的版本.
修改后的文件:
当然这么修改完之后还有一些奇怪的问题, 比如 mmc.exe 会被 UAC 阻止打不开不知道为啥, 以及所有本来不会有 UAC 弹窗的操作会出现 UAC 弹窗, 待探索...
不过基本能用了
EDIT:
直接修改 crypt32.dll 的 CertVerifyTimeValidity 让他一直返回 0 就能修复以上问题。
EDIT #2:
修改 crypt32.dll 的 CertVerifyTimeValidity 会导致炸激活并且 appx 无法安装, 换地方修改 wintrust.dll 的 WinVerifyTrust 使其一直返回 0 也可以达到类似的效果,除了查看数字签名时依旧会显示过期。
注意不要直接使用类似 mov rax, 0; ret;
的修改方法,会使一些组件崩溃,请找到 SetLastError 的地方再对返回值进行修改。