抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

封面来源:骤雨 | oO大黄Oo #pixiv https://www.pixiv.net/artworks/91461486

植根于国内复杂的网络生态环境,众互联网巨头的软件在隐私方面的暴雷早就成为了月经新闻。幸甚大多数的软件都不属刚需,亦或是有值得信任的或开源的平替,唯独腾讯系的软件定位特殊:既属刚需又无平替,相对安全的 UWP 已死,使用第三方的风险又极其巨大,到了非用官方包不可的地步。即便如此,在相对暴露的 Windows 下裸运行这些软件,仍绝对是下下策之举。

想要防住不受信任而又不得不用的软件,无非将这些软件扔进隔离的环境中运行。现有的隔离 Windows 软件运行的方案繁多,最广为人知的一种是使用虚拟机,在下也在《The Pure WINDOWS Project: Hyper-V 虚拟机使用笔记》一文中实践过,虚拟机的隔离方案虽然有不言自明的诸多好处,但是不免有杀鸡用牛刀之嫌,运行环境也不甚轻量;还有一种流行的方案是 Sandboxie,开源免费,足够轻量,使用起来与系统的整合度也很高,不过其自带的基础沙箱需要一定的配置才能保证不会漏沙,任何因疏忽而忘记堵住的孔都可能成为漏沙的点;再有就是下文要说的 Windows Sandbox,也是本文要介绍的运行方案,在此先按下不表;新兴的一种是微软最近才推出的 win32-app-isolation,可以像 VMware ThinApp 那样通过容器将 Win32 软件隔离,不过其尚处早期预览版,操作非常复杂,需要手动将软件重新打包成 MSIX,其中又涉及到了使用自签名证书的操作,暂不适合一般用户使用,不过未来相当可期。

说回 Windows Sandbox,其实际上还是一个基于 Hyper-V 的虚拟机,安全性上当然就和 Hyper-V 虚拟机相当,但是内存和硬盘占用比传统的虚拟机要小,使用体验上也会更加轻量。但 Windows Sandbox 在使用上有一个不可忽视的主要问题:无法实现持久化保存,每一次关闭沙盒再重新打开,只能得到一个全新的沙盒,旧有沙盒里的一切更改都会消失。想要解决这个问题,只能通过挂载的方式,将沙盒里的文件保存到宿主机上,来实现一定程度上的对于中间态的「保存」。

启用 Windows Sandbox

首先,需要准备一台电脑去 BIOS 检查是否打开了 CPU 虚拟化功能。

打开设置 - 应用 - 可选功能 - 更多 Windows 功能

找到 Windows 沙盒并勾选,点击确定,随后重启。

注意:Windows 家庭版系统并没有集成 Windows Sandbox 功能,无法通过正常方案启用 Windows Sandbox,可尝试将下列代码保存成 bat 文件后管理员下运行安装,不保证可行性

安装代码,点击展开
@echo off

echo Checking for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

echo Permission check result: %errorlevel%

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"

echo Running created temporary "%temp%\getadmin.vbs"
timeout /T 2
"%temp%\getadmin.vbs"
exit /B

:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"

echo Batch was successfully started with admin privileges
echo .
cls
Title Sandbox Installer

pushd "%~dp0"

dir /b %SystemRoot%\servicing\Packages\*Containers*.mum >sandbox.txt

for /f %%i in ('findstr /i . sandbox.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"

del sandbox.txt

Dism /online /enable-feature /featurename:Containers-DisposableClientVM /LimitAccess /ALL

pause  

执行后会进入 Sandbox 安装界面,安装完成后将提示是否重启,输入 Y,并回车。

若安装失败,则需另辟蹊径寻求他法,可将下列代码保存成 bat 文件后管理员下运行删除。

删除代码,点击展开
@echo off

echo Checking for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

echo Permission check result:%errorlevel%

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"

echo Running created temporary "%temp%\getadmin.vbs"
timeout /T 2
"%temp%\getadmin.vbs"
exit /B

:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"

echo Batch was successfully started with admin privileges
echo .
cls
Title Sandbox Installer

pushd "%~dp0"

Dism /online /disable-feature /featurename:Containers-DisposableClientVM

dir /b %SystemRoot%\servicing\Packages\*Containers*.mum >sandbox.txt

for /f %%i in ('findstr /i . sandbox.txt 2^>nul') do dism /online /norestart /remove-package:"%SystemRoot%\servicing\Packages\%%i"

del sandbox.txt

pause

编写沙盒配置

为了实现对创建出来的沙盒的保存,需要编写沙盒的配置文件。Windows Sandbox 的配置文件为纯文本,后缀名是 .wsb ,可以用于定义沙盒的 vGPU 状态、网络信号、文件夹映射等属性。

出于编写配置的方便考虑,可以直接套用他人已经写好的配置模板,Github 上有一个最近才上传的适用于腾讯全家桶的沙盒配置仓库 tencent-sandbox,可谓上佳之选。

把 tencent-sandbox 的源代码下载下来,并在其目录下创建空的挂载文件夹为如下形式:

tencent-sandbox
├───App #可以根据个人需要创建子文件夹,例如不装TIM的话就不用创建TIM文件夹了
│ ├───QQ
│ ├───QQNT
│ ├───TIM
│ └───WeChat
├───Data
│ ├───Common Files
│ ├───Documents
│ │ ├───Tencent
│ │ └───WeChat
│ ├───Roaming
│ │ ├───Tencent
│ │ └───WeChat
│ └───SysWOW64
├───Desktop
├───Scripts
├───README.md
└───Tencent.wsb

使用文本编辑器打开 Tencent.wsb,可以看到沙盒的配置文件写起来和 HTML 代码很像,非常清晰且容易理解。由 <MappedFolders></MappedFolders> 这一对标签框起来的就是文件挂载路径,找到刚刚没有创建的 App 下的子文件夹的对应挂载代码,删除之。

若安装的是 64 位版本微信,则找到 <SandboxFolder>C:\Program Files (x86)\Tencent\WeChat</SandboxFolder> 一行,将 Program Files (x86) 改为 Program Files

若没有 QQ 或 TIM 的安装计划,可以删除 <Command>C:\Program Files (x86)\Common Files\Tencent\QQProtect\Bin\QQProtect.exe</Command> 一行,新版的 QQNT 没有 Q 盾,故也可删除之。

若想要在沙盒中实现视频需求,可在音频配置一行 <AudioInput>Enable</AudioInput> 之后加入 <VideoInput>Enable</VideoInput> 允许沙盒应用使用摄像头。

默认分配给沙盒的运行内存是 2GB,可在 <MemoryInMB>2048</MemoryInMB> 中修改之。

更多沙盒配置可在微软官方的说明文档中找到。

新开一个默认沙盒,并正常安装 QQ / QQNT / TIM,安装完成之后复制沙盒中的 C:\Windows\SysWOW64 下的文件到配置文件夹的 Data\SysWOW64 下,否则 QQ 运行一段时间后会崩溃。

全部修改完成后保存即可,理论上不仅仅只是腾讯系软件,还可以借助此法实现其他软件的沙盒内保存。

软件的安装与使用

以 Windows Sandbox 运行 Tencent.wsb

正常在沙盒中下载并安装即可。

若出现应用安装包无法启动或安装失败的情况,则可将其直接「绿色化」,使用压缩软件直接解压安装包,将解压后的文件移动到沙盒内的对应的挂载文件夹,找到软件的 .exe 可执行文件,右击之创建桌面快捷方式即可。

经在下测试,微信和 不需 Q 盾的 QQNT 使用这种方法均可正常运行。

解决宿主机代理导致的沙盒无网络问题

Windows Sandbox 会自动继承主机的代理服务器设置,而且无法修改。假如设主机上运行着代理软件的话,本地代理服务器地址 127.0.0.1 就会被沙盒继承,而沙盒会据此不断尝试连接沙盒内不存在的端口,进而造成沙盒实际无网络的问题。

采用 PAC 模式的代理可以避免此问题,但如此配置沙盒就无法使用代理,最佳的解决方案是将代理服务器的地址设置为沙盒的网关地址:

在沙盒中运行命令提示符,键入 ipconfig ,即可在默认网关一栏查看到沙盒的网关地址。

复制该地址,打开宿主机的设置 - 网络和 Internet - 代理

点击使用代理服务器一栏的编辑,修改对应的代理 IP 地址为将刚刚复制的沙盒的网关地址,并保存。

部分代理软件支持直接自定义代理服务器地址,例如 Clash for Windows 就可以在 Settings - System Proxy - Static Host 一栏中修改。

评论