Lightning de Apple es la
interfaz patentada de carga y datos que se encuentra en el iPhone y algunos otros dispositivos Apple. La mayoría de las personas probablemente solo lo saben al cargar
su teléfono, transferir archivos o conectar sus auriculares con cable al iPhone. Sin embargo,
Lightning puede hacer mucho más, incluidas algunas cosas interesantes relacionadas con la piratería de hardware:
por ejemplo, puedes comprar estos cables DCSD en línea que te brindan, a través de Lightning,
acceso a la consola serie del iPhone. También hay un par de cables
sobre los que puede encontrar información en línea que le brindan acceso a JTAG (la
interfaz de depuración del procesador) en el iPhone, lo que permite realizar
investigaciones de seguridad de bajo nivel realmente interesantes.
En esta serie, investigaremos los
detalles técnicos de Lightning: En el vídeo de hoy comenzaremos observando la forma en que Lightning se comunica
con el cable: ¿Qué sucede realmente cuando conectas un cable Lightning? En los próximos vídeos
veremos cómo volver a implementar los protocolos Lightning por nuestra cuenta y, finalmente,
terminaremos con un cable JTAG de iPhone hecho en casa. Ahora podrías asumir que un cable Lightning
es simplemente un cable pasivo simple: tiene el conector Lightning en un extremo, un trozo de cable y
luego USB en el otro extremo. Sin embargo, en realidad, un simple cable Lightning es mucho más complejo: he
disuelto el conector Lightning de un cable viejo roto en acetona, y si miramos el conector
después de quitar un poco de blindaje metálico podemos ver que hay mucho más aquí que solo un poco
de cable: hay una pequeña PCB detrás del conector, con un par de chips, condensadores y ¡hijo! Entonces, ¡
comencemos a descubrir qué hace este chip! 1:25 Para comenzar, veamos el
conector Lightning en sí: el conector Lightning es famoso por ser reversible
y tiene 8 contactos en cada lado.
Sin embargo si quitamos toda la pelusa que siempre se queda atrapada en
el puerto Lightning, podemos ver que solo hay contactos en un lado, por lo que ya sabemos
que Lightning solo usa 8 de los 16 contactos. ¡ Así que echemos un vistazo a lo que sucede
a nivel eléctrico cuando conectamos un cable USB Lightning a un iPhone!
Corté un cable de extensión Lightning, soldé algunos cables de puente y conecté un
analizador lógico al enchufe. ¡Esto nos permite ver qué sucede cuando simplemente conectamos un cable Lightning
al iPhone sin nada conectado! ¡ Presionemos grabar en el analizador lógico, conectemos el cable del rayo al iPhone
y podremos ver algunas señales! Bueno… ¡dos! Y si ampliamos la señal y
comprobamos las diferentes partes, parece que es la misma señal alternando
una y otra vez en ambas líneas… Como no tenemos nada más conectado, parece que esta
podría ser la señal que usa el iPhone para sondee si algo se
ha conectado al iPhone. Antes de continuar y conectar un
periférico real al puerto Lightning, echemos un vistazo más profundo a esa señal.
Si observamos la señal repetida,
podemos notar que contiene cuatro pausas más grandes . Quizás se trate de algún tipo de
separadores, por ejemplo entre bytes. Acerquémonos a uno de estos bloques. Estoy
seleccionando intencionalmente uno en el centro aquí, ya que es más probable que no estemos viendo
un prólogo o epílogo de la señal. Ahora, al mirar esto, podemos notar que
este bloque tiene 8 valles en la señal, con dos longitudes diferentes. Y… tal vez estas
dos longitudes indiquen si se transmite un cero o uno . Esto podría tener sentido, ya que con
8 de estos tenemos suficientes bits para formar un byte. Sin embargo, hay un problema: no sabemos
qué es un 1 o qué es un 0… Y tampoco sabemos el orden de los bits… Hay
un par de maneras en las que podemos avanzar desde aquí, pero es probable que Apple no lo haya hecho completamente.
reinventar la rueda al diseñar Lightning, por lo que probablemente se trate de algún tipo de protocolo bien conocido
… Entonces, ¿por qué no preguntarle a ChatGPT? Entonces, preguntémonos: ¿qué buses integrados de un solo cable existen que codifican bits con diferentes
longitudes de señales bajas y altas? Y sugiere útilmente:
uno de esos buses es el bus 1-Wire desarrollado por Dallas Semiconductor (ahora
parte de Maxim Integrated).
Utiliza un único cable para comunicar datos codificando un bit como
una duración específica de señales altas y bajas. Así que echemos un vistazo al artículo de Wikipedia
sobre 1 cable, saltemos toda la palabrería y busquemos un diagrama de señal… y aquí
estamos… ¡Esto parece muy familiar! Los unos se codifican como un pulso bajo corto y
un pulso alto largo, y los ceros se codifican como un pulso bajo largo y un pulso alto corto. ¡
Esto se parece a nuestra señal! ¡Genial, esto es todo! ¡Gracias ChatGPT! La sincronización de
nuestra señal es un poco diferente, pero podemos usar la información del artículo de Wikipedia como
una buena primera suposición sobre codificación y orden de bits. Así que volvamos a nuestra señal
e intentemos decodificarla a mano: ignoramos la primera parte porque parece ser un
bit de inicio o algo así, y miramos el bloque que sigue: podemos anotar los
bits aquí con lo que vimos en wikipedia: Los ceros son cuando la señal es mayormente baja, y los unos son
cuando la señal es mayormente alta…
Hagamos también lo mismo con los otros tres bloques… Ahora, según
wikipedia, el bit menos significativo viene primero, así que podemos Ahora continúa y convierte la señal a
hexadecimal, y terminaremos con 4 bytes: hexadecimal 74 00 02 1F. Ahora que contamos con este conocimiento, podemos
escribir nuestro propio complemento de analizador lógico. ¡Esto facilitaría mucho el análisis! Pero… obviamente,
no somos los primeros en analizar Lightning, por lo que ya hay bastantes recursos al
respecto. De hecho, escribí un complemento de analizador lógico para el
bus Lightning hace un par de años . Se llama SDQAnalyzer y está disponible
en Github, así que usemos ese. Y si lo cargamos en el
Analizador Lógico y lo configuramos correctamente, ¡ podemos ver que ahora obtenemos
la señal muy bien anotada! Es hora de analizar más.
Repitamos la grabación lógica, pero esta vez con un cable de iluminación real
conectado a una computadora. Para hacer eso, estoy agregando la otra mitad
de la extensión Lightning a nuestra configuración, con el analizador lógico en el
medio para detectar las señales.
Así que volvamos a presionar grabar, conectar el cable
y… ¡Hay muchas más cosas sucediendo aquí! Lo primero que hay que notar es que el
sondeo regular ha desaparecido. En cambio, si nos acercamos y recordamos nuestro
análisis anterior de la señal de sondeo, podemos ver que la primera parte es la misma:
74 00 02 1F – pero… ahora ¡Hay muchos más datos detrás de esto! Entonces parece que el cable
respondió a esa extraña señal de sondeo. Y gracias a nuestro analizador lógico podemos incluso ver
los bytes: Hex 75, 10 09 y así sucesivamente. Pero aquí están sucediendo muchas más cosas. Hay muchos
mensajes diferentes a través de ese bus de 1 cable, y también podemos ver que otras dos líneas
se activan: el canal 1 y el canal 2 tienen esta extraña señal diferencial
.
Y es posible que la reconozcas: esta es una línea de alta velocidad. ¡Señal USB! Podemos ver que el
voltaje ronda los 400 mV, que es el nivel de señalización para USB. Entonces, ¿es necesaria toda esa
comunicación Lightning solo para activar el USB? Ahora, volviendo a acercarnos a la señal inicial,
también podemos ver una breve pausa entre los datos del teléfono y la respuesta
del cable; esto nos permite determinar qué parte de la señal proviene del teléfono
y qué parte viene. del cable! El complemento Logic Analyzer ya sabe
esto, por lo que colocó un pequeño cuadrado allí. Ahora bien, con sólo mirar esta respuesta
probablemente no seremos capaces de descubrir qué está pasando exactamente aquí, pero podemos notar una cosa:
el primer byte enviado por el iPhone es hexadecimal 74, mientras que la respuesta comienza con hexadecimal 75…
Mire la siguiente transmisión… Aquí tenemos hexadecimal 70, 40, 00 A6 enviado desde el
iPhone, y hexadecimal 71 93 respondido por el cable…
Nuevamente, el primer byte de los datos enviados por el
iPhone se incrementa en uno en la respuesta. . Y en el siguiente bloque es lo mismo: 0x76
enviado por el iphone, y la respuesta comienza con 0x77! Y aquí lo mismo: hex 90
desde el teléfono, 91 contestado por el cable. Esto hace que sea probable que el primer byte
enviado por el teléfono indique el tipo de comando o solicitud, mientras que el primer
byte devuelto por el cable sea la indicación de que es la respuesta a la solicitud. Además, si enumeramos algunas de las solicitudes, la mayoría
de los datos parecen tener una entropía bastante baja: El comando o solicitud al principio, muchos
ceros, pero… El último byte siempre es aparentemente aleatorio. Si ha examinado los protocolos integrados
antes, probablemente ya pueda adivinar qué podría ser: ¡una suma de comprobación! Se utiliza una suma de verificación para
verificar si los datos se recibieron correctamente y el tipo más común de suma de verificación es
CRC, la verificación de redundancia cíclica. Sin embargo, hay muchos polinomios CRC diferentes,
por lo que, aunque sabemos el tamaño (1 byte u 8 bits), todavía hay muchos CRC diferentes que
podrían ser.
Afortunadamente, los CRC son relativamente fáciles de aplicar ingeniería inversa y, usando una herramienta llamada
venganza, ¡podemos hacerlo en un par de segundos! Simplemente le indicamos a Revenge el tamaño
del CRC que estamos buscando (en nuestro caso, 8 bits) y le proporcionamos
un par de muestras. Acabo de copiar un par de solicitudes que
vimos en el analizador lógico. Y si presionamos regresar… De hecho, obtenemos dos
polinomios CRC que coinciden con la señal. Perfecto, con esto podemos crear CRC para
cuando queramos enviar nuestros propios mensajes. Lo necesitaremos cuando comencemos a crear
nuestra propia implementación Lightning. Ahora, con el Analizador Lógico también podemos decodificar todos los datos a la vez como cadenas… y hay un
par de cosas interesantes allí: Aquí hay una cadena que dice Apple, Inc,
por lo que esto podría indicar el fabricante del accesorio Lightning, aquí dice USB-C
a cable Lightning, que de hecho lo es, y aquí hay una cadena extraña. Y si
miras muy de cerca tu cable Lightning, en realidad tiene un número de serie impreso
, y este es exactamente ese número de serie.
¡número! Con esta información podemos inferir el significado
de algunos comandos: por ejemplo, esta solicitud: Hex 80 00 hace que el cable responda con 81 Apple,
Inc, por lo que podría ser un comando "Obtener fabricante". También podemos notar que el cable responde con
una cadena de 31 bytes, y el 0x1F en la solicitud resulta ser 31 en decimal, por lo que esta podría ser
la longitud de la respuesta que espera el iPhone. Y esta solicitud aquí, 80 01, hace que el cable responda con A2249, que resulta
ser el número de modelo del cable. Y… 80 02 hace que el cable responda
con un cable USB-C a Lightning (1 m). Así que con solo mirar el resultado del analizador lógico ya pudimos determinar el
significado de algunos comandos: ¡increíble! Para resumir: hemos descubierto el
protocolo de comunicación entre el chip en el cable y el iPhone, que por cierto se
conoce comúnmente como SDQ o IDBUS y he vinculado un par de recursos al respecto en la descripción.
Hemos realizado ingeniería inversa a la suma de comprobación CRC8 utilizada en Lightning, ¡e incluso ya pudimos
descubrir el significado de algunos de los comandos de Lightning! En el siguiente vídeo, comenzaremos a construir
nuestro PROPIO cable Lightning y programaremos un microcontrolador para que actúe como si fuera el
chip integrado en el cable Lightning.
Espero que te haya gustado este vídeo
y ¡nos vemos en el próximo!.