Клонируем UWP-приложения – проще чем кажется

Предисловие

Ни для кого не секрет, что на смартфонах под управлением операционной системы Android можно клонировать приложения. Иногда этот функционал даже встроен в систему. Один из примеров тому — (не) всеми любимая MIUI, которая, начиная с двенадцатой версии, уже умела создавать дубликаты приложений.

Однако если речь идёт о Windows 10/11, то я не встречал решений для клонирования UWP-приложений. Давайте попробуем это исправить!

Подготовка

Итак, что же нам понадобится:

  • Прямые руки, немного терпения

  • Устройство под управлением Windows 10/11

  • Пакет SDK для Windows (доступен для загрузки здесь)

Если вы уверены, что всё, перечисленное выше, у вас имеется — можно двигаться дальше.

Приступим к действиям

Первым делом нам необходимо выбрать приложение, которые мы будем клонировать. В качестве подопытного я выбрал Unigram — клиент для мессенджера Telegram. Дальнейшие действия буду показывать на этом примере.

Открываем PowerShell от имени администратора. Вводим следующую команду:

Get-AppxPackage

Эта команда покажет нам список всех установленных приложений. Среди всего списка находим то, которое мы собираемся клонировать. Выглядит это примерно следующим образом:

Name              : 38833FF26BA1D.UnigramPreview
Publisher         : CN=D89C87B4-2758-402A-8F40-3571D00882AB
Architecture      : X64
ResourceId        :
Version           : 11.3.3.0
PackageFullName   : 38833FF26BA1D.UnigramPreview_11.3.3.0_x64__g9c9v27vpyspw
InstallLocation   : C:\Program Files\WindowsApps\38833FF26BA1D.UnigramPreview_11.3.3.0_x64__g9c9v27vpyspw
IsFramework       : False
PackageFamilyName : 38833FF26BA1D.UnigramPreview_g9c9v27vpyspw
PublisherId       : g9c9v27vpyspw
IsResourcePackage : False
IsBundle          : False
IsDevelopmentMode : False
NonRemovable      : False
Dependencies      : {Microsoft.UI.Xaml.2.8_8.2310.30001.0_x64__8wekyb3d8bbwe, Microsoft.NET.Native.Framework.2.2_2.2.29
                    512.0_x64__8wekyb3d8bbwe, Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__8wekyb3d8bbwe, Microsof
                    t.VCLibs.140.00_14.0.33519.0_x64__8wekyb3d8bbwe...}
IsPartiallyStaged : False
SignatureKind     : Store
Status            : Ok

Из всей этой кучи нам пригодится параметр Name. Запоминаем его.

Теперь экспортируем его куда-нибудь:

Get-AppxPackage -Name "ИМЯ_ПРИЛОЖЕНИЯ" | ForEach-Object {
 Copy-Item -Path $_.InstallLocation -Recurse -Destination "ПУТЬ\$($_.Name)"
}

Имя приложения — это то самый параметр Name. Также необходимо указать путь, куда именно будет происходить экспорт.

В итоге у нас должно получиться что-то подобное:

Куча файлов, о назначении которых нам знать не обязательно

Куча файлов, о назначении которых нам знать не обязательно

Среди этой кучи файлов должен быть AppxManifest.xml. Нам необходимо немного его отредактировать. Открываем его и находим строчку Identity. Меняем значение Name и Publisher на свои. Вот как это получилось у меня:

Теперь приступим к сборке appx-пакета. Открываем Developer Command Prompt for Visual Studio. Вводим следующее:

MakeAppx pack /d "ПУТЬ_ДО_ФАЙЛОВ_ЭКСПОРТА" /p "ПУТЬ_ГДЕ_БУДЕТ_ЛЕЖАТЬ_ПАКЕТ\Clone.appx"

Убеждаемся, что пакет успешно собрался:

f3d4a1ca548d1120438e29cab844c739.png

И что, это всё? О нет, если вы попробуете установить его — вы столкнётесь с проблемой. Для UWP приложения по-хорошему нужен сертификат. Ну ладно — слепим его сами! В консоли PowerShell вводим следующее:

New-SelfSignedCertificate -Type Custom -Subject "CN=WHO_AM_I" -KeyUsage DigitalSignature -FriendlyName "MyAppCertificate" -CertStoreLocation "Cert:\CurrentUser\My" -KeyLength 2048

Теперь необходимо экспортировать полученный сертификат в формате .pfx. Для этого открываем certmgr.msc. Идём в Личное > Сертификаты и находим наш сертификат. Нажимаем на него правой кнопкой мыши, затем Все задачи > Экспорт.

Выбираем »Экспортировать закрытый ключ». В процессе нужно будет ввести пароль. Вводим его и запоминаем. Далее по подсказкам. Сохраняем сертификат туда, где он не потеряется.

652cd3e2209dd9c1c4966de137483f16.png

Сертификат на месте? Отлично! Подпишем пакет нашим сертификатом в консоли Developer Command Prompt for Visual Studio:

SignTool sign /fd SHA256 /a /f "ПУТЬ_К_СЕРТИФИКАТУ.pfx" /p "ПАРОЛЬ_СЕРТИФИКАТА" "ПУТЬ_ДО_APPX"

Далее — немного хитрости. ПКМ по нашему файлу appx > Цифровые подписи > В списке подписей выбираем нашу подпись > Сведения > Просмотр сертификата > Установить сертификат > Локальный компьютер > Поместить в следующее хранилище > Обзор > Устанавливаем его в Доверенные лица.

Открываем APPX. Нажимаем установить…

cd27f2138edf8ba1be30d588f6243d8a.png

Ошибка об отсутствии сертификата ушла и приложение успешно установилось. Мы счастливы. Открываем меню Пуск и в списке приложений нас встречают два приложения:

0c112d50c8d82227c2bdfae82757e14b.png

И да, наш клон успешно открывается и функционирует:

ab5d6587efc4a257ddc12f096d20077b.png

Что ещё?

Об этом я забыл упомянуть. Наверное по хорошему в манифесте можно поменять его имя. И вообще в ресурсах поменять иконку чтобы различать оригинал и копию. Я надеюсь, это не будет проблемой для вас.

© Habrahabr.ru