«Этот сжатый двоичный файл UPX содержит недопустимый заголовок Mach-O и не может быть загружен».

Я пытаюсь запустить старое приложение в macOS Sierra. Он отлично работал в El Capitan, однако после обновления для Sierra он сразу же вылетает при запуске с ошибкой…

Этот сжатый UPX-файл содержит недопустимый заголовок Mach-O и не может быть загружен.

Используя Homebrew в El Capitan, я установил UPX и использовал его, чтобы попытаться распаковать двоичный файл, однако это говорит мне о том, что двоичный файл изначально не сжат.

$ upx -d /tmp/Run.app/Contents/MacOS/Run
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2013
UPX 3.91        Markus Oberhumer, Laszlo Molnar & John Reiser   Sep 30th 2013

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
upx: /tmp/Run.app/Contents/MacOS/Run: NotPackedException: not packed by UPX

Unpacked 0 files.

Это журнал сбоя при открытии приложения в Sierra.

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_CRASH (SIGKILL)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Reason:    EXEC, [0xc] This UPX compressed binary contains an invalid Mach-O header and cannot be loaded.

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib          0x00007fffcffeabb2 __posix_spawn + 10
1   libsystem_kernel.dylib          0x00007fffcffe5ef2 posix_spawn + 386
2   xpcproxy                        0x000000010dbb2d75 0x10dbb0000 + 11637
3   xpcproxy                        0x000000010dbb3992 0x10dbb0000 + 14738
4   libdyld.dylib                   0x00007fffcfebc255 start + 1

Как я могу открыть это приложение в Sierra?

У меня такая же проблема.
Неудачная часть мышления Apple здесь заключается в том, что все используют UPX стандартизированным способом. Поскольку UPX является проектом с открытым исходным кодом, его можно модифицировать определенным образом в соответствии с пожеланиями разработчика. Когда-то существовала такая вещь, как распространение приложений за пределами Mac App Store. Установка ограничений на это наивна и преувеличена, однако становится очевидным, что идея этого, по-видимому, размывается обновлением за обновлением.

Ответы (5)

Пересмотренный ответ:

Чтобы скрыть следы, пираты обнулили маркеры UPX из сжатого двоичного файла, поэтому macOS Sierra не может распаковать двоичный файл. (Попробуйте с: hexdump -C YourApp.app/Contents/MacOS/YourApp | grep -C 1 UPXи убедитесь, что выходных данных, скорее всего, нет.)

Однако jreiser из UPX принял вызов и решил эту проблему, реализовав более надежный поиск сжатого кода. v3.92 можно будет снова запускать эти приложения при распаковке исполняемых файлов с расширением upx -d YourApp.app/Contents/MacOS/YourApp.

На самом деле это то, что Apple должна исправить, поскольку они явно сломали то, что работало, по-видимому, без всякой причины.
Кто-то вмешался в двоичный файл (скорее всего, с сомнительным содержимым) после его сжатия, чтобы он больше не запускался в Sierra, и Apple должна это исправить? Ну да, совершенно верно... расскажи им, пожалуйста. :)
Эй, вмешательство - это основа вычислений... без вмешательства, что мы имеем? :п
Не стесняйтесь вмешиваться во все. Но вы не можете просто свалить все на Apple (хотя время от времени это действительно становилось очень привлекательным).
Да, это отличный момент, и я понимаю, что вы говорите, однако, какова причина такого ограничительного поведения, которое можно было бы спросить. Крайне маловероятно, что они многого добились в этом процессе, кроме того, что потратили впустую много времени всех (включая свое собственное за счет некоторых затрат).
3.92-BETA дает мне «CantUnpackException: файл поврежден», который отличается от «NotPackedException 3.91: не упаковано UPX».
Сработало в моем случае. Ну, это все еще бета. Я обновлю ссылку на бета-версию (и удалю ее, когда она будет окончательной).

3.92-BETA версии 3 работает в Sierra и i386!

https://www.dropbox.com/s/x765t3i42p7hr8b/upx.out?dl=0 теперь работает и для I386.

jreiser на github.com/upx #4 комментарий

3.92 поддерживает сжатие двоичных файлов в Sierra, чтобы их можно было запускать в Sierra, а также поддерживает распаковку двоичных файлов в Sierra. 3.92-BETA также поддерживает распаковку двоичных файлов, которые были изменены после сжатия, например, с помощью подписи кода.

Распаковка двоичного файла приложения с помощью этой -dопции отлично работает!

$ chmod +x upx.out 
$ ./upx.out -d /tmp/Run.app/Contents/MacOS/Run
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2016
UPX 3.92-BETA   Markus Oberhumer, Laszlo Molnar & John Reiser   Sep 22nd 2016

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
     57444 <-     24576   42.78%   macho/i386    Run

Unpacked 1 file.
brew install upx

upx -d YourApp.app/Contents/MacOS/YourApp

работал на меня.

Я не узнаю ваш код, в частности, хотя это обычная проблема с новой версией ОС (совместимость с устаревшим программным обеспечением).

  • Первый шаг: просмотрите веб-сайт разработчиков, чтобы узнать, что они будут устанавливать исправления для Sierra. Возможно, они уже опубликовали бета-патч, который недоступен через Обновление программного обеспечения.

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

  • Подумайте о том, чтобы иметь Mac с двойной загрузкой. Обычно я сохраняю клон моей текущей системы на другом диске (или разделе) после установки новой ОС, после чего я могу быстро перезагрузиться и продолжить использовать программное обеспечение. На самом деле, в наши дни я держу устаревший Mac с версиями 10.6 и 10.8 только для этой поддержки.

  • Рассмотрим виртуальную машину. Вы можете использовать эмулятор на OSX и установить предпочтительную версию ОС (включая Windows). Не уверен, что эмуляторы выпущены для Sierra.

Сообщалось о проблеме, поскольку UPX сильно нарушен Darwin 16 / OS X Sierra. # 4 .

Похоже, что upx 3.92 решит эту проблему.

Скорее всего, нет, потому что исполняемый файл, скорее всего, не упакован UPX.
Но сообщение об ошибке указывает на это. Есть также вещи с сертификатами и т. д., которые также мешают распаковке.
Так и есть, но это явно неправильно. Запустите hexdump -C YourApp.app/Contents/MacOS/YourApp | grep -C 1 UPX и убедитесь сами. Что касается сертификатов: внимательно прочитайте вашу ссылку, и вы увидите, что не имеет значения, подписан ли двоичный файл или нет при распаковке.