Me gustaría quitar la firma digital de un Mac app que se ha firmado firmado de código. Hay un indocumentados opción para codiseñar, –remove-firma, que por su nombre parece ser lo que necesito. Sin embargo, yo no puedo conseguir que funcione. Me doy cuenta de que es indocumentado, pero yo realmente podría utilizar la funcionalidad. Tal vez estoy haciendo algo mal?

 codesign -s MyIdentity foo.app

funciona normalmente, la firma de la aplicación

 codesign --remove-signature foo.app

no hay actividad en el disco por varios segundos, luego dice

 foo.app: invalid format for signature

y foo.la aplicación ha crecido a 1,9 GB!!! (Específicamente, es el ejecutable en foo.app/Contents/Resources/MacOS que crece, de 1.1 MB a 1,9 GB.)

Sucede lo mismo cuando trato de iniciar/retirará su firma un binario herramienta de apoyo en lugar de una .app.

Alguna idea?


De fondo: Esta es mi propia app, yo no estoy tratando de derrotar a la protección de copia ni nada de eso.

Me gustaría distribuir una aplicación firmado por lo que cada actualización de la app no necesita la aprobación del usuario para leer/escribir la aplicación del entradas en el Llavero. Sin embargo, algunas personas necesitan para modificar la aplicación mediante la adición de su propia carpeta /Recursos. Si hacen eso, la firma se convierte en inválida, y la aplicación no puede usar su propio Llavero de entradas.

La aplicación puede detectar fácilmente si esta situación ha sucedido. Si la aplicación, a continuación, quitar la firma, todo estaría bien. Esas personas que hacen que esta modificación tendría que dar el modificado, ahora-aplicación sin firma el permiso para utilizar el Llavero, pero eso está bien conmigo.

OriginalEl autor user532477 | 2011-09-21

6 Comentarios

  1. 8

    Un poco tarde, pero he actualizado un dominio público de la herramienta llamada unsign la que se modifica la ejecutables para borrar las firmas.

    https://github.com/steakknife/unsign

    Promover el código que has escrito (incluso parcialmente) está bien, siempre y cuando usted claramente detalle cómo el OP puede utilizar para hacer lo que ellos están tratando de hacer. De lo contrario, se considera spam.
    Sí, esto realmente no tiene nada que ver con el OP pregunta, que tiene que ver con la eliminación de las firmas y de renunciar a los un paquete, no solo un ejecutable o archivo binario.

    OriginalEl autor

  2. 0

    Estoy de acuerdo en que hay algo extraño cuando se hizo --remove-signature.

    Sin embargo, en lugar de tratar de onu-signo de código, usted debe cambiar la forma en que el usuario ponga los archivos adicionales en el Resources. En lugar de ello, designar un determinado camino, generalmente

    ~/Library/Application Support/Name_Of_Your_App/
    

    o tal vez

    ~/Library/Application Support/Name_Of_Your_App/Resources/
    

    y pedir al usuario que poner los archivos adicionales que no. Luego, en el código, compruebe siempre que el directorio además de los archivos en el Resources cuando usted necesita para leer un archivo.

    El usuario puede tener varias copias de la aplicación con diferentes archivos adicionales, y puede mover la aplicación a su alrededor. Si sus archivos adicionales que están en la app, funciona todo. De lo contrario, tengo alguna manera de seguir la pista de los diferentes archivos basados en la ubicación de la aplicación y, a continuación, si la aplicación se mueve deja de funcionar. En total, un lío.

    OriginalEl autor Yuji

  3. 0

    Me encontré con este problema hoy en día. Puedo confirmar que el --remove-signature opción para Apple codesign es (y sigue siendo, seis años después de que el OP esta pregunta) en serio buggy.

    Para un poco de fondo, Xcode (y de Apple de la línea de comandos de las herramientas de desarrollo) incluyen la codesign utilidad, pero no se incluye una herramienta para la eliminación de las firmas. Sin embargo, como esto es algo que se debe hacer en determinadas situaciones con bastante frecuencia, se incluye un completamente indocumentados opción:

    codesign --remove-signature que (se supone, dada la falta de documentación) debe, además, ser bastante auto-explicativo, pero por desgracia, rara vez funciona como se pretende sin algún esfuerzo. Así que terminé de escribir una secuencia de comandos que debe tomar el cuidado de la OP del problema, el mío, y similares. Si suficiente gente lo encontrará aquí, y encontrar que es útil, hágamelo saber y voy a poner en GitHub o algo.


    #!/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 "[email protected]" -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 "[email protected]") && [ $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 "[email protected]" 2>/dev/null ||
        recursively_repeat_remove_signature "[email protected]"
    
      # 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 "[email protected]") ] ||
        recursively_repeat_remove_signature "[email protected]"
    
      # Finally, remove any leftover _CodeSignature directories.
      find "[email protected]" -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 "[email protected]";  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 "[email protected]"
    
    
    # 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 "[email protected]" && chmod -RN "[email protected]" && recursively_repeat_remove_signature "[email protected]"
    
    # 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 - "[email protected]" &&
      # signature_info "[email protected]" && recursively_repeat_remove_signature "[email protected]"
    
    # And of course, while it sometimes returns false positives, lets at least:
    codesign -dvvvv "[email protected]" || echo "Signature successfully removed!" >&2 && exit 0
    

    OriginalEl autor Geoff Nixon

  4. 0

    En una segunda lectura de esta cuestión, otro pensamiento: tal vez un mejor enfoque para lograr lo que el objetivo de la pregunta es seria no quitar las firmas, pero para tener a los usuarios (a través de una secuencia de comandos/transparente) re-registrarse en la aplicación después de la modificación, el uso de un ad-hoc de la firma. Es decir, codesign -fs - [app], creo. Ver https://apple.stackexchange.com/questions/105588/anyone-with-experience-in-hacking-the-codesigning-on-os-x

    OriginalEl autor Geoff Nixon

  5. -2

    Yo creo que se puede quitar la firma, simplemente eliminar la _CodeSignature carpeta en el paquete de la Aplicación.

    no sólo, el binario es firmado así

    OriginalEl autor BillyT2

Dejar respuesta

Please enter your comment!
Please enter your name here