SDK oficial + Iphone 3G pwned sin pasar por caja
A cualquiera que le apasione la tecnología y le guste trastear con los últimos gadgets, en algún momento se le habrá pasado por la cabeza hacerse con un iPhone 3G, quizá para juguetear un poco con él.
Lo que vamos a ver aquí es cómo podemos testear nuestras propias aplicaciones directamente en un iPhone 3G , Jailbroken y con el firmware 2.0.
Las virtudes de este nuevo teléfono de Apple, a estas alturas ya deberían ser de sobra conocidas por todos. Aunque es un cacharro excelente es una lástima que aún no tenga un sistema de cifrado en condiciones, ya que en mi opinión es lo que más falta le hace para su implantación masiva a nivel empresarial.
Realizar el Jailbreak de este teléfono es una tarea bastante trivial, y teniendo en cuenta que ya hay varios programas que nos permitirán hacerlo, no voy a comentar el proceso a seguir. Tan solo hay que tener un poco de cuidado para no acabar con un ladrillo.
Si queremos programar para el iPhone a nivel particular y usamos el entorno de desarrollo oficial en Mac OS X (XCode 3.1 y el SDK oficial de Apple), básicamente el problema se nos plantea cuando conectamos el iPhone a nuestro Mac y tratamos de testear nuestras propias aplicaciones directamente en el dispositivo. El iTunes no lo reconoce como un iPhone autorizado para el desarrollo, y por lo tanto, no conseguiremos hacer un Build & Go desde el XCode seleccionando como destino el teléfono.
Lo que sucede es que todas las aplicaciones, para poder ejecutarse en el iPhone necesitan estar firmadas. Para ello, necesitaremos añadir al keychain de nuestro Mac un certificado válido, que será el que utilizará el XCode para firmar los ejecutables.
Si uno se apunta al programa de desarrollo oficial, Apple facilita un certificado que permite además comercializar y distribuir las aplicaciones mediante la AppStore. Pero si no queremos pasar por caja, porque lo único que necesitamos es poder probar nuestras aplicaciones directamente en el iPhone a nivel particular, tendremos que buscar otra forma de poder hacerlo. Es cierto que con el XCode 3.1 viene un simulador del iPhone. Pero entre otras cosas, el simulador no tiene GPS ;)
Así que como lo que nos interesa no es distribuir nuestras aplicaciones a terceros, podemos solventar el problema primeramente creando nuestro propio certificado digital.
Creando un certificado digital auto-firmado
Rápido y sencillo. Y con un Mac, claro ;)
Desde KeyChain Access, podemos usar el asistente para certificados para crear un certificado. En la casilla del nombre nos aseguramos de poner “iPhone developer”, como tipo elegimos raiz auto-firmada y marcamos la opción de ignorar los valores por omisión. Como tipo de certificado seleccionamos firma en código, y el número de serie simplemente cualquier número que no hayamos usado antes si ya hemos creado alguno. Todas las demás opciones las dejaremos por defecto.
Una vez que tenemos nuestro certificado digital auto-firmado, debemos asegurarnos de que todos los ejecutables generados por el XCode esten firmados. Una posible solución es utilizar en nuestro proyecto, un script en un paso a medida del Build & Go.
Añadiendo un script de firmado
El proceso de firmado de la aplicación que se ejecutará en el iPhone se puede realizar de varias maneras. Una posibilidad es utilizar la herramienta ldid creada por Jay Freeman directamente en el iPhone con cada ejecutable. Pero como esto no es nada practico utilizaremos la utilidad codesign que es la que usa el propio XCode.
Si además queremos poder depurar nuestra aplicación remotamente con el gdb una vez que el Build & Go la ha subido al teléfono, tenemos que facilitarle al codesign un archivo “de autorización”, personalizado para cada proceso de firmado. Ese archivo lo vamos a crear con un simple script en python que se puede descargar de aquí.
Guardamos el archivo createsign.py en nuestro Mac y le damos permiso de ejecución.
Ahora nos falta añadir al proceso de Build de nuestro proyecto el paso intermedio que necesitamos.
En el XCode vamos al menu opciones "Project > New Build Phase > New Run Script Build Phase". Como script introducimos lo siguiente:
---Inicio Script Build---
export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
/Users/metal/createsign.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone developer" --resource-rules "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/ResourceRules.plist" \
--entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi
---Fin Script Build---
** Cambiar en el script la ruta al fichero createsign.py por la apropiada.
MobileInstallation y SpringBoard
Para que nuestras aplicaciones no oficiales se puedan ejecutar en el iPhone tendremos que parchear en el iPhone los dos archivos que comprueban las firmas de los ejecutables, MobileInstallation y SpringBoard. El parche (firmware 2.0) ya compilado se puede descargar aquí.
También necesitaremos el archivo de “autorización” para que el codesign lo utilice con el SpringBoard.
Desde nuestra consola de OS X nos conectamos por ssh al iPhone , copiamos los 2 archivos en cuestión a nuestro mac, los parcheamos, los firmamos y los volvemos a colocar en su sitio.
scp root@Ip_del_iPhone:/System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation
.
scp root@Ip_del_iPhone:/System/Library/CoreServices/SpringBoard.app/SpringBoard .
cp MobileInstallation MobileInstallation.bak
cp SpringBoard SpringBoard.bak
chmod +x Mobile_Spring_patch
./Mobile_Spring_patch
export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
codesign -s "iPhone developer" -f MobileInstallation
codesign -s "iPhone developer" --entitlements SpringBoard.xcent -f SpringBoard
scp MobileInstallation root@Ip_del_iPhone:/System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation
scp SpringBoard root@Ip_del_iPhone:/System/Library/CoreServices/SpringBoard.app/SpringBoard
Y listo, solamente queda resetear el iPhone. Ahora ya podemos conectar el teléfono por usb y seleccionarlo como dispositivo de desarrollo en el XCode. Importante no olvidarse de añadir el script para el Build en el proyecto.


Comentarios
Añadir comentario