The secrets of Apple Lightning – Part 1

Lightning de Apple es la
interfaz de carga y datos patentada que se encuentra en el iPhone y en algunos otros dispositivos de 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 muy interesantes relacionadas con la piratería de hardware:
por ejemplo, puede comprar estos cables DCSD en línea que le 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 dan acceso a JTAG, la
interfaz de depuración del procesador, en el iPhone, lo que hace posible realizar una
investigación de seguridad de bajo nivel realmente interesante. En esta serie, investigaremos los
detalles técnicos de Lightning: En el video 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 videos,
veremos la reimplementación de los protocolos Lightning por nuestra cuenta, ¡terminando finalmente
con un cable JTAG de iPhone hecho en casa! Ahora puede suponer que un cable Lightning
es solo un cable pasivo simple: tiene el conector Lightning en un extremo, un poco 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 viejo cable 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 placa de circuito impreso detrás del conector, con un par de chips, condensadores y demás. Entonces, ¡
comencemos a descubrir qué hace este chip! 1:25 Para comenzar, echemos un vistazo al
conector Lightning en sí: el conector Lightning es famosamente reversible
y tiene 8 contactos en cada lado. Sin embargo, si quitamos toda la pelusa que siempre se atasca 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 a él! Hagamos clic en grabar en el analizador lógico, conectemos el cable del rayo al iPhone
y podremos ver algunas señales. Bueno… ¡dos! Y si hacemos zoom en 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 se
ha conectado algo 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 repetitiva,
podemos notar que contiene cuatro pausas más grandes .

Tal vez estos sean algún tipo de
separadores, por ejemplo, entre bytes. Hagamos zoom en 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 bits… Hay
un par de formas en las que podemos ir a partir de aquí, pero es probable que Apple no supiera completamente
reinventar la rueda al diseñar Lightning, por lo que probablemente se trate de algún tipo de
protocolo conocido…

Entonces, ¿por qué no simplemente preguntarle a ChatGPT? Entonces, preguntémoslo: ¿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 de 1 cable desarrollado por Dallas Semiconductor (ahora
parte de Maxim Integrated). Utiliza un solo cable para comunicar datos codificando un bit como
una duración específica de señales altas y bajas. Entonces, echemos un vistazo al artículo de Wikipedia
sobre 1 cable, saltemos todo el blabla y busquemos un diagrama de señal… y aquí
estamos… ¡Esto parece muy familiar! Los unos están codificados como un pulso bajo corto y
un pulso alto largo, y los ceros están codificados como un pulso bajo largo y un pulso alto corto, ¡
esto se parece a nuestra señal! Impresionante, ¡ esto es todo! ¡Gracias Chat GPT! El tiempo 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 la codificación y el orden de bits.

Así que volvamos a nuestra señal
e intentemos decodificarla a mano: ignoramos la primera parte, ya que parece ser un
bit de inicio o algo por el estilo, 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 adelante, convierta la señal en
hexadecimal y terminaremos con 4 bytes: hexadecimal 74 00 02 1F. Ahora, equipados 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 a
su alrededor. 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 Logic
Analyzer y lo configuramos correctamente, podemos ver que ahora tenemos
la señal bien anotada.

Es hora de analizar más.
Repitamos la grabación lógica, pero esta vez con un cable Lightning real
conectado a una computadora. Para hacer eso, estoy agregando la otra mitad
de la extensión lightning a nuestra configuración, con el Logic Analyzer en el
medio para detectar las señales. Entonces, presionemos nuevamente Grabar, conectemos el cable
y… ¡Aquí hay mucho más! Lo primero que debe notar es que el
sondeo regular se ha ido. En cambio, si hacemos zoom 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! Así que parece que el cable
respondió a esa extraña señal de sondeo y gracias a nuestro analizador lógico incluso podemos ver
los bytes: Hex 75, 10 09 y así sucesivamente.

Pero hay mucho más sucediendo aquí. 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
en marcha. ¡ Señal USB! Podemos ver que el
voltaje ronda los 400 mV, ¡que es el nivel de señalización para USB! Entonces, ¿toda esa
comunicación Lightning es necesaria solo para activar el USB? Ahora, al volver 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 proviene. del cabo! El complemento Logic Analyzer ya sabe sobre
esto, por lo que colocó un pequeño cuadrado allí. Ahora, con solo mirar esta respuesta,
probablemente no podamos averiguar qué está pasando aquí exactamente, pero podemos notar una cosa:
el primer byte enviado por el iPhone es 74 hexadecimal, mientras que la respuesta comienza con 75 hexadecimal…
mire la siguiente transmisión… Aquí tenemos hex 70, 40, 00 A6 enviado desde el
iPhone, y hex 71 93 respondido por el cable…

Nuevamente, el primer byte de los datos enviados por
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 respondió 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 la 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 esto: ¡una suma de verificació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 y,
aunque conocemos 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! Solo le decimos a Reveng 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 queremos enviar nuestros propios mensajes! Lo necesitaremos cuando comencemos a crear
nuestra propia implementación de Lightning. Ahora, con Logic Analyzer, también podemos decodificar todos los datos a la vez como una cadena… y hay un
par de  cosas interesantes ahí: Aquí hay una cadena que dice Apple, Inc,
por lo que podría indicar el fabricante del accesorio Lightning, aquí dice Cable USB-C
a Lightnint, que de hecho lo es, y aquí hay una cadena extraña.

¡

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 USB-C a Lightning Cable (1 m). Entonces, con solo mirar la salida del analizador lógico, ya pudimos determinar el
significado de algunos comandos, ¡increíble! Para resumir: descubrimos el
protocolo de comunicación entre el chip del cable y el iPhone, que por cierto se
conoce comúnmente como SDQ o IDBUS, y vinculé un par de recursos al respecto en la descripción.
Hicimos ingeniería inversa de la suma de verificación CRC8 utilizada en Lightning, ¡e incluso pudimos
descubrir el significado de algunos de los comandos de Lightning! En el próximo video, 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 os haya gustado este vídeo, ¡
y nos vemos en el próximo!.