Ir al contenido

Analisis Firmware 3Com11g


Publicaciones recomendadas

1) ANÁLISIS PRELIMINAR

Como el mejor sitio por el que comenzar algo suele ser por el principio, recopilo la información existente hasta el momento:

Lo primero que vamos a hacer es trocear el fichero correspondiente al firmware (.bin) en los archivos que lo componen, mediante:

/

-> reparamos los archivos producidos.

-> descomprimimos cada uno.

O mediante el siguiente script (modificado del anterior por eiaccb en barrapunto):

/



#!/usr/bin/perl 

# trocea.pl divide el firmware en los ficheros zip que lo componen


$hb="PK\x03\x04"; 

$he="PK\x05\x06"; 

undef $/; 

$bulk = <>; 

(@f)= ($bulk =~ m/(?$hb.*?$he.{18}).*?)+/sg); 

for(@f) { $i++; open F, ">fw$i.zip"; print F $_ }

Así, comprobamos que cada firmware "válido" para el router está compuesto por (tras descomprimir los ficheros): * 3Com 1.05 Firmware oficial PFS.IMG ______________________ 949.617 bytes SOHO.BIN ___________________ 1.737.312 bytes 3890EndFW_1.0.4.3.arm _________ 93.996 bytes * SMC 0.71 SMC 7804WBRA Barricade PFS.IMG ______________________ 693.867 bytes SOHO.BIN ___________________ 1.793.784 bytes 3890EndFW_1.0.4.3.arm _________ 93.996 bytes * Belkin 1.08.03 Belkin F5D7630-4A PFS.IMG ______________________ 950.317 bytes SOHO.BIN ___________________ 1.936.996 bytes * 3Com 1.24 3Com Office Connect 11g ADSL (3CRWE754G72-A) PFS.IMG ______________________ 819.254 bytes SOHO.BIN ___________________ 1.494.732 bytes ASW_R13_9_38.bin _____________ 490.324 bytes - El firmware cargado por el router (fichero .bin) tiene siempre un tamaño de exactamente 1.802.250 bytes. - SOHO.BIN = firmware, kernel. - PFS.IMG = web, ramdisk. - 3890EndFW_1.0.4.3.arm =firmware miniPCI intersil. - Estos ficheros no tienen porque ajustarse a un tamaño fijo. - Usuarios del router Belkin F5D7630-4A han informado de que tras actualizar al firmware SMC pierden el soporte para redes inalámbricas. Puede comprobarse que el firmware belkin no incluye el fichero 3890EndFW (firmware de la miniPCI de nuestro router). Es de suponer que el soporte wireless de Belkin está incluido en su SOHO.BIN (de tamaño sensiblemente superior). Sin embargo, al cargar el firmware Belkin en nuestro router, se mantiene el funcionamiento wireless. Buen momento para olvidarnos por ahora de belkin y su firmware. Seguimos con SMC y 3Com. - Respecto al 3Com Office Connect 3CRWE754G72-A, al cargar su firmware en nuestro router, el modem deja de funcionar. En el firmware observamos que hay un fichero diferente, ASW_R13_9_38.bin. En este caso no es para la miniPCI wireless (que por cierto sí es la misma en ambos routers), sino para el modem ADSL. Así que, por el momento abandonamos también este router y su firmware. 2) COMPOSICIÓN DEL FIRMWARE 2.1) Analisis A partir del fichero .bin original de cada firmware (3Com y SMC), buscamos las pautas de composición con ayuda de un editor hexadecimal. Una gran ventaja que tenemos es la posibilidad de contrastar resultados al tener (al menos) 2 firmwares diferentes que funcionan en el router al 100%. Se trata de encontrar que partes están en posiciones fijas dentro del fichero, y que significado tienen. 2.2) Conclusiones: 2.2.1) Cada fichero comienza siempre en una dirección fija: *) Layout del firmware: Se indica dirección de inicio y fin de cada una de las regiones (en mayúsculas), y el offset tanto en decimal como hexadecimal para cada elemento (en minúsculas) de cada región:

----------------------------------------------------

IMAGEN WEB________________ 0x000000 - 0x077FFF

----------------------------------------------------

pfs.zip + firmware ID_____ 0000000 = 0x000000 ]---> Size = 183.464 bytes

.

. PAD (0xFF)

.

size + signature + CRC32__ 0491508 = 0x077ff4


----------------------------------------------------

FIRMWARE__________________ 0x078000 - 0x1B7FFF

----------------------------------------------------

soho.zip _________________ 0491520 = 0x078000¯¯¯|

.                                               |

. PAD (0xFF)                                    |

.                                               |

3890EndFW_1.0.4.3.zip ____ 1413120 = 0x159000   |-> Size = 1003530 bytes

.                                               |

. PAD (0xFF)                                    |

.                                               |

firmware ID ______________ 1495040 = 0x16D000___|

.

. PAD (0xFF)

.

size + signature + CRC32 _ 1802228 = 0x1B7FF4


FIRMWARE ID ______________ 1802240 = 0x1b8000

----------------------------------------------------

Tamaño total______________ 1802250 = 0x1B800A bytes

----------------------------------------------------

*) PAD: El tamaño de las regiones es fijo, pero el de los ficheros .zip no. Relleno a 0xFF de los bytes sobrantes. size + signature + CRC32 = 3 dword =3*4 bytes= 12 bytes Esas tres dwords son: *) Size: 4 bytes. Tamaño en bytes de cada una de las 2 regiones: size de PFS = pfs.zip + firmware ID [bytes] size de SOHO= soho.zip + 3890EndFW_1.0.4.3.zip + firmware ID + PAD [bytes] *) Signature= 0x78563412 4 bytes. 12345678 en little endian, una especie de signature común a todos los firmwares. *) CRC32: 4 bytes. Es el mismo usado por ZIP y no tiene copyright. Se aplica dos veces también en el firmware, ¿a que partes? pues a las mismas definidas por size. Recalcar que se aplica a los ficheros comprimidos (no al contenido útil descomprimido). Así: - Región PFS : CRC = CRC32(pfs.zip+firmware ID) - Región SOHO: CRC = CRC32(soho.zip + 3890EndFW_1.0.4.3.zip + firmware ID), incluyéndose los bytes de relleno a 0xFF que estén dentro. *) Firmware ID: 10 bytes característicos de cada firmware. Con '.' denotamos el valor 0x00. - 3Com 1.05: firmware ID = BRN3C54D.. - SMC 0.71 : firmware ID = BRN154DSL. - Parece que tan solo el que se incluye en mayúsculas en el mapa anterior se comprueba en la actualización del firmware. 2.2.2) A la hora de actualizar el firmware, se realizan varias comprobaciones antes de flashear. Posibles mensajes de error: - / : Tamaño del fichero, que sea igual a 1802250 bytes - / : PFS.IMG error - / : SOHO.BIN error (¿¿CRC32??) - / : BRN error - / : PFS.IMG + SOHO.BIN error - / - / : parece que tan solo se comprueba Firmware ID existente al final(CRC32 + Signature en 0x1B7FF4). El Firmware ID existente en 0x16D000 y al final de PFS.IMG no invalidan el proceso de actualización. 2.2.3) El firmware ( .bin) puede componerse a partir de los ficheros individuales no comprimidos de la siguiente manera: * Comprimir PFS.IMG. * Añadir Firmware ID. * Relleno a 0xFF hasta tener 78000 bytes en el total del firmware. * sustituir los 12 últimos bytes por size + signature + CRC32. * Comprimir SOHO.BIN. Concatenar al archivo anterior. * Relleno a 0xFF hasta tener 1413121 bytes en el total del firmware. * Comprimir 3890EndFW_1.0.4.3.arm. Concatenar al archivo anterior. * Relleno a 0xFF hasta tener 1495040 bytes en el total del firmware. * Añadir Firmware ID. * Relleno a 0xFF hasta tener 1802240 bytes en el total del firmware. * sustituir los 12 últimos bytes por size + signature + CRC32. * Añadir Firmware ID. *) Respecto a la compresión usada es PKZIP (ver InfoZIP) con las siguientes opciones: - No directory entries. - Ignore directory names. - Level Compression = 5. Parece que ese es el nivel de compresión usado en el firmware original: el fichero comprimido obtenido a partir del troceado del firmware, y el fichero que resulta tras descomprimir el anterior y aplicarle zip con esos parámetros tienen exactamente el mismo tamaño. Podría pensarse en usar un nivel más alto de compresión (máximo 9) para aprovechar mejor el espacio disponible (1802250 bytes, no los 2MB totales de la memoria flash), pero parece que hay problemas en ello, al menos con el SMC7004 (más info):
It is good to notice that zip -9 and zip -9k to compress soho.bin will cause area 3 not to be loaded correctly and unit to HANG. It appears that pfs.img can be zipped with any of -9 or -9k without problems. Better to use zip pfs pfs.img and zip soho soho.bin (without compression parameters) on both files to avoid problems! It appears the internal names are checked on SMC7004VWBR. Better mantain the standard! (pfs.img for ramdisk and soho.bin for kernel)
2.3) Resultados: Buscamos una herramienta que a partir de los ficheros individuales sin comprimir nos genere un fichero .bin válido para ser cargado en el router. Lo más sencillo (vamos a respetar los nombres de los ficheros): / compose_pkzip.sh Comprime los ficheros con pkzip (he probado también gzip pero obtengo un mensaje de error "Incorrect user interface image" a la hora de intentar actualizar), y empaqueta el resultado.


pkzip -a pfs.zip  pfs.img

pkzip -a soho.zip soho.bin

pkzip -a 3890EndFW_1.0.4.3.zip 3890EndFW_1.0.4.3.arm

./mkfirm.exe pfs.zip soho.zip 3890EndFW_1.0.4.3.zip custom_firmware.bin

mkfirm.c

Uso: /

Adaptado para el SMC7804WBRA a partir de la versión de Petr Novak para el smc7004abr.

Código en siguiente post.

-> Con esto se obtiene un firmware que puede cargarse en el router sin problemas.

[Editado el 6/9/2004 por MetalHead]

[Editado el 6/9/2004 por MetalHead]

Enlace al mensaje
Compartir en otros sitios web
Invitado
Este tema está cerrado a nuevas respuestas.
×
×
  • Crear nuevo...

Información importante

Términos de Uso Política de privacidad Hemos colocado cookies en su dispositivo para ayudar a mejorar este sitio web. Puedes ajustar la configuración de tus cookies ; de lo contrario, asumiremos que quieres continuar.