修复ALLSHX2的TPM
通过替换segaboot为powershell来修复tpm。
部分机器在解密 BitLocker 后可能触发自毁程序,例如 Nu 机器,通过逆向 sgboot.exe 注意到,它会判断系统盘是否处于加密状态,否则触发
FORMAT DISK
DO NOT POWER OFF SYSTEM
GG,所以我们不建议你关闭 BitLocker,而是选择修复 TPM 程序。
修复舞萌 Alls HX2 炸 TPM 后开机反复要求输入 BitLocker 密钥
这篇记录一下舞萌机台 GS1 硬盘因为 TPM 绑定异常,导致每次开机都进入 BitLocker Recovery,要求输入 BitLocker 恢复密钥的处理流程。
这版流程不再修改自动登录用户。系统原本会自动进入 AppUser,我们只把开机 Shell 临时改成 explorer.exe,让它先进桌面;进入桌面后直接从 C:\Windows\SEGA\System 读取 UpdateUser 的密码,再用 PowerShell 自动创建凭据并启动 UpdateUser 权限的 PowerShell,完成关闭 UWF、重新绑定 TPM 等维护操作。
本文用到的 BitLocker 恢复密钥为:
049852-117117-208450-538263-125499-347534-252868-099484
仓库文件说明
| 文件 | 描述 |
|---|---|
README.md | 当前主教程,按图文流程说明如何修复 Alls HX2 上 GS1 硬盘 TPM 绑定异常导致的 BitLocker 恢复密钥问题。 |
README旧方案.md | 旧版处理方案留档,包含早期通过修改自动登录用户等方式处理问题的流程;一般优先看新版 README.md。 |
RunPowerShellAsUpdateUser.bat | 批处理脚本,自动读取 C:\Windows\SEGA\System\system_updateuser.txt,并拉起 UpdateUser 权限的 PowerShell。 |
RestoreShellAndEnableUWF.ps1 | PowerShell 脚本,用于把 Winlogon\Shell 恢复为原本的启动程序,并重新开启 UWF。 |
unlockN.ps1 | 可选补充脚本,自动读取隐藏的 C:\Windows\SEGA\System\system_key.txt 来解锁系统内的 N: 盘。 |
注册表修改器.exe | 离线注册表修改工具,用于在主机上打开并保存 GS1 硬盘内的 Windows 注册表文件。 |
| “ | README 使用的截图目录,所有图片都只用于辅助说明步骤。 |
1. 把 GS1 硬盘插到自己的电脑并解锁
把 GS1 硬盘插到自己的主机后,资源管理器里会看到几个带锁的硬盘。逐个试一下,找到能用下面这个 BitLocker 恢复密钥解开的分区:
049852-117117-208450-538263-125499-347534-252868-099484
解锁后的盘名应该是 Win10。盘符不一定,取决于你自己电脑上原本有多少个盘,这个不影响。后文统一写作 解密盘:。
2. 挂载时顺手放入维护脚本
在第一次把硬盘挂载到自己主机上的时候,建议顺手把维护脚本放到 AppUser 的桌面。这样后面插回官机、输入 BitLocker 恢复密钥进入系统后,桌面上就能直接看到这些脚本,不需要再手动输入一大堆命令。
优先放到:
解密盘:\Users\AppUser\Desktop\
如果这个目录不存在,也可以放到公共桌面:
解密盘:\Users\Public\Desktop\
建议放入这几个脚本:
RunPowerShellAsUpdateUser.bat
RestoreShellAndEnableUWF.ps1
unlockN.ps1
它们的作用分别是:
RunPowerShellAsUpdateUser.bat:自动读取C:\Windows\SEGA\System\system_updateuser.txt,并打开一个UpdateUser权限的 PowerShell,避免runas不能粘贴密码的问题。RestoreShellAndEnableUWF.ps1:修复完成后把Winlogon\Shell恢复成原本的启动程序,并执行uwfmgr filter enable重新开启 UWF。unlockN.ps1:额外补充脚本,自动读取隐藏文件C:\Windows\SEGA\System\system_key.txt来解锁系统内被锁住的N:盘;这不是修 TPM 的必要步骤。
注意:RestoreShellAndEnableUWF.ps1 默认把 Shell 恢复成 eshell.exe。这里的 eshell.exe 指的是下文第 4 步“临时把开机 Shell 改回 explorer.exe”里,修改成 explorer.exe 之前看到的那个原始值。大部分情况下这个原始值是 eshell.exe,但不排除有些系统不是这个值。如果你要使用这个脚本,请先确认第 4 步里记录到的原始值;如果不是 eshell.exe,需要先把脚本里的:
$ShellValue = 'eshell.exe'
改成你那台系统原本对应的值。
3. 打开离线注册表
启动提供的注册表修改器。
在工具里选择:
文件 -> 打开脱机注册表
进入刚刚解密的系统分区:
解密盘:\Windows\System32\config
然后选择 SOFTWARE 或者 SYSTEM 打开。这个工具会读取同一目录下的其他注册表文件一起打开,所以二者选一个即可。实测打开其他注册表文件可能会出问题,建议只通过 SOFTWARE 或 SYSTEM 打开。
4. 临时把开机 Shell 改回 explorer.exe
这一步是为了让系统开机进入桌面,而不是直接启动 segaboot。
原系统把 Windows 的开机 Shell 从 explorer.exe 改成了 eshell.exe。这个程序会强制前台运行且难以关闭,所以开机后不会有普通桌面。我们先把它改回 explorer.exe,方便后续维护。
在注册表里找到:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
找到右侧的 Shell,将值从:
eshell.exe
改为:
explorer.exe
改完之后可以在工具底部看到修改记录。
5. 删除键盘屏蔽项
这一步是删除注册表中屏蔽键盘快捷键的部分。
找到:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Embedded\KeyboardFilter
如果你觉得有必要恢复,可以先导出备份。我的方案是直接删除这个键盘屏蔽,不再恢复。正常官机运行时应该也不会有人插键盘乱折腾,而且这样下次再出问题时也更方便调试。
6. 保存离线注册表并装回官机
注册表修改完之后,记得在工具里保存:
文件 -> 保存脱机注册表
保存完成后,用安全弹出的方式弹出 GS1 硬盘,然后插回官机开机。
此时可能依然需要输入 BitLocker 恢复密钥:
049852-117117-208450-538263-125499-347534-252868-099484
输入后系统会自动进入 AppUser 的桌面。这里不需要把自动登录用户改成 UpdateUser。
7. 用批处理自动打开 UpdateUser 权限的 PowerShell
前面挂载硬盘时已经把 RunPowerShellAsUpdateUser.bat 放到了桌面。进入 AppUser 桌面后,直接双击运行它即可。
这个批处理会自动读取:
C:\Windows\SEGA\System\system_updateuser.txt
然后启动一个 UpdateUser 权限的 PowerShell。
这个目录里有两个保存密码的文件:
system_appuser.txt
system_updateuser.txt
分别对应 AppUser 和 UpdateUser 的用户密码。
打开 system_updateuser.txt 可以看到 UpdateUser 的密码。每台机器的密码可能不一样,所以一定以自己机器文件里的内容为准。
新弹出的 PowerShell 里可以运行:
whoami
如果看到当前用户是 updateuser,就说明这个 PowerShell 已经是 UpdateUser 权限。
如果新弹出的窗口里后续命令提示权限不足,可以在这个新窗口里再执行:
Start-Process powershell.exe -Verb RunAs
后面的命令都在这个 UpdateUser 权限的 PowerShell 里执行。
8. 关闭 UWF 过滤
先输入:
uwfmgr filter disable
这一步是关闭 UWF 过滤。不关闭的话,你在 ALLS 系统下的操作基本不会保存,包括修改用户权限、重新绑定 BitLocker 等。
然后输入:
shutdown /r /t 0
回车后系统会重启。重启时可能还会再次要求输入 BitLocker 密钥,继续输入即可。
再次进入 AppUser 桌面后,按上一节的方法重新打开 UpdateUser 权限的 PowerShell,然后运行:
uwfmgr get-config
注意这一段:
FILTER SETTINGS
Filter state: OFF
如果这里显示 OFF,就说明 UWF 已经关闭成功。
9. 可选:给 AppUser 提权
这一步是可选项,但我建议做。本文后面几乎所有命令和脚本都需要管理员权限;如果不给 AppUser 提权,那么之后每次执行这些命令或脚本前,都需要先运行桌面上的 RunPowerShellAsUpdateUser.bat,打开一个 UpdateUser 权限的 PowerShell 窗口,再在那个窗口里继续操作。
给 AppUser 提权之后,后续调试会方便很多,也不必每次都靠 UpdateUser 权限窗口来处理权限问题。
在 UpdateUser 权限的 PowerShell 输入:
net localgroup administrators AppUser /add
运行之后再输入:
net user
确认用户列表里有 AppUser。
10. 重新绑定当前机器的 TPM
现在开始真正修复 BitLocker 开机反复要恢复密钥的问题。
可以先查看当前保护器:
manage-bde -protectors -get C:
然后删除已经绑定的 TPM:
manage-bde -protectors -delete C: -type TPM
再绑定当前机器的 TPM:
manage-bde -protectors -add C: -tpm
图里的第一个红框代表 TPM 删除成功,第二个红框代表 TPM 绑定成功。
完成后运行:
shutdown /r /t 0
重启测试。如果这次开机不再需要输入 BitLocker 密码,就说明 TPM 绑定成功了。
11. 恢复 segaboot 自启动
成功无 BitLocker 进入系统后,最后要恢复机台原本的开机启动状态:开机不进入普通桌面,而是启动 segaboot。
把注册表里的 Shell 改回系统原本的启动程序,并重新开启 UWF。
因为正常情况下不会有人在官机上插入键盘以及segaboot似乎自带有键盘的屏蔽,所以注册表里的键盘屏蔽部分我选择不恢复了。
注意:大部分情况下这里要恢复成 eshell.exe,但不排除有些系统原本的 Shell 值不是 eshell.exe。这里说的 eshell.exe,就是第 4 步“临时把开机 Shell 改回 explorer.exe”中,把 Shell 改成 explorer.exe 之前看到的原始值。如果你的机器在第 4 步里看到的原始值不是 eshell.exe,请把脚本里的 $ShellValue = 'eshell.exe' 改成你那台系统原本的值。
这里分三种方案。优先推荐方案一,最省事;如果脚本跑不起来,可以用方案二手动改;如果机台显示区域有死角、注册表窗口看不清,就用方案三拔盘离线改。
方案一:直接在官机上运行脚本
前面第一次挂载硬盘时已经把 RestoreShellAndEnableUWF.ps1 放到了桌面。完成 TPM 重新绑定、确认开机不再需要 BitLocker 恢复密钥后,可以直接在官机上运行这个脚本。
这个脚本相当于把第 4 步“临时把开机 Shell 改回 explorer.exe”反向执行一遍:第 4 步是为了临时进桌面,把原本的启动程序改成了 explorer.exe;这个脚本则是把它改回原本的启动程序,让机器恢复开机自启 segaboot。
脚本文件名:
RestoreShellAndEnableUWF.ps1
内容如下:
$ShellValue = 'eshell.exe'
# If this machine originally used a different Winlogon Shell value, change
# $ShellValue above before running this script.
$winlogonPath = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon'
Write-Host "Setting Winlogon Shell to: $ShellValue"
Set-ItemProperty -Path $winlogonPath -Name Shell -Value $ShellValue
Write-Host 'Enabling UWF filter...'
uwfmgr filter enable
Write-Host ''
Write-Host 'Done. Restart the machine to apply UWF and return to the normal boot flow.'
Write-Host 'Run this when ready: shutdown /r /t 0'
pause
进入系统并完成 TPM 重新绑定后,用有管理员权限的 PowerShell 运行这个脚本。如果你已经给 AppUser 提权,可以直接右键脚本选择 Run with PowerShell。
如果没有给 AppUser 提权,就先运行 RunPowerShellAsUpdateUser.bat 打开 UpdateUser 权限的 PowerShell,再进入桌面目录运行:
powershell -ExecutionPolicy Bypass -File .\RestoreShellAndEnableUWF.ps1
运行完成后输入:
shutdown /r /t 0
重启后应该就会正常进入系统,开始 ALLS 自检并启动,不再需要输入 BitLocker 密码。
方案二:在官机上手动改注册表并开启 UWF
如果你不想用脚本,也可以直接在官机上手动改注册表。按:
Win + R
输入:
regedit
打开注册表编辑器。
在注册表中进入:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
把 Shell 从:
explorer.exe
改回原本的值。大部分机器是:
eshell.exe
然后在 PowerShell 里重新开启 UWF:
uwfmgr filter enable
运行完成后输入:
shutdown /r /t 0
方案三:先开启 UWF,然后拔盘到自己的电脑上离线修改注册表
如果机台显示区域不好操作,可以用方案三。
先在机台 PowerShell 输入:
uwfmgr filter enable
启用 UWF 保护。机台原本就是开启状态,主要是防止一些文件被意料之外的读写破坏。感觉不开也行,但为了稳定建议打开。
然后输入:
shutdown /r /t 0
重启后再次打开 UpdateUser 权限的 PowerShell,输入:
uwfmgr get-config
正常应该看到:
FILTER SETTINGS
Filter state: ON
确认后关机,拔下 GS1 硬盘,再插入到自己的主机上。
接下来和前面的离线注册表修改一样:
- 解锁 GS1 硬盘。
- 用注册表修改器打开
解密盘:\Windows\System32\config。 - 进入
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon。 - 把
Shell从explorer.exe改回系统原本的值,大部分情况下是eshell.exe。 - 保存脱机注册表。
- 安全弹出 GS1 硬盘,插回官机开机。
因为这一步是把硬盘挂载到自己的主机上直接修改注册表文件,所以不受 UWF 过滤影响,写入会生效。
可选补充:自动解锁系统里的 N: 盘
这个脚本不是修复 BitLocker 和 TPM 的必要步骤,只作为额外补充。
如果当前系统内还有一个被锁住的 N: 盘,可以用 unlockN.ps1 自动读取:
C:\Windows\SEGA\System\system_key.txt
来解锁 N: 盘。注意 system_key.txt 是隐藏文件,所以你很可能没办法直接在文件管理器里看到它,但它实际存在。
脚本内容可以写成:
$keyFile = 'C:\Windows\SEGA\System\system_key.txt'
if (-not (Test-Path -LiteralPath $keyFile)) {
Write-Error "Cannot find $keyFile. The file may be hidden, but it must exist for this script to work."
pause
exit 1
}
$key = (Get-Content -LiteralPath $keyFile -Raw).Trim()
if ([string]::IsNullOrWhiteSpace($key)) {
Write-Error "$keyFile is empty."
pause
exit 1
}
manage-bde -unlock N: -RecoveryPassword $key
pause
最终确认
最终正常状态应该是:
- 开机不再进入 BitLocker Recovery
- 自动登录
AppUser - 不进入普通桌面,而是启动
segaboot - ALLS 自检正常开始
- UWF 恢复开启,
Filter state为ON
如果仍然要求输入 BitLocker 密钥,优先检查 TPM 是否重新绑定成功:
manage-bde -protectors -get C:
如果开机进入桌面而不是启动游戏,检查:
Shell = eshell.exe
如果你那台系统原本的 Shell 不是 eshell.exe,这里应以原本的值为准。
如果需要再次维护,可以先临时把 Shell 改回 explorer.exe 进入桌面,再通过 C:\Windows\SEGA\System\system_updateuser.txt 读取 UpdateUser 密码,用 PowerShell 自动创建凭据获得维护权限。
版权声明:本文作者为 nuym,首发于 www.nuym.cn。
遵循 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
评论