查看: 29952|回复: 64

[技术] 简单聊聊我如何从Windows11平滑降级回Windows10

[复制链接]
Windows_Air 发表于 2021-9-22 19:47 | 显示全部楼层 |阅读模式
快御云安全
摘要

本文提出了一种方法,该方法借助Windows Setup的升级功能,允许Windows10以上版本用户在保留个人设置与资料的情况下,实现不同版本系统的平滑迁移而无需全新安装。该方法已在22458(Windows11)和20190(Windows10)下进行了测试,均已成功迁移回19044(21H2)。



前言

距离Windows10最早的预览版发布已经过去六七年了,而Windows11的第一个正式版本将于下个月发布,眼下我还停留在20190(Windows10)。这是一个令人尴尬的版本,内存泄漏、声卡爆破,每个月总要来这么几次的绿屏……老实说,如果不是因为解决了WSL2不能启动的问题,说啥我也不会来到这个版本。

我相信不少preview用户和我有着一样的遭遇:“升级了之后就回不去了”、“没有回滚就只能全新安装”。我停在20190版本可能已经快一年了(这个版本早在今年1月就已经过期),为的就是等到Release版本跑到20190前面,抓紧最后的升级机会。不过现在看来,微软已经打算全面推进Windows11,20000+版本号之后都会属于Windows11。

这里我就不得不提一嘴Win11,为了照顾Win10用户的使用习惯,微软甚至贴心地提供了10天的回滚机会,我的心里只有感恩了已经

好了,闲话不多说,我们直接进入实操环节。在接下来的章节中,我将介绍Windows的升级检测机制,简要阐述其检测原理以及绕过方法;此外,我还将给出在进行版本迁移后遇到的一些常见问题的解决方法。

从Setup入手,看看一般的升级步骤

在较新版本的Windows安装程序中,你能看到有选择要保留的内容这一步,对于安装较新版本的Windows来说,你可以选择保留个人文件和应用一项,这样升级之后个人资料和相关的环境就不会遭到破坏。



然而,当你想要安装较旧版本的系统时,这项就不起作用了,这也意味着只能全新安装。实际上,要想“保留个人文件和应用”,需要通过兼容性测试,其中的几个测试点有:

  • 磁盘空间大小
  • 目标系统是否兼容CompactOS
  • 目标系统是否兼容Bitlocker
  • 许可证正常
  • 目标系统不是Staged Build版本
  • 是否支持UEFI、安全启动等
  • 是否从VHD启动
  • 目标系统的版本是否符合要求
  • ...

具体的兼容性检查项目不是我们讨论的重点。这些信息可以在C:\$WINDOWS.~BT\Sources\Panther\CompatData*.xml中查找到。

庆幸的是,我们只需要关注目标系统的版本是否符合要求,而微软暂时没有作过多的判断,我们可以相对容易地绕开这一点。

实操:绕过安装过程中的版本检测

实际上,微软目前的采取的版本检测方法也相当粗暴:直接检测两个版本号字符串,看目标系统的版本号是否大于当前系统的版本号。

方法一

这里需要用到反汇编工具,我用的是IDA,你也可以用别的。

加载镜像中的source\setupcompact.dll文件,查找到ConX::Setup::Common::CWindowsVersion::IsLaterThan方法(直接简单搜索IsLaterThan也行):



这个函数就是判断版本号字符串的了,可以看到整个函数相对比较简单,在该函数的末尾有两个label,分别是返回0和返回1,这里直接全部返回0,把mov eax, 1改成mov eax, 0就行。

保存对DLL的修改,替换原本的source\setupcompact.dll文件即可。

微软将setupcompact.dll的符号文件放在公共符号文件服务器上了,大大节省了我们解析相关代码的时间。

方法二

法一看着可能有些麻烦,如果不使用反汇编工具行不行?你也可以用WinHex等十六进制编辑工具直接进行修改,但是我不推荐采用这个方法。(我使用的是19044 x64版本的镜像)

打开编辑工具,直接搜索十六进制数据B801000000C3。你可能会找到多个结果,在这些结果中,观察B801000000C3出现的位置,如果在它之前的不远处出现33C0C3的一串数据,那么就是我们想要的那个结果。 将B801000000C3中的01替换为00,保存后替换原始的setupcompact.dll即可。



现在,执行setup.exe,你就可以从高版本“升级”到低版本了:





“升级”之后:常见问题解决

在升级之后,你有极大的概率遇到如下的问题:

  • 登录黑屏
  • 任务栏搜索没反应
  • 开始菜单唤出速度慢
  • 商店应用不能使用/微软商店应用不见了

这里我提供一种解决方法(不完美,存在很多问题):

  • 在PE下操作,否则容易蓝屏
  • 删除C:\ProgramData\Microsoft\Windows\AppRepository目录下的所有StateRepository*文件
  • 重新进入系统,在powershell下运行Get-AppxPackage -AllUsers| Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}。这一步的目的是恢复微软商店。

总结

我原本想写写自己是如何发现这个方法的,奈何探寻的过程枯燥而乏味,大多数读者对此不感兴趣,加之自身水平有限,没法进一步展开来讲,因此文中只取IsLaterThan加以讨论,感兴趣的读者可以自行深入了解。

当然,上述的方法同样存在一些问题。我没有做很详尽的测试,但目前来看我的开发环境基本运行正常,这里我简要列举一些测试过的模块:

正常的功能模块

  • WSL1
  • WSL2
  • Hyper-V / Docker(带有硬链接)

存在问题的功能模块

  • 各类商店应用(均需要重新安装,可能是我的操作有问题)
  • 颜色配置文件(降级之后我的色彩管理炸了,不过也有可能是显卡驱动的问题)

评分

6

查看全部评分

Feige 发表于 2021-9-22 21:41 | 显示全部楼层
最好的方法格式重装,不然不知道有什么BUG

评分

1

查看全部评分

回复

使用道具 举报

rubycon 发表于 2021-9-22 21:52 | 显示全部楼层
本帖最后由 rubycon 于 2021-9-22 22:27 编辑

不是说将 Win11 ISO 中的 install.wim 替换为 Win10 ISO 中的 install.wim,然后挂载替换后的 Win11 ISO,点 setup.exe,就可以保留全部数据降级到 Win10 了么?
回复

使用道具 举报

Windows_Air  楼主| 发表于 2021-9-22 22:24 | 显示全部楼层
rubycon 发表于 2021-9-22 21:52
不是是将 Win11 ISO 中的 install.wim 替换为 Win10 ISO 中的 install.wim,然后挂载替换后的 Win11 ISO,点 ...

这个最多骗过安装程序,等重启还是会出错误代码
回复

使用道具 举报

rubycon 发表于 2021-9-22 22:26 | 显示全部楼层
Windows_Air 发表于 2021-9-22 22:24
这个最多骗过安装程序,等重启还是会出错误代码

难道不让继续安装了么?

重启后,不是释放 *.wim 了么?
回复

使用道具 举报

Windows_Air  楼主| 发表于 2021-9-22 22:29 | 显示全部楼层
rubycon 发表于 2021-9-22 22:26
难道不让继续安装了么?

重启后,不是释放 *.wim 了么?

您说的这个方法之前我已经试过了,重启在释放过程中会报错
注意我说的是“升级”,不是全新安装
回复

使用道具 举报

疯狂报紫丷 发表于 2021-9-22 22:31 | 显示全部楼层
rubycon 发表于 2021-9-22 21:52
不是说将 Win11 ISO 中的 install.wim 替换为 Win10 ISO 中的 install.wim,然后挂载替换后的 Win11 ISO,点 ...

之前安装11有限制 就有人提出这种方法换内核安装 反客为主应该也可以
回复

使用道具 举报

Windows_Air  楼主| 发表于 2021-9-22 22:35 | 显示全部楼层
rubycon 发表于 2021-9-22 22:26
难道不让继续安装了么?

重启后,不是释放 *.wim 了么?

你可以试试看,我之前试过,在重启后会报错。注意这里说的是“升级”选项,不是全新安装
回复

使用道具 举报

rubycon 发表于 2021-9-22 22:48 | 显示全部楼层
Windows_Air 发表于 2021-9-22 22:29
您说的这个方法之前我已经试过了,重启在释放过程中会报错
注意我说的是“升级”,不是全新安装


我肯定知道是降级安装,而不是全新安装了

全新安装根本不在此讨论之列了。
回复

使用道具 举报

Windows_Air  楼主| 发表于 2021-9-22 22:52 | 显示全部楼层
rubycon 发表于 2021-9-22 22:48
我肯定知道是降级安装,而不是全新安装了

全新安装根本不在此讨论之列了。

是的,你可以试试看,看看结果如何
回复

使用道具 举报

xfeiyun 发表于 2021-9-22 23:06 | 显示全部楼层
嗯,有机会可以一试。
回复

使用道具 举报

chengyiqun 发表于 2021-9-23 09:10 | 显示全部楼层
感谢艾拉亲的分享
回复

使用道具 举报

Windows_Air  楼主| 发表于 2021-9-23 09:54 | 显示全部楼层
补充

  • 有朋友提到可以采用较新版本的安装程序,并将里面的install.wim替换为旧版系统,以此来骗过安装程序。之前我试过这个方法,行不通。现在我用同样的办法在Windows11下操作,这里安装程序是较新的Win11,而install.wim是旧版的win10,会出现以下的错误:

在重启后失败:

失败后进入系统的提示:


2.  尝试通过修改注册表中的系统版本号,以此来欺骗安装程序的方法并不奏效。原因在于,安装程序获取版本号是通过ntdll.dll中的RtlGetVersion方法,该方法会直接在内核中进行版本号的读取,而注册表项的填充也依赖于内核。 或许可以尝试修改ntdll.dll等内核文件的相关内容来达到相同的目的,但是这种方法可能会遇到数字签名验证等问题。
如果有别的方法欢迎朋友们在楼下补充



回复

使用道具 举报

stam15 发表于 2021-9-23 10:45 | 显示全部楼层
方法看上去可行,就不知道系统能否日常稳定运行,先收藏备用
回复

使用道具 举报

AeroDOS 发表于 2021-9-23 12:30 | 显示全部楼层
支持这种探索精神
回复

使用道具 举报

黄增光 发表于 2021-9-23 13:51 来自手机 | 显示全部楼层
感谢分享
回复

使用道具 举报

cqfaaa 发表于 2021-9-23 14:10 | 显示全部楼层
直接DISM++备份还原
回复

使用道具 举报

wangjb97 发表于 2021-9-24 08:54 | 显示全部楼层
既然版本回去了 那岂不是用同版本iso 原地保留数据升级一下 就没事了
回复

使用道具 举报

cashfly 发表于 2021-9-24 09:50 | 显示全部楼层
这才是大牛
回复

使用道具 举报

真正的Horace 发表于 2021-9-25 21:41 | 显示全部楼层
wangjb97 发表于 2021-9-24 08:54
既然版本回去了 那岂不是用同版本iso 原地保留数据升级一下 就没事了

好想法!以后可以试一试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋手机版联系我们

Copyright © 2005-2025 PCBeta. All rights reserved.

Powered by Discuz!  CDN加速及安全服务由「快御」提供

请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。

远景在线 ( 苏ICP备17027154号 )|远景论坛 |Win11论坛 |Win10论坛 |Win8论坛 |Win7论坛 |WP论坛 |Office论坛

GMT+8, 2025-4-25 12:07

快速回复 返回顶部 返回列表