總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒有這種可能呢?
我們打開設置應用,通過任務管理器查看進程,就會發現它並沒有 Runtime Broker 存在,這個進程是用來在沙盒間代理的,這說明微軟給 UWP 開了一個後門。
那麼我們是不是也有辦法脫離沙盒運行呢?Ahmed Walid 在 2023年2月 發表了這樣一個帖子:
同時他還提交了一個名為 Added a remark about uap10:TrustLevel 的 PR,在這個 PR 中明確提到瞭如何通過設置 Custom Capability 來修改 UWP 的 TrustLevel
Setting
uap10:TrustLevel="mediumIL"
whileuap10:RuntimeBehavior="windowsApp"
requires theMicrosoft.coreAppActivation_8wekyb3d8bbwe
Custom Capability.This is also true if
uap10:TrustLevel="mediumIL"
andEntryPoint
is any other value than"windows.fullTrustApplication"
or"windows.partialTrustApplication"
.You can read more about this custom capability here in Custom Capabilities.
如今這個 PR 已經合併,現在可以直接在微軟文檔《應用程式 (Windows 10)》中找到了
根據文檔描述,我們需要添加一個名為 Microsoft.coreAppActivation_8wekyb3d8bbwe
的自定義許可權,然後將 uap10:TrustLevel
設置為 mediumIL
即可
首先我們在清單中加入許可權
<?xml version="1.0" encoding="utf-8"?>
<Package
...
xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="... uap4 rescap">
...
<Capabilities>
...
<!-- runFullTrust 許可權是必不可少的 -->
<rescap:Capability Name="runFullTrust" />
<uap4:CustomCapability Name="Microsoft.coreAppActivation_8wekyb3d8bbwe" />
</Capabilities>
</Package>
Custom Capability 不同於其他許可權,這是用來給 OEM 自定義使用的,需要 SCCD 文件來證明你有使用許可權的資格,所以想上架是基本沒可能了,相關內容可以查看教程 [UWP] Custom Capability的使用
我們在項目根目錄新建一個名為 CustomCapability.SCCD
的文件,在其中寫入
<?xml version="1.0" encoding="utf-8"?>
<CustomCapabilityDescriptor xmlns="http://schemas.microsoft.com/appx/2018/sccd" xmlns:s="http://schemas.microsoft.com/appx/2018/sccd">
<CustomCapabilities>
<CustomCapability Name="Microsoft.coreAppActivation_8wekyb3d8bbwe"></CustomCapability>
</CustomCapabilities>
<AuthorizedEntities AllowAny="true"/>
<Catalog>FFFF</Catalog>
</CustomCapabilityDescriptor>
然後將該文件設置為內容,或者選擇複製到輸出,只要最後能出現在安裝包裡面就行了
最後我們將 uap10:TrustLevel
設置為 mediumIL
<?xml version="1.0" encoding="utf-8"?>
<Package
...
xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10"
IgnorableNamespaces="... uap10">
...
<Applications>
<Application
...
uap10:TrustLevel="mediumIL">
...
</Application>
</Applications>
...
</Package>
我們調用Process.GetProcesses()
獲取進程列表(UAP 10.0.15138.0
雖然加入了Process
支持,但是並沒有實現Process.GetProcesses()
,所以這裡是運行在 .NET 8.0 上的
using Microsoft.UI.Xaml.Controls;
using System.Diagnostics;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
namespace FullTrustUWP.Pages
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage() => InitializeComponent();
public void Test()
{
// 這裡使用了 Windows App SDK,實際上 WAS 是支持 UWP 的
Content = new ItemsView
{
// 必須使用 .NET Core App,因為微軟沒有給 .NET Core 5.0 實現這個方法
ItemsSource = Process.GetProcesses()
};
}
}
}
運行效果
如果沒有設置uap10:TrustLevel
為 mediumIL
,則依然運行在沙盒中,Process.GetProcesses()
只能獲取到沙盒中的進程