来源:新建一个账户就能隔离毒瘤应用:Windows 自带权限工具妙用
一、背景与优势
在 Windows 上,我们可以使用基于 ACL 与 NTFS 分区格式中的主体权限(大家在文件/文件夹『属性』中可能已经见过的『组』与『用户』)来对那些不得不用的毒瘤应用进行隔离:当用户是『受限用户』时,该用户在默认情况下不能访问、修改系统与其他用户的文件,或修改当前用户的设置。
所以本方法的核心理念就是创建一个受限用户来安装、运行毒瘤应用,将那些可能会对系统设置和系统文件进行恶意修改的行为锁定在受限用户当中。换句话说,利用此特性我们可以给不老实的软件圈出一块地。
这种方法有这些好处:
1、不需要切换用户或开关虚拟机,隔离成本低
2、被隔离的应用只能读写公共可读写的位置和隔离账户的资料库
3、被隔离的应用只能修改被隔离账户的设置
4、允许被隔离应用使用剪贴板等会话级别对象
当然,这种方法也是有缺点的:
1、不支持部分第三方输入法,因为用户配置是独立的,可以通过进入对应用户的桌面进行配置,但是又会生成部分『无用』的配置文件,类似搜狗输入法这种可以通过界面内快捷方式的输入法可以进行后期修改配置,倒是也不影响(但是搜狗输入法本身就属于毒瘤应用不是吗),但是微软输入法可以跨用户使用。
2、ps 仍然可以获取其他进程信息,除非该进程自身通过 UAC 提权拉起(一定要程序自己提权才行,人为 sudo 是不行的)才会被系统隐藏。
用这个方法运行软件就像小朋友在零售店里玩展示机一样,手机系统内有软限制,旁边又有店员看着。这种限制介于完全放开与完全封闭之间,虽然不能限制死,对于该场景来说却是一个较好的解决方案。值得一提的是,该方法与在沙箱中运行应用的安全性不在同一个级别,安全领域也有各种隐秘方法可以进行 ACL 渗透提权,请不要使用该方法运行任何有害软件(和『毒瘤软件』还是要注意区分);未来本方法也可能因为应用本身的更新而失效。另外,该方法较为繁琐,不适合 Windows 零基础用户操作。
二、准备工作
首先你需要下载被限制软件的安装包并放到一个『公共』位置。注意:公共位置意味着新文件从父文件夹继承的权限对 User 组至少有『读取』与『执行』权限,最好也有写入权限,方便操作。通常非 C 盘的其他目录满足该条件。
三、建立账户
建立一个账户来安装软件,在本例中,我们使用 iso 作为账户名。在此场景下,使用『公共』的组件建立用户最为方便:
1、使用 Win+X 快捷键启动『计算机管理』窗口。
2、点击左侧『本地用户和组』按钮,再次点击『用户』按钮,在右侧右键选择『新用户』,输入用户名、密码、并取消勾选『用户下次登录需更改密码』、勾选『密码永不过期』,点击『创建』。
四、安装软件
到这个时候新账户就建立好了,但请注意不要通过账户登录界面切换到该用户并安装软件!这会制造一些不必要的数据并占用一部分空间(同上文的缺点)。
使用 Win+X 快捷键,选择『终端』或者『powershell』(或者『命令提示符』)。
如果是『终端』或者『powershell』的话,在新打开的窗口(我们称之为窗口 1)中输入 $cred = Get-Credential
并回车,然后在弹出的窗口中输入用户名 iso 及你刚才设置的密码并点击确认。
如果是『命令提示符』的话,在新打开的窗口(我们称之为窗口 1)中输入 powershell
再输入 $cred = Get-Credential
并回车,然后在弹出的窗口中输入用户名 iso 及你刚才设置的密码并点击确认。
然后在窗口 1 中继续输入:Start-Process powershell -ArgumentList '-Command Start-Process powershell' -Credential $cred -LoadUserProfile
回车确认,这一步是为了使用新建立的用户打开命令窗口。等待命令完全执行(期间会闪过一个窗口并自动关闭)后会出现一个新的 PowerShell 窗口,我们称之为窗口 2。
窗口 2 就是我们需要的窗口,下面的操作在窗口 2 中进行:
1、为了确保我们是在隔离用户之下,在窗口中输入:whoami
,确认返回值是否为『*\iso』
2、继续输入:$env:__COMPAT_LAYER = 'RunAsInvoker'
并回车。
3、在窗口中输入:cd "安装包所在文件夹路径"
如 cd "D:\temp"
然后输入 ./安装包文件名 如 ./setup.exe
,回车即可打开安装界面,注意如果弹出了 UAC 请不要授权(比如钉钉,处理方式后面再说)。之后按照普通方式安装即可。
五、准备启动器
通过上面的步骤完成软件安装后请不要关闭,在窗口 2 中接着输入:cd ~/Desktop ls
此时可能会出现两种情况:
情况一,返回非空白(即出现已安装的软件名),则记下出现的文件名(通常以 .lnk 结尾);
情况二,返回为空白,此时按 Ctrl + Shift + Esc
打开任务管理器,切换到「详细信息」,并按照「用户名」排列,找到使用 iso 用户运行的软件,记下文件名。
使用 Everything 或文件索引搜索上面记下的文件名,点击右键,选择「复制完整路径和文件名」,复制下来的字符应该像是 D:\Program Files\QQNT\QQ.exe
。
请注意,受非酋体质制约,该步骤可能需要重复多次。
其实就是在受限用户的桌面创建一个启动的快捷方式,熟悉 Windows 直接在资源管理器里面操作就行。
接下来,关闭所有 PowerShell 窗口,然后重新开启一个新的 PowerShell 窗口:
注:如非特别说明,下文中『#』后面文字内容为注释内容,用于理解,无需执行。
# 在弹出的对话框里输入刚建立的用户的用户名和密码
$cred = Get-Credential
# 安全地保存密码并复制到剪贴板
$cred.Password | ConvertFrom-SecureString | Set-Clipboard
# 启动 PowerShell ISE
ise
接着打开 PowerShell ISE,按 Ctrl + N
,先将刚才已经复制的加密字符串粘贴在第一行,然后按照以下步骤操作:
# 选中 ... 并粘贴,这样就会得到安全存储的密码
# 粘贴结果应该是一长串十六进制数,请注意单引号里应该没有空格
$password = '...'
# 将下面的 ... 修改为你建立的用户名
# 若此步骤出现问题,请检查密码字符串是否在日常需要运行该软件的账户下生成
$cred = [pscredential]::new('...', ($password | ConvertTo-SecureString))
# 虚拟化常驻,方便更新
$env:__COMPAT_LAYER = 'RunAsInvoker'
# 不同软件这里的命令不同
# 这里是用 Invoke-Item 打开快捷方式,即在上文中输出非空白的情况(第一种)
# 选中 ... 并替换为刚才看到的软件名(以 .lnk 结尾)
Start-Process powershell -ArgumentList '-Command Invoke-Item ~\Desktop\...' -WorkingDirectory '~\Desktop\' -Credential $cred -LoadUserProfile -WindowStyle Hidden
# 如果是返回空白的情况(第二种),则使用以下命令
# 选中 ... 并粘贴刚才找到的 exe 完整路径及文件名
Start-Process powershell -ArgumentList '-Command Start-Process ...' -Credential $cred -LoadUserProfile -WindowStyle Hidden
以下是完整示例:
$password = '114514'
$cred = [pscredential]::new('iso', ($password | ConvertTo-SecureString))
$env:__COMPAT_LAYER = 'RunAsInvoker'
Start-Process powershell -ArgumentList '-Command Invoke-Item ~\Desktop\QQ.lnk' -WorkingDirectory 'D:\Program Files\QQNT\' -Credential $cred -LoadUserProfile -WindowStyle Hidden
为了确保操作正确,可以进行测试:退出目标软件,再在 ISE 里按 F5:
- 如果什么没有报错就直接启动了目标软件,则说明代码正确;
- 若 ISE 下方窗口出现错误,则可能是代码部分有误,请仔细检查;
- 若 ISE 下方窗口未报错但未出现程序 / 程序报错,一般是 exe 文件找错了,可以参照上面的办法再找找。
代码确定正确后,把它保存在自己的用户目录下,比如在 C:\Users\example\IsolatedApps\QQ.ps1
。
最后,在任意位置建立新快捷方式,目标写:powershell -ExecutionPolicy Unrestricted -File "
C:\Users\example\Isolated
Apps\QQ.ps1
"
建立好之后右键,选属性,『快捷方式』下的『运行方式』选最小化,并改一个合适的图标。最后改一个合适的名字,并固定到任务栏、开始屏幕或者放在任何方便的地方。
以后点这个快捷方式即可以隔离账户的身份运行该软件。
六、隐藏特殊账户
如果你是一个强迫症,不希望在欢迎屏幕看到这个隔离账户;在更理想的条件下,你应该针对每个软件新建一个账户,如此多的用户列表会显得『脏、乱、差』。这时可以通过编辑注册表把它隐藏:
新建文件,名为 Hide-IsolatedUsers.reg
,输入以下内容,并将 ...
替换为你实际建立的用户名称:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList] "..."=dword:00000000
以下是完整示例:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList] "iso"=dword:00000000
保存,双击导入,这样特殊账户就会从欢迎屏幕隐藏。
七、特殊情况处理
对于『四』中红色加粗内容的处理,有两种情况:
对于钉钉这种只是安装时强制要求 UAC 的软件,虚拟机中安装完,然后直接复制出程序文件夹就行,可以正常使用的,或者动手能力强点的可以直接解包 exe 提取程序文件。
对于旧版 QQ/TIM(不含 QQNT) 这种注入驱动并依赖的毒瘤软件,无解,虚拟机伺候吧。
Comments | NOTHING