ошибка?в кодировке - функция удаления подписи - PullRequest
5 голосов
/ 21 сентября 2011

Я хотел бы удалить цифровую подпись из приложения Mac, которое было подписано кодовым знаком. Существует недокументированная опция для кодирования, --remove-signature, которая по названию кажется мне необходимой. Тем не менее, я не могу заставить его работать. Я понимаю, что это недокументировано, но я действительно мог бы использовать функциональность. Может я что-то не так делаю?

 codesign -s MyIdentity foo.app

работает нормально, подписывает приложение

 codesign --remove-signature foo.app

выполняет дисковую активность в течение нескольких секунд, затем говорит

 foo.app: invalid format for signature

и foo.app вырос до 1,9 ГБ !!! (В частности, это исполняемый файл в foo.app/Contents/Resources/MacOS, который увеличивается с 1,1 МБ до 1,9 ГБ.)

То же самое происходит, когда я пытаюсь подписать / подписать бинарный инструмент поддержки вместо .app.

Есть идеи?


Справочная информация: это мое собственное приложение; Я не пытаюсь победить защиту от копирования или что-то в этом роде.

Я хотел бы распространять подписанное приложение, чтобы каждое обновление приложения не нуждалось в одобрении пользователя для чтения / записи записей приложения в связке ключей. Тем не менее, некоторые люди должны изменить приложение, добавив свою собственную папку в / Resources. Если они это сделают, подпись станет недействительной, и приложение не сможет использовать собственные записи цепочки для ключей.

Приложение может легко определить, произошла ли такая ситуация. Если бы приложение могло тогда удалить свою подпись, все было бы хорошо. Те люди, которые делают эту модификацию, должны будут дать измененному, теперь без подписи, разрешение на использование Цепочки для ключей, но это нормально для меня.

Ответы [ 6 ]

8 голосов
/ 12 октября 2014

Немного поздно, но я обновил общедоступный инструмент под названием unsign, который модифицирует исполняемые файлы для очистки подписей.

https://github.com/steakknife/unsign

2 голосов
/ 12 октября 2014

Вот источник для codesign, в котором перечислены все параметры, включая те, которые не описаны в командной строке -h и странице man.Техническая заметка Apple о последних изменениях в работе подписи кода

0 голосов
/ 21 октября 2018

При втором чтении этого вопроса возникла другая мысль: возможно, лучший подход для достижения конечной цели вопроса состоит не в удалении подписей, а в том, чтобы иметь пользователей (с помощью сценария/ прозрачно) re - подпишите приложение после модификации, используя специальную подпись.То есть codesign -fs - [app], я полагаю.Смотри https://apple.stackexchange.com/questions/105588/anyone-with-experience-in-hacking-the-codesigning-on-os-x

0 голосов
/ 26 июня 2018

Я столкнулся с этим вопросом сегодня.Я могу подтвердить, что опция --remove-signature для Apple codesign (и остается через шесть лет после того, как ОП задал этот вопрос) серьезно глючит.

Для небольшого фона, Xcode (и инструменты разработчика командной строки Apple) включают утилиту codesign, но в нее не входит инструмент для удаления подписей.Тем не менее, поскольку это необходимо делать в определенных ситуациях довольно часто, здесь имеется опция полностью недокументированная :

codesign --remove-signature, которая (предполагается, учитывая отсутствие документации)должен быть достаточно понятен, но, к сожалению, редко работает как задумано, без особых усилий.Таким образом, я закончил тем, что написал сценарий, который должен позаботиться о проблеме ОП, моей и подобной.Если достаточно людей найдут его здесь и сочтут его полезным, дайте мне знать, и я положу его на GitHub или что-то в этом роде.


#!/bin/sh # codesign_remove_for_real -- working `codesign --remove-signature`
# (c) 2018 G. Nixon. BSD 2-clause minus retain/reproduce license requirements.

total_size(){
  # Why its so damn hard to get decent recursive filesize total in the shell?
  # - Darwin `du` doesn't do *bytes* (or anything less than 512B blocks)
  # - `find` size options are completely non-standardized and doesn't recurse
  # - `stat` is not in POSIX at all, and its options are all over the map...
  # - ... etc. 
  # So: here we just use `find` for a recursive list of *files*, then wc -c
  # and total it all up. Which sucks, because we have to read in every bit
  # of every file. But its the only truly portable solution I think.
  find "$@" -type f -print0 | xargs -0n1 cat | wc -c | tr -d '[:space:]'
}

# Get an accurate byte count before we touch anything. Zero would be bad.
size_total=$(total_size "$@") && [ $size_total -gt 0 ] || exit 1

recursively_repeat_remove_signature(){
  # `codesign --remove-signature` randomly fails in a few ways.
  # If you're lucky, you'll get an error like:
  # [...]/codesign_allocate: can't write output file: [...] (Invalid argument)
  # [...] the codesign_allocate helper tool cannot be found or used
  # or something to that effect, in which case it will return non-zero.
  # So we'll try it (suppressing stderr), and if it fails we'll just try again.
  codesign --remove-signature --deep "$@" 2>/dev/null ||
    recursively_repeat_remove_signature "$@"

  # Unfortunately, the other very common way it fails is to do something? that
  # hugely increases the binary size(s) by a seemingly arbitrary amount and
  # then exits 0. `codesign -v` will tell you that there's no signature, but
  # there are other telltale signs its not completely removed. For example,
  # if you try stripping an executable after this, you'll get something like
  # strip: changes being made to the file will invalidate the code signature
  # So, the solution  (well, my solution) is to do a file size check; once
  # we're finally getting the same result, we've probably been sucessful.
  # We could of course also use checksums, but its much faster this way.
  [ $size_total == $(total_size "$@") ] ||
    recursively_repeat_remove_signature "$@"

  # Finally, remove any leftover _CodeSignature directories.
  find "$@" -type d -name _CodeSignature -print0 | xargs -0n1 rm -rf
} 

signature_info(){
  # Get some info on code signatures. Not really required for anything here.
  for info in "-dr-" "-vv"; do codesign $info "$@";  done # "-dvvvv" 
}

# If we want to be be "verbose", check signature before. Un/comment out:
# echo >&2; echo "Current Signature State:" >&2; echo >&2; signature_info "$@"


# So we first remove any extended attributes and/or ACLs (which are common,
# and tend to interfere with the process here) then run our repeat scheme.
xattr -rc "$@" && chmod -RN "$@" && recursively_repeat_remove_signature "$@"

# Done!


# That's it; at this point, the executable or bundle(s) should sucessfully
# have truly become stripped of any code-signing. To test, one could
# try re-signing it again with an ad-hoc signature, then removing it again:
# (un/comment out below, as you see fit)

# echo >&2 && echo "Testing..." >&2; codesign -vvvvs - "$@" &&
  # signature_info "$@" && recursively_repeat_remove_signature "$@"

# And of course, while it sometimes returns false positives, lets at least:
codesign -dvvvv "$@" || echo "Signature successfully removed!" >&2 && exit 0
0 голосов
/ 04 сентября 2014

Полагаю, вы можете удалить подпись, просто удалив папку _CodeSignature в пакете приложения.

0 голосов
/ 21 сентября 2011

Я согласен, что когда вы это сделали --remove-signature.

, происходит нечто странное. Однако вместо того, чтобы пытаться отменить кодовую подпись, вы должны изменить способ добавления дополнительных файлов в * 1004.*.Вместо этого укажите определенный путь, обычно

~/Library/Application Support/Name_Of_Your_App/

или, может быть,

~/Library/Application Support/Name_Of_Your_App/Resources/

и попросите пользователя добавить туда дополнительные файлы.Затем, в вашем коде, всегда проверяйте каталог в дополнение к файлам в Resources, когда вам нужно прочитать файл.

...