jueves, 13 de marzo de 2008

Artículo: Dual Boot: Dos Firmwares diferentes, un solo iPod/iPhone

Mientras que Apple prepara futuras actualizaciones e intenta ir corrigiendo fallos de seguridad, tenemos más y más herramientas útiles para poder seguir abriendo una y otra vez el iPod/iPhone e ir saliendo de la carcel constantemente. En esta ocasión, y de nuevo de la mano del Dev Team, nos enseñan a como poder tener dos Firmwares dentro del mismo dispositivo, y poder arrancar una u otra indistintamente. ventajas? Bueno, que partiendo de una version JB, por ejemplo la simple 1.1.1 es posible realizar JB a la otra version instalada, por ejemplo una 1.1.4 o una 1.2. Como es esto? es simple. Si montamos una imagen desde otra, podemos montarla como lectura/escritura. Una vez realizado podemos instalarle facilmente OpenSSH o el Installer y listo.

La importancia es clara, si saliese una version 1.1.5 mañana o incluso una 1.2, sin esperar q saliese ningún método, con unos pasos "sencillos", tendríamos una 1.2 JB en perfecto estado.

El proceso es algo complejo y no apto para principiantes, lo he probado y funciona bien la verdad y sin más problemas, aunque repito q es tan solo a modo didáctico:


Lo primero será configurar iPhuc. En MAC tiene el problema de que iPhuc depende de iTunes, y no funciona con la versión 7.6, luego habría que volver a una versión anterior. Windows no tiene este problema, ya que tan solo se requiere una biblioteca dll de la versión anterior.

iPhuc se ha publicado en muchos sitios, de todos modos se puede descargar desde aquí por ejemplo:

http://conceitedsoftware.com/iphone/site/112jb.html


El segundo paso se basa en partir de una versión 1.1.x JB. Lo más comodo quizás sea partir de la 1.1.1 y visitar Jailbreakme, o quizás usar el método de Zibri para la 1.1.3 o 1.1.4. A gusto de cada uno. Una vez tengamos una versión inicial JB necesitaremos isntalar un poco lo de siempre, BSD Subsystem y OpenSSH, lo que nos dará acceso al sistema de archivo y las utilidades básicas para poder manejarlo a nuestro antojo.


El tercer paso será copiar algunas utilidades más que nos haran falta para poder montar y desmontar las particiones del iPod. Por tanto es necesario hacernos de estas herramientas, que podemos obtener o por google o por ejemplo desde la misma RamDisk del iPod o el iPhone:

fdisk
newfs_hfs
fsck_hfs
mount_hfs
umount

Necesitaremos copiar dichas utilidades en la carpeta /usr/sbin y cambiar los permisos a 755:

# chmod 755 /usr/sbin/*


Una vez todas las cosas necesarias necesitaremos preparar el espacio particionado. Lo que haremos será cambiar el tamaño de la partición de datos por defecto, que es /private/var y crearemos también una tercera partición llamada disk0s3. Pero si modificamos la partición disk0s2 para cambiarle el tamaño, lo primero que vamos a provocar es la pérdida de los datos, luego lo primero es realzar una copia de seguridad. Cuando acabemos, la partición de datos /private/var ocupará exactamente 300Mb menos, los que serán reservados para la partición disk0s3, que contendrá la segunda firmware.

# tar -cf /private.tar --preserve /private/var -> (ignorar los errores), realizará la copia de seguridad
# umount -f /private/var -> Desmontará la partición
# fdisk -e /dev/disk0 -> Nos permitirá editar la partición.

Editaremos la partición 2 para decrecer su tamaño por el numero de cilindros que tiene s1 más el tamaño delta entre s1 y s2 (normalmente 120 o 123. Para el iPhone son 153720 cilindros. Despues editar la partición 3 para comenzar a usar el mismo espacio que la partición 1 y 2
y tener el mismo tamaño que la partición 1(153600 en iPhone, 76800 en iPod).

La tabla de particiónes final debería de ser algo así:

    4GB iPhone:
Disk: /dev/disk0 geometry: 983/32/63 [1982464 sectors]
Sector size: 2048 bytes
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: AF 0 1 1 - 1023 254 63 [ 63 - 153600] HFS+
2: AF 1023 254 63 - 1023 254 63 [ 153663 - 1674861] HFS+
3: AF 1023 254 63 - 1023 254 63 [ 1828644 - 153600] HFS+
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
    8GB iPhone:
Disk: /dev/disk0 geometry: 983/64/63 [3964928 sectors]
Sector size: 2048 bytes
Offset: 0 Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: AF 0 1 1 - 1023 254 63 [ 63 - 153600] HFS+
2: AF 1023 254 63 - 1023 254 63 [ 153663 - 3657665] HFS+
3: AF 1023 254 63 - 1023 254 63 [ 3811328 - 153600] HFS+
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
    16GB iPod Touch:
Disk: /dev/disk0 geometry: 983/64/63 [3964928 sectors]
Sector size: 4096 bytes
Offset: 0 Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: AF 0 1 1 - 1023 254 63 [ 63 - 76800] HFS+
2: AF 1023 254 63 - 1023 254 63 [ 76863 - 3811059] HFS+
3: AF 1023 254 63 - 1023 254 63 [ 3811182 - 76800] HFS+
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
  8GB iPod Touch:
Disk: /dev/disk0 geometry: 983/64/63 [3964928 sectors]
Sector size: 2048 bytes
Offset: 0 Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: AF 0 1 1 - 1023 254 63 [ 63 - 153600] HFS+
2: AF 1023 254 63 - 1023 254 63 [ 153720 - 3657465] HFS+
3: AF 1023 254 63 - 1023 254 63 [ 3811185 - 153600] HFS+
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused


Hay q asegurarse de que no hemos modificado la particion 1, de lo contrario jod*** la firmware original

Una vez acabemos con la creación de las particiones, se le debe de decir a fdisk que escriba la nueva tabla de particiones. Al acabar es necesario sincronizarlas:

# sync; sync; sync;

Por alguna extraña razón, disk0s2 es movida a disk0s4 en /dev. Así que necesitaremos moverla de nuevo:

# mv /dev/disk0s4 /dev/disk0s2
# mv /dev/rdisk0s4 /dev/rdisk0s2


Ahora que ya tenemos las tres particiones en perfecto estado, queda restaurar la particion /private/var previamente salvada, para ello se le dará formato y se restaurará la copia:

newfs_hfs /dev/disk0s2
mount -t hfs /dev/disk0s2 /private/var
cd /private/var
tar -xvf /private.tar
mv ./private/var/* /private/var && rm -rf ./private


En este punto, duplicaremos la particion del OS disk0s1 a la partición recien creada disk0s3. Para evitar errores es mejor primero montar de nuevo la imagen pero solo como solo lectura:

# mount -o ro /

Ahora, usando dd copiaremos en crudo el disco encima:

# dd if=/dev/rdisk0s1 of=/dev/rdisk0s3 bs=4096

Despues de uunos minutos acabará, y sería una buena udea usar fsck, que realizará una comprobación de los archivos del sistema

# fsck_hfs /dev/disk0s3

Ahora montaremos nuestro root como solo lectura y montaremos tb la nueva particion:

# mount -o rw /
# mkdir /mnt
# mount -t hfs /dev/disk0s3 /mnt


Una vez tenemos la nueva particion montada, hay q modificar algunas cosillas para q inicie correctamente.

Primero editaremos /mnt/etc/fstab para que se monte raiz como /dev/disk0s3 en vez de disk0s1. En segundo lugar tendremos q hacernos de algunos Symlink para ecitar que cuando se actualice nuestro dispositivo, ya q Apple chequea posibles particiones no legítimas, buscando la existencia de /sbin/launchd. Si encontrase, la actualización fracasaría. Afortunadamente, el chequeo monta la partición en un subdirectorio que no es chroot, luego si movemos sbin a misbin (por ejemplo) y cremos un link dede /sbin a /misbin, el chequeo fallará (pq misbin estará actualmente en /mnt), pero el link funcionará cuando la partición sea montada como root:

# cd /mnt
# mv sbin mysbin
# ln -s /mysbin sbin

Ahora si será seguro desmontar /mnt


Sería buena idea tb eliminar cualquier caché del installer de /private/var:

# find /private/var -name Installer -exec rm -rf {} \;


Lo poco que nos queda será iniciar desde nuestra nueva particion. Hay tres valores principales que son usados al inciar el iPhone/iPod:

1. auto-boot (true): Determinar cuando el ipod debería iniciarse (auto-boot) o entrar en modo de recuperación.
2. boot-partition (0): Identifica el numero de la partición a iniciar
3. boot-args: (vacío): Puede usarse para configurar el dispositivo root o el modo verbose

Configuraremos lo siguiente para iniciar la nueva partición:

# nvram boot-partition=2
# nvram boot-args="rd=disk0s3 -v"
# nvram auto-boot=true
# sync
# reboot

Para verificar que estamos corriendo fuera de la nueva particion ejecutaremos 'mount'. Esto nos mostraré nuestros discos montados. El sistema de archivos de root se debería de montar en disk0s3, no en disk0s1.

Si por alguna razón no lográsemos iniciar correctamente, deberíamos usar iPhuc para arreglar esto:

# iphuc
#: enterrecovery (si fuera necesario)
#: cmd setenv\ boot-args\ rd=disk0s3\ -v
#: cmd setenv\ boot-partition\ 2
#: cmd setenv\ auto-boot\ true
#: cmd saveenv
#: cmd fsboot


Ahora que estamos corriendo con la particion disk0s3, tan solo nos quedará actualizar desde itunes a la versión que deseemos colocar en la partición disk0s3.

Mientras q iTunes no nos de algun error numérico, al acabar tendremos un dispositivo corriendo dos firmwares diferentes. Es muy posible que no se salga del modo restauración, lo cual podemos hacer facilmente


Para finalizar usaremos iPhuc para iniciar la partición original, disk0s1. Lo primero será copiar el caché de la versión última, en este caso la 1.1.4, extraeremos el archivo de del paquete ipsw, y mediante iphuc lo copiaremos:

# iphuc
#: filecopytophone kernelcache.release.s5l8900xrb

Y para iniciar desde l a partición:

#: cmd setenv\ boot-args\ "rd=disk0s3\ -v"
#: cmd saveenv
#: cmd bootx


Para montar la partición disk0s3, una vez iniciada disk0s1:

# fsck_hfs /dev/disk0s1
# mkdir /mnt
# mount -t hfs /dev/disk0s1 /mnt

Llegados a este punto tendremos acceso completo de lectura/escritura a la disk0s3. Es buena idea tb editar el archivo fstab para permitir el archivo de lectura y escritura de root

Para configurar Terminal, lo mejor sera realizar lo siguiente:

1º. BSD subsystem
2º. Copiar Terminal.app en /mnt/Applications
3º. mkdir -p /mnt/usr/local/arm-apple-darwin/
4º. ln -s /usr/lib /mnt/usr/local/arm-apple-darwin/lib
5º. cp -p /mnt/bin/bash /mnt/bin/sh
6º. chmod 4755 /mnt/usr/bin/login
7º. Edotar /mnt/etc/master.passwd para poner la contraseña que queramos

Cuando deseemos volver de la disk0s3:

# nvram boot-partition=0
# nvram boot-args=""
# nvram auto-boot=true
# sync
# reboot

No hay comentarios:

 
Creative Commons License
Esta obra está bajo una licencia de Creative Commons.