3 votos

¿Cómo se compila el marco de seguridad de Apple?

Estoy intentando compilar mi propia copia de Security.framework de Apple, concretamente la versión 55471.14.18, que se incluyó en OS X 10.9.5 y cuyo código fuente se puede descargar desde https://opensource.apple.com/tarballs/Security/Security-55471.14.18.tar.gz .

Estoy usando una copia de Mac OS X 10.9.5 en una VM. Se ha instalado Xcode 6.2, y xcode-select --install se ha ejecutado por separado para adquirir las cabeceras del sistema.


El archivo readme incluido en la descarga de la fuente dice:

Para construir este proyecto en un entorno Darwin (en lugar de construir en Apple), utilice el estilo de compilación Darwin. Si está construyendo con Xcode, seleccione "Darwin" en la ventana emergente "Estilo de compilación activo". Si está Si está construyendo desde la línea de comandos, especifique el estilo de construcción así:

% xcodebuild -buildstyle Darwin install

Pero cuando ejecuto el comando dado, me dice:

xcodebuild: error: option '-buildstyle' is no longer supported

Como mi copia de Xcode era actual en el momento en que se publicó este código, no estoy seguro de qué hacer con este error. Decidí ignorarlo y seguir adelante con sólo un estándar xcodebuild comando.


El primer problema con el que me encontré fue fácil de solucionar, pero me preocupa que me esté perdiendo algo más grande. El compilador se queja:

/Users/Jonathan/Desktop/Security-55471.14.18/libsecurity_utilities/lib/macho++.cpp:39:18: error: 
unused variable 'MAX_ARCH_COUNT' [-Werror,-Wunused-const-variable]
static const int MAX_ARCH_COUNT = 100;

Como la variable no se utiliza de todos modos, simplemente abrí el archivo y comenté la línea static const int MAX_ARCH_COUNT = 100; .


Desgraciadamente, aquí es donde me topé con un muro de ladrillos. Xcodebuild parece querer todo tipo de encabezados que no están en mi sistema o incluidos en el proyecto. Por ejemplo:

/Users/Jonathan/Desktop/Security-55471.14.18/libsecurity_utilities/lib/mach++.cpp:33:10: fatal error: 
      'bootstrap_priv.h' file not found
#include <bootstrap_priv.h>

Estas cabeceras son también de código abierto, ¡y sé dónde encontrarlos! Bootstrap_priv.h, por ejemplo, forma parte de launchd; la versión para OS X 10.9.5 puede descargarse de https://opensource.apple.com/tarballs/launchd/launchd-842.92.1.tar.gz

Sin embargo, no entiendo dónde debo poner estas cabeceras para que el compilador las encuentre. Cosas que he intentado:

  • Copiar el proyecto launchd a /usr/include/
  • Copiar el proyecto launchd a root del proyecto de seguridad
  • Copiando sólo Bootstrap_priv.h a /usr/include/
  • Copiar sólo bootstrap_priv.h a root del proyecto de seguridad
  • Copiando sólo bootstrap_priv.h al directorio del proyecto/libsecurity_utilities/lib/

Este último intento me permitió superar el error (y ver el siguiente encabezado que faltaba), IOPMLibPrivate.h ), pero estoy seguro de que no es lo que debo hacer. Como sigo añadiendo cabeceras en lugares aleatorios dentro del proyecto, otros archivos fuente se atascan encontrando cabeceras que ya he copiado en otros lugares. Algunas de las cabeceras mismas se atascan de esta manera, esperando una ruta relativa diferente para las dependencias de lo que el proyecto principal parece necesitar.


Me siento extremadamente no estoy en condiciones de hacerlo. ¿Dónde se supone que van estos archivos de cabecera, y cuál es el significado de ese -buildstyle opción que debo incluir pero que no se puede ejecutar? Nada de esto parece estar documentado en ninguna parte.

1 votos

Esto no encaja en ninguna parte de la pregunta, pero porque sospecho que alguien va a preguntar... ¡mi objetivo final es retroalimentar algunos cifrados SSL más recientes a esta versión antigua de Security.framework, para que Mavericks pueda interactuar con la web moderna! Si realmente voy a ser capaz de hacer que el código funcione es una pregunta abierta, pero una cosa a la vez - ¡sólo conseguir que el original compile es un primer paso necesario!

0 votos

Si se mira la pregunta, hay que dedicar tiempo a aprender a gestionar y construir proyectos basados en c. Así que usted sabe lo suficiente para depurar este yourself.an respuesta aquí sería demasiado largo b

0 votos

Los includes cpp actuales están en /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeD‌​efault.xctoolchain/u‌​sr/include/c++/v1/ch‌​rono así que podría valer la pena intentarlo. También hay esta forma de añadir rutas de inclusión al compilador: stackoverflow.com/questions/5846804/ pero todo esto parece off-topic y bueno para stackoverflow

2voto

Wowfunhappy Puntos 33

Esto terminó siendo mucho más complicado de lo que creo que encaja correctamente en el formato de preguntas y respuestas de este sitio. Aun así, no quería dejar esta pregunta colgada, ya que conseguí el marco para construir, kindda.

Este repositorio debería construirse completamente en 10.9.5 ejecutando la última versión compatible de xCode, y utilizando el SDK de 10.9. https://github.com/Wowfunhappy/Wowfunhappy-Mavericks-Security-Framework

Utilicé la "Ruta de búsqueda de frameworks del usuario" para añadir las librerías, pero como es una ruta absoluta en lugar de una relativa, puede que tengas que actualizarla en tu máquina. Esto debería ser trivial aunque sea un poco tedioso- todos los frameworks reales están incluidos en el repositorio Git. Estos Frameworks provienen de una combinación de opensource.apple.com (preferido siempre que esté disponible por razones obvias), el SDK privado de samdmarshall con ingeniería inversa, y el proyecto Darling.

El marco de trabajo construido no parece funcionar en realidad: al sustituirlo en mi disco duro, el ordenador (una máquina virtual, por suerte) no puede arrancar. Inicialmente esperaba que esto fuera un problema de firma de código, pero no parece que ese sea el problema. Pero, aún así, ¡funcionó!

tl;dr No estaba haciendo un estúpido descuido, los lanzamientos de código abierto de Apple son básicamente imposibles de construir realmente sin ingeniería inversa adicional. Por suerte, ese trabajo de ingeniería inversa ha sido realizado en gran medida por varios proyectos, pero aparentemente no hasta el punto de poder construir algo que realmente funcione.

0 votos

¡@1110101001 (Porque pediste actualizaciones) Seguí tu consejo con un servidor proxy, todo el tráfico https se ejecuta ahora a través de Squid y funciona muy bien! forums.macrumors.com/threads/

0 votos

Buen trabajo. (Por alguna razón stackexchange no me notificó sobre tu mención). Es posible que puedas extraer más información sobre el motivo del fallo de arranque arrancando en modo de usuario único. Pero tengo la sensación de que quizás a la versión de código abierto del framework que proporcionan le falten algunas de las funciones privadas necesarias.

1 votos

Vaya. Este árbol de fuentes es notoriamente difícil de compilar ya que depende de herramientas internas y privadas que no han sido documentadas / liberadas o sometidas a ingeniería inversa AFAIK. Muchas gracias por los posts

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X