Миттєва втрата ваги: ​​як позбавити Universal Apps

Щойно ми отримаємо вдосконалення, як Universal Apps, які працюють рідно як на Intel, так і на Apple Silicon Macs, як користувачі хочуть видалити з них виконуваний код і зробити їх лише для Intel або ARM. У цій статті розглядається, що пов’язано із зачищенням універсальної програми, щоб вона працювала лише на одній архітектурі, і чи це можливо, або порушує їх підпис.

ваги

Останній перехід процесора від Apple розпочався у 2006 році, коли стали доступні Intel Macs. Наступного року в Mac OS X 10.5 було введено підписання коду, і воно вперше було перевірено Gatekeeper ще в 2012 році, в Mac OS X 10.8. Отже, весь останній перехід з його універсальними двійковими файлами був завершений до того, як підписання коду стало поширеним або застосованим. З Каталіною та Біг Суром безпека змінилася до усякого визнання: хоча вони все ще можуть запускати непідписаний код, це тепер виняток із правила, згідно з яким весь виконуваний код повинен бути підписаний та, як правило, теж завірений нотаріально.

Під час цього останнього переходу багато користувачів позбавили своїх універсальних бінарних файлів, або PowerPC, або коду Intel, відповідно до архітектури їхніх Mac на той час. Оскільки виконуваний код часто становить лише невелику частину від загального розміру програми, простір для зберігання даних, який вони часто отримували, просто не коштував зусиль. Тоді я критично ставився до цього зачищення, але користувачі робили це все одно.

Чи це можливо за допомогою сучасних універсальних програм та сучасних засобів захисту? Чи буде втручання в універсальні двійкові файли порушити підписи коду та нотаріальне засвідчення та спричинити хаос?

Зачистка універсальної програми

Я впевнений, що хтось уже створює утиліту для цього, але наразі я скористаюся командним інструментом lipo, який призначений для цього та пов’язаних із ним файлів із файлами Mach-O. В якості тесту я обрав один із власних Universal Apps, Mints, який має просту структуру. Він складається з одного виконуваного двійкового файлу Mach-O, який знаходиться в його стандартній папці Contents/MacOS/Mints у додатку. Більш складні програми містять двійкові файли Mach-O в інших місцях, наприклад, допоміжні програми. Додатки майже незмінно містять диліби в/Contents/Frameworks, які також можуть бути універсальними двійковими файлами, але тут я їх проігнорую.

Перш ніж видаляти універсальні двійкові файли, перевірте, які архітектури підтримує файл Mach-O, використовуючи команду типу

lipo -archs Mints.app/Contents/MacOS/Mints

У цьому випадку підтримуються лише два, як показано у відповіді
x86_64 arm64

Давайте видалимо код arm64 і збережемо видалений виконуваний файл у новий файл за допомогою
lipo -remove arm64 Mints.app/Contents/MacOS/Mints -вихід Mints.app/Contents/MacOS/Mints2
Якщо ви хочете замінити виконуваний файл Intel, використовуйте x86_64 замість arm64 у цій команді.

Потім ще раз перевірте підтримувані архітектури:
lipo -archs Mints.app/Contents/MacOS/Mints2
що підтверджує те, що ми хотіли, єдиною відповіддю
x86_64

Потім потрібно лише видалити Universal Mints.app/Contents/MacOS/Mints і перейменувати Mints2 у Mints. Це зменшує виконуваний файл Mach-O з 442 КБ до 214 КБ, загальна економія - 228 КБ.

Тестування позбавленої програми

Запуск позбавленої версії Mints є хорошим тестом тут, оскільки програма, як і майже вся моя, перевіряє власний підпис кожного разу, коли її відкривають. На мій подив, це спрацювало нормально, і Мінц був нічим не гіршим за те, що видалили частину його нутрощів. Вивчивши його за допомогою мого безкоштовного ArchiChect, я підтвердив, що це вже не універсальний додаток, а підтримує лише Intel Mac. У перевірці кодового дизайну є цікава деталь, де повідомляється, що його формат - "пакет програм з універсальним Mach-O (x86_64)". Це означає, що виконуваний файл Mach-O все ще має структуру універсального двійкового файлу з його заголовками, але містить лише один виконуваний файл.

Нарешті, я додав прапор карантину за допомогою xattred і перемістив зачищений додаток на інший том, щоб запустити повні перевірки Gatekeeper.

Роздягнений додаток Mints був випущений в яскравих кольорах: не просто підписаний належним чином, але його нотаріальне засвідчення все ще добре.

Всередині універсальної двійкової системи Mach-O

Щоб пояснити, як у позбавленої програми все ще залишились непорушними підписи коду, зверніться до мого першого погляду на універсальний бінарний формат Mach-O. Це стосується кожного з включених виконуваних файлів, що містить власні вбудовані сертифікати. Коли macOS ретельно перевіряє підписи, він гарантує, що кожен наданий виконуваний файл (та інший підписаний вміст) підписується, і оскільки Universal Binary був належним чином видалений за допомогою lipo, це залишається справді. Просто виконуваний файл для іншої архітектури було видалено, що явно не призводить до помилки підпису коду.

Висновок

Якщо ви дійсно хочете і за умови, що ви використовуєте lipo, щоб правильно виконувати роботу, у переважній більшості програм, що видаляють Universal Binaries для підтримки меншої кількості архітектур, повинні бути абсолютно безпечними. Завжди знайдуться деякі програми, в яких отриманий комплект не працюватиме належним чином, я підозрюю, і ви не хочете робити це для своєї єдиної копії будь-якої програми. Але ви повинні задати собі питання, чи варто цим зусиллям калічити програми: у випадку з Mints це заощадило лише 228 КБ із загального розміру програми 17,2 МБ. Це лише 1,3%. Навіть застосовується у великій папці Applications, що здається досить марним.