修复ALLSHX2的TPM

通过替换segaboot为powershell来修复tpm。

本博客由好朋友沙椰撰写,由我代发。

Github正文,部分资源在该项目中。

部分机器在解密 BitLocker 后可能触发自毁程序,例如 Nu 机器,通过逆向 sgboot.exe 注意到,它会判断系统盘是否处于加密状态,否则触发

FORMAT DISK

DO NOT POWER OFF SYSTEM

GG,所以我们不建议你关闭 BitLocker,而是选择修复 TPM 程序。

修复舞萌 Alls HX2 炸 TPM 后开机反复要求输入 BitLocker 密钥

这篇记录一下舞萌机台 GS1 硬盘因为 TPM 绑定异常,导致每次开机都进入 BitLocker Recovery,要求输入 BitLocker 恢复密钥的处理流程。

舞萌触发BitLocker
舞萌触发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.ps1PowerShell 脚本,用于把 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

输入 BitLocker 恢复密钥解锁分区
输入 BitLocker 恢复密钥解锁分区

解锁后的盘名应该是 Win10。盘符不一定,取决于你自己电脑上原本有多少个盘,这个不影响。后文统一写作 解密盘:

解密后的 Win10 分区
解密后的 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 打开。这个工具会读取同一目录下的其他注册表文件一起打开,所以二者选一个即可。实测打开其他注册表文件可能会出问题,建议只通过 SOFTWARESYSTEM 打开。

选择 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

找到 Winlogon 下的 Shell
找到 Winlogon 下的 Shell

把 Shell 改成 explorer.exe
把 Shell 改成 explorer.exe

改完之后可以在工具底部看到修改记录。

确认 Shell 已改成 explorer.exe
确认 Shell 已改成 explorer.exe

5. 删除键盘屏蔽项

这一步是删除注册表中屏蔽键盘快捷键的部分。

找到:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Embedded\KeyboardFilter

如果你觉得有必要恢复,可以先导出备份。我的方案是直接删除这个键盘屏蔽,不再恢复。正常官机运行时应该也不会有人插键盘乱折腾,而且这样下次再出问题时也更方便调试。

删除 KeyboardFilter
删除 KeyboardFilter

6. 保存离线注册表并装回官机

注册表修改完之后,记得在工具里保存:

文件 -> 保存脱机注册表

保存脱机注册表
保存脱机注册表

保存完成后,用安全弹出的方式弹出 GS1 硬盘,然后插回官机开机。

此时可能依然需要输入 BitLocker 恢复密钥:

049852-117117-208450-538263-125499-347534-252868-099484

官机开机时输入 BitLocker 恢复密钥
官机开机时输入 BitLocker 恢复密钥

输入后系统会自动进入 AppUser 的桌面。这里不需要把自动登录用户改成 UpdateUser

7. 用批处理自动打开 UpdateUser 权限的 PowerShell

前面挂载硬盘时已经把 RunPowerShellAsUpdateUser.bat 放到了桌面。进入 AppUser 桌面后,直接双击运行它即可。

桌面上的 RunPowerShellAsUpdateUser.bat
桌面上的 RunPowerShellAsUpdateUser.bat

这个批处理会自动读取:

C:\Windows\SEGA\System\system_updateuser.txt

然后启动一个 UpdateUser 权限的 PowerShell。

这个目录里有两个保存密码的文件:

system_appuser.txt
system_updateuser.txt

分别对应 AppUserUpdateUser 的用户密码。

SEGA System 目录中的用户密码文件
SEGA System 目录中的用户密码文件

打开 system_updateuser.txt 可以看到 UpdateUser 的密码。每台机器的密码可能不一样,所以一定以自己机器文件里的内容为准。

读取 system_updateuser 中的密码
读取 system_updateuser 中的密码

新弹出的 PowerShell 里可以运行:

whoami

如果看到当前用户是 updateuser,就说明这个 PowerShell 已经是 UpdateUser 权限。

whoami 确认当前 PowerShell 是 UpdateUser
whoami 确认当前 PowerShell 是 UpdateUser

如果新弹出的窗口里后续命令提示权限不足,可以在这个新窗口里再执行:

Start-Process powershell.exe -Verb RunAs

后面的命令都在这个 UpdateUser 权限的 PowerShell 里执行。

8. 关闭 UWF 过滤

先输入:

uwfmgr filter disable

这一步是关闭 UWF 过滤。不关闭的话,你在 ALLS 系统下的操作基本不会保存,包括修改用户权限、重新绑定 BitLocker 等。

然后输入:

shutdown /r /t 0

回车后系统会重启。重启时可能还会再次要求输入 BitLocker 密钥,继续输入即可。

关闭 UWF 并重启
关闭 UWF 并重启

再次进入 AppUser 桌面后,按上一节的方法重新打开 UpdateUser 权限的 PowerShell,然后运行:

uwfmgr get-config

注意这一段:

FILTER SETTINGS

Filter state: OFF

如果这里显示 OFF,就说明 UWF 已经关闭成功。

确认 UWF Filter state 为 OFF
确认 UWF Filter state 为 OFF

9. 可选:给 AppUser 提权

这一步是可选项,但我建议做。本文后面几乎所有命令和脚本都需要管理员权限;如果不给 AppUser 提权,那么之后每次执行这些命令或脚本前,都需要先运行桌面上的 RunPowerShellAsUpdateUser.bat,打开一个 UpdateUser 权限的 PowerShell 窗口,再在那个窗口里继续操作。

AppUser 提权之后,后续调试会方便很多,也不必每次都靠 UpdateUser 权限窗口来处理权限问题。

UpdateUser 权限的 PowerShell 输入:

net localgroup administrators AppUser /add

运行之后再输入:

net user

确认用户列表里有 AppUser

给 AppUser 加入 administrators 组
给 AppUser 加入 administrators 组

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 绑定成功。

删除旧 TPM 并绑定当前机器 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

右键脚本选择 Run with PowerShell
右键脚本选择 Run with PowerShell

如果没有给 AppUser 提权,就先运行 RunPowerShellAsUpdateUser.bat 打开 UpdateUser 权限的 PowerShell,再进入桌面目录运行:

powershell -ExecutionPolicy Bypass -File .\RestoreShellAndEnableUWF.ps1

运行完成后输入:

shutdown /r /t 0

重启后应该就会正常进入系统,开始 ALLS 自检并启动,不再需要输入 BitLocker 密码。

方案二:在官机上手动改注册表并开启 UWF

如果你不想用脚本,也可以直接在官机上手动改注册表。按:

Win + R

输入:

regedit

打开注册表编辑器。

Win + R 打开 regedit
Win + R 打开 regedit

在注册表中进入:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

Shell 从:

explorer.exe

改回原本的值。大部分机器是:

eshell.exe

把 Shell 改回 eshell.exe
把 Shell 改回 eshell.exe

然后在 PowerShell 里重新开启 UWF:

uwfmgr filter enable

运行完成后输入:

shutdown /r /t 0

重新启用 UWF 并重启
重新启用 UWF 并重启

方案三:先开启 UWF,然后拔盘到自己的电脑上离线修改注册表

如果机台显示区域不好操作,可以用方案三。

先在机台 PowerShell 输入:

uwfmgr filter enable

启用 UWF 保护。机台原本就是开启状态,主要是防止一些文件被意料之外的读写破坏。感觉不开也行,但为了稳定建议打开。

然后输入:

shutdown /r /t 0

重启后再次打开 UpdateUser 权限的 PowerShell,输入:

uwfmgr get-config

正常应该看到:

FILTER SETTINGS

Filter state: ON

确认后关机,拔下 GS1 硬盘,再插入到自己的主机上。

接下来和前面的离线注册表修改一样:

  1. 解锁 GS1 硬盘。
  2. 用注册表修改器打开 解密盘:\Windows\System32\config
  3. 进入 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
  4. Shellexplorer.exe 改回系统原本的值,大部分情况下是 eshell.exe
  5. 保存脱机注册表。
  6. 安全弹出 GS1 硬盘,插回官机开机。

因为这一步是把硬盘挂载到自己的主机上直接修改注册表文件,所以不受 UWF 过滤影响,写入会生效。

可选补充:自动解锁系统里的 N: 盘

这个脚本不是修复 BitLocker 和 TPM 的必要步骤,只作为额外补充。

如果当前系统内还有一个被锁住的 N: 盘,可以用 unlockN.ps1 自动读取:

C:\Windows\SEGA\System\system_key.txt

来解锁 N: 盘。注意 system_key.txt 是隐藏文件,所以你很可能没办法直接在文件管理器里看到它,但它实际存在。

unlockN.ps1 脚本
unlockN.ps1 脚本

脚本内容可以写成:

$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 stateON

如果仍然要求输入 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 许可协议。转载请注明出处!

评论