Nintendo Wii: Lo que siempre quisiste saber y nadie te explicó

Cómo todos sabéis, por navidad mi hermana me regaló una Wii. No soy de jugar mucho, pero sí de trastear y he ido aprendiendo algunas cosas que, al menos a mí, me parecen interesantes, pero no he encontrado ningún blog que las explique de forma clara… y mucho menos en español (y eso que contamos con gente de excelente calidad en la scene, como Hermes), así que me he decidido a aportar mi granito de arena.

Antes de que sigas leyendo, esto no es una guía para modificar tu Wii, es para que entiendas qué diablos estás haciendo cuando la modificas. Desde luego si asimilas esto podrás modificarla, pero hay guías hechas con eso en mente que te serán más útiles (busca en El Otro Lado).

¿Qué hay dentro de la Wii?

No hay oro y tampoco está Mario :( Hay algo un poco más elaborado. Cuenta con dos procesadores, un PowerPC 32 bits de IBM (Broadway) a 729MHz y un ARM9 (Starlet).

Eh, un momento… ¿un PowerPC y un ARM?

Sí , eso es. El ARM se usa para la puesta en marcha, las funciones de seguridad, el acceso a dispositivos y para correr el S.O. (IOS) de la Wii.

Eso suena bastante alejado a la GameCube, ¿por qué puede la Wii ejecutar juegos de GameCube?

Buena pregunta. El PowerPC de la Wii es una evolución del incluido en la GameCube (básicamente es ese micro al doble de frecuencia). Lo que hace la Wii cuando ejecutas un juego de GameCube es dejar de ejecutar IOS (el S.O. de la Wii que corre en el ARM) y ejecutar MIOS, que corre en el PowerPC y da total compatibilidad (básicamente es una GameCube con esteroides).

Eso de IOS lo oigo mucho, dices que es un S.O. pero a mí me suena oir IOS60, IOS70, IOS222….

En la mayoría de las consolas se tiene un firmware que controla las funciones básicas de la consola y es con el que “hablan” los juegos para pedirle cosas a la consola (pon aquí tal gráfico, ahora haz sonar esto otro, etc…). En la Wii no existe un firmware, sino que existen muchos. Podemos ver los IOS como firmwares.

¿Para qué quiere Nintendo una consola con más de un firmware?

Comodidad. Si un juego necesita incluir soporte para un nuevo periférico, digamos una guitarra USB, no tienen más que distribuir su propio IOS al que le añaden ese soporte y, voilá :) No hay que preocuparse de nada más… cada juego está pensado para ejecutarse sobre un IOS (o series de ellos… pero bueno, no compliquemos) específico, así que si GuitarHero añade un nuevo IOS, los demás juegos ni se enterarán, porque no van a usar el IOS del GuitarHero. OJO, no digo que cada juego tenga su IOS, la inmensa mayoría de juegos usan los mismos IOS, pero de vez en cuando un juego necesita algo más y crea el suyo.

¿Cómo es posible que haya programas de terceros ejecutándose en las Wiis?

La Wii impide, por defecto, la ejecución de código no firmado por Nintendo. Esto impediría que cualquiera sacase su propio programa y/o juego para la Wii sin la aprobación de Nintendo. Afortunadamente la scene ha encontrado formas de saltárselo.

Guay… pero ¿cómo?

Cuando un programa intenta ser cargado en la Wii, se realiza una verificación de la firma de Nintendo, que está hecha con el algoritmo RSA. Básicamente se realiza una comparación entre el resultado del RSA y el resultado esperado, si coinciden, ha sido firmado por Nintendo y la Wii acepta la ejecución, si no, te manda para casa.

El problema es que los programadores de Nintendo usaron la función de C strcmp para comparar los resultados, lo que no sería un problema de no ser porque no son cadenas de texto, sino datos binarios. Efectivamente el código funciona, pero strcmp dejará de ejecutarse tan pronto se encuentre un NULL… devolviendo verdadero. Lo interesante es que, en RSA una entrada de todo ceros, produce una salida de todo ceros, vaya que gracias a esta cagada de implementación, un algoritmo que tomaría años de fuerza bruta para obtener un hash válido, se reduce a unos pocos ciclos de reloj xD

¿Y qué es eso de el Bug Trucha?

El Bug Trucha, a.k.a. Signature Bug, se refiere a esa cagada del código.

A mí me sonaba algo del Twilight…

Sí, es un bug anterior al Trucha, pero requería del juego (original) para explotarlo. El problema estaba en que el juego nos dejaba ponerle nombre al caballo, y lo guardaba en la partida (que se almacena en la SD). Curiosamente, al cargarla, no verificaba que el nombre del caballo tuviera una longitud adecuada, así que si modificábamos el nombre del caballo por uno mucho más grande, conseguíamos hacer un buffer overflow que podíamos aprovechar para ejecutar código saltándonos la verificación de Nintendo (en realidad es que usábamos la firma del Twilight).

¿Por qué no se usa?

Nintendo parcheó ese bug, las versiones del sistema 4.0 y superiores son inmunes. A parte, necesitas tener el juego.

¿Podemos entonces instalar software no firmado por Nintendo en nuestra Wii?

Sí. De hecho, el Homebrew Channel (que actualmente se instala haciendo uso de Bannerbomb) nos permite lanzar todo el software no firmado por Nintendo que queramos sin tener que hacer peripecias.

¿Bannerbomb? ¿Qué es eso?

Es otro bug (sí, otro más) que ocurre cuando intentamos cargar desde la SD un Canal con un banner inválido. La Wii no lo maneja bien y podemos ejecutar código no firmado.

¿Y podemos correr backups de juegos?

Sí, podemos… pero requiere algo más de “magia”. Para empezar, las Wiis nuevas (más o menos, del verano de 2009 para acá) incluyen una unidad de DVD que es incapaz de leer discos grabados con laser, así que necesitaremos cargar nuestros juegos desde un disco duro externo o desde una lectora dvd externa. Ninguna de estas dos cosas está soportada por defecto por la Wii (quién lo hubiera imaginado :P) así que necesitamos crear soporte para ellos. ¿Recordais que antes os dije que no había un firmware (IOS) sino muchos? Pues básicamente la scene ha creado uno que incluye la funcionalidad que necesitamos.

Básicamente se basa en usar un IOS con las funciones que necesitan los juegos, modificarlo para añadir el soporte que necesitamos e instalarlo como un IOS nuevo. A estos IOS se les llama Third-party IOS, custom IOS o cIOS.

En la PSP se hace algo parecido, se usa un firmware modificado, claro que la PSP sólo tiene un firmware, así que modificarlo significa que todo queda modificado. Aquí simplemente añadimos un nuevo IOS que usaremos para lo que nosotros queramos, el resto de la consola no se entera de nada.

¿Corre peligro la Wii al instalar un cIOS?

Bueno, esto depende… imagínate que sobreescribes un IOS que la Wii está usando. Eso podría hacer que algunos juegos no funcionaran, hasta que restaurases el IOS. Es un problema, pero no suena tan mal, ¿verdad? Ahora imagínate que sobreescribes el IOS que usa el System Menu (que es básicamente la interfaz de la Wii)… obtendrías un ladrillo blanco. En la versión 4.2 del System Menu, el IOS asociado es el 70… así que ya sabes… NO TOQUES EL IOS70 a menos que sepas muy bien lo que haces y tengas una buena razón para ello.

Sabía que no necesitaba modificar el IOS70, pero soy demasiado gilipollas como para hacer caso a todo el mundo y lo modifiqué de todos modos ¿Puede arreglarse?

Sí y no. La scene ha creado programas que reemplazan el arranque original de la Wii permitiéndote restaurar la NAND y protegiéndote de cualquier peligro. Obviamente esto requiere que el programa estuviera instalado antes de obtener el ladrillo y que hubieras hecho una copia de seguridad de la NAND.

Ah bueno, entonces no hay peligro… ¿verdad?

Lo hay. Esos programas que se instalan en el arranque (como BootMii) dependen del fallo de firma (Signature Bug, o Trucha) presente también en el código de arranque de la Wii (oye, ya que metes la pata, al menos métela en todos los sitios :P). Nintendo puede actualizar los IOS y solucionar el bug (de hecho, ya están todos corregidos) pero no el arranque. Una vez que la consola se ha fabricado, el arranque no puede ser modificado. Las Wiis nuevas han sido fabricadas sin este bug en el arranque, impidiendo que BootMii y otros programas suplanten el arranque original de la Wii.

¿Por qué no puede modificarse el arranque de la consola?

Para eso hay que entender cómo funciona el arranque. Se basa en 3 fases secuenciales: BOOT0, BOOT1 y BOOT2

image

Veamos, BOOT0 no puede ser modificado porque está escrito en ROM. BOOT1 podría ser modificado, pero sería fútil ¿por qué? Bueno, BOOT0 lee, desencripta y VERIFICA BOOT1. Es decir, BOOT0 posee un hash SHA-1 del BOOT1 válido. Modificar BOOT1 haría que su firma variase, y por tanto no coincidiría con la que tiene BOOT0, haciendo que este se negara a cargar BOOT1 y obteniendo un ladrillo de diseño muy caro.

BOOT2 puede ser modificado, pero sin la firma de Nintendo, BOOT1 se negaría a cargar BOOT2.

Las Wiis antiguas contienen un BOOT1 con el fallo de firma, lo que permite a la scene suplantar a BOOT2 sin que BOOT1 se queje.

¿Puedo instalar BootMii en una Wii nueva?

Sí, puedes. Pero no como BOOT2, sino como IOS (que en realidad es un MIOS, porque funciona en modo GameCube…). El caso es que podrás hacer una copia de seguridad de la NAND y restaurarla, pero sólo si el System Menu está operativo, ya que cargarás BootMii desde Homebrew Channel. Por eso, una vez más, NO MODIFIQUES EL IOS70 si no sabes muy bien lo que estás haciendo.

Por Carballude

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P

10 comentarios

  1. Gracias Topofarmer.

    Alejandro, lo cierto es que no me parece tan dificil cometer ese error. Normalmente todos pensamos en hashes como cadenas de texto porque las representamos así. Sabemos que no lo son, pero…

  2. Oye, pero te puedo hacer una pregunta….bueno lo tomo como si jaja

    pero asi como se «falsifica la firma de nintendo no podria hacerce eso en el boot 1, entiendo lo del boot 0 por que esta en rom, pero y el boot 1?
    gracias

  3. pepe: Como bien dices, Boot0 está en ROM y no puede ser modificado. Boot1 puede modificarse, pero no te serviría de nada. Boot0 contiene un hash de Boot1 y se negará a cargar Boot1 si la firma no coincide. Cualquier modificación de Boot1 haría que la firma no coincidiese, y dado que esa firma está en Boot0 y Boot0 no puede modificarse, no es posible modificar Boot1 sin modificar Boot0 y que la consola arranque.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *