Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Philips-PM-5139-5138A-5136-Firmware-Project — Ingeniería inversa del firmware de los generadores de funciones Philips PM5139 / PM5138A / PM5136: emuladores 8051 utilizados como instrumentos de medición, 35 secciones de hardware documentado y un firmware V2.0 corregido | Kitploit
Herramientas/GitHubGitHub/doctormord/philips-pm-5139-5138a-5136-firmware-project
Seguridad de Sistemas EmbebidosAnálisis EstáticoAnálisis Dinámico (Sandboxing)Ingeniería InversaSeguridad de HardwareAnálisis de BinariosPapers e InvestigaciónAprendizaje y Educación

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Análisis de Firmware
GitHubdoctormord/philips-pm-5139-5138a-5136-firmware-project

Philips-PM-5139-5138A-5136-Firmware-Project

Ingeniería inversa del firmware de los generadores de funciones Philips PM5139 / PM5138A / PM5136: emuladores 8051 utilizados como instrumentos de medición, 35 secciones de hardware documentado y un firmware V2.0 corregido

Ver Repositorio
474hace 21 díasAún no revisado

Philips PM5139 — Ingeniería inversa del firmware

Un generador de funciones de 20 MHz de alrededor de 1994, desmontado en software: dos volcados de EPROM, un emulador de 8051 usado como instrumento de medición, y 35 secciones de documentación donde cada afirmación está respaldada por una dirección de listado, una medición del emulador o el esquemático.

Al final de todo hay un firmware V2.0 que corrige un defecto que Philips envió, seis formas de onda arbitrarias propias, y un simulador de navegador que ejecuta la ROM original instrucción por instrucción.

Todas las tablas de formas de onda en la ROM V1.3

Todas las tablas de formas de onda en la EPROM del programa, graficadas directamente desde el binario. Abajo a la derecha está la que inició la parte más interesante de este proyecto.


Contenido

  • Qué es esto
  • Resultados de un vistazo
  • El instrumento
  • El método: el emulador es el instrumento de medición
  • El camino hasta aquí
  • Las partes buenas
  • Firmware V2.0 — qué hay de nuevo
  • El easter egg
  • Y luego resultó ser polifónico
  • Seis formas de onda arbitrarias propias
  • El simulador de navegador
  • Estructura del repositorio
  • Uso de las herramientas
  • Reproducir todo
  • Regrabarlo
  • ¿Qué tan confiable es esto?
  • Aún abierto
  • Fuentes

Qué es esto

El Philips PM5139 es el modelo tope de 20 MHz de una familia de tres instrumentos (PM5136 / PM5138A / PM5139). En su interior hay una PCB80C652 — un núcleo 8051 con I²C por hardware — una EPROM de programa 27512, y seis ensamblajes analógicos colgando de un bus serie.

No existe manual de servicio del PM5139. La gente ha estado buscando uno en foros desde 2010. Lo que existe es el manual del PM5138A, su modelo hermano de 10 MHz, que es internamente casi idéntico.

Así que este proyecto comenzó desde el otro extremo: volcar la EPROM, y deducir qué hace el código hasta que el instrumento se entienda lo suficientemente bien como para modificarlo.

Había dos versiones de firmware disponibles, V1.3 y V1.5, ambas volcados M27512 de 64 KiB.


Resultados de un vistazo

Desensambladocompleto para ambas versiones, ~23 000 líneas, con referencias cruzadas
Listado anotado147 rutinas nombradas, 145 comentarios de encabezado, 3 826 líneas anotadas
Documentación35 secciones, 4 600 líneas, cada afirmación con fuente
Ruta de señalfrecuencia, amplitud, offset, AM, FM, burst, simetría, barrido — todo calculado y verificado contra el código original
Hardwarelos 10 strobes, el bus C, I²C con cada participante, puertos, teclado, perilla rotativa, bitmap de pantalla
Bits de estado75 de 128 con un efecto documentado
Diff de versionesV1.3 vs V1.5 es 91.4 % estructuralmente idéntico; cada cambio nombrado
Emuladoresuno en Python, uno en JavaScript (~8 M instrucciones/s), más un simulador de navegador de archivo único
Nuestro propio firmwareV2.0 — un defecto de fábrica corregido, checksum gestionado, verificado en el emulador y en hardware real

El instrumento

PosiciónTipoFunción
D301PCB80C652núcleo 8051 con I²C por hardware, 12 MHz
D30627512EPROM de programa — V1.3 ocupa 0000h–AC70h
D310X28C64EEPROM arbitraria en el bus MOVX
D305PCF8570256 bytes de NVRAM respaldada por batería en I²C (A0h)
D304-APCF8576driver LCD en I²C (70h), búfer de 20 bytes
D302-ASAA3007codificador de teclado, codificado por ancho de pulso en una sola línea
D30774HCT4514decodificador de strobe — el número de strobe son los bits de dirección A8…A11

El lado analógico es un bus C serie: el UART del 8051 funciona en modo registro de desplazamiento, TXD es el reloj, RXD los datos, y un strobe decide cuál de los diez registros de desplazamiento captura los bytes. MOV DPH,#8nh seguido de MOVX @DPTR,A dispara el strobe n. Esa única línea es la clave de toda la sección analógica.


El método: el emulador es el instrumento de medición

Esta es la parte que vale la pena robar para tu propio proyecto.

Leer un binario de 8051 de 44 KB a ojo te lleva quizás un tercio del camino. Todo lo que vino después surgió de ejecutar el código original y observar qué sale:

---```python

What formula turns the entered amplitude into the byte on the bus?

Don't read the routine. Call it.

c = CPU(rom) for w in test_values: set_amplitude(c, w) c.call(0x0AAC) # the original routine, untouched print(w, c.ram[0x1C]) # the byte that goes out on STR9

Varía la entrada, lee la salida, compruébala contra la hipótesis. Eso
funcionó para frecuencia, amplitud, offset, profundidad de AM, desviación de FM, número de ráfagas, simetría y ambas características de barrido. Cada fórmula en la documentación viene con los puntos de muestra sobre los que se verificó.

Tres refinamientos lo hicieron realmente productivo:

**Vigila el bus, no la pantalla.** La sección 15 mide qué le hace un bit de estado al búfer de pantalla, y 74 de 128 bits parecen no hacer nada. Pero muchos de ellos no controlan la pantalla, controlan los *conjuntos analógicos* — y esos solo son visibles como telegramas en el bus C. Registrar `MOV SBUF,…` y el `MOVX @DPTR` de terminación elevó el recuento de bits documentados de 54 a 75.

**Pulsa teclas, no manipules la RAM.** Establecer un byte de RAM a mano produce estados que el instrumento nunca adopta. Eso nos costó dos hallazgos erróneos y un fallo en la tabla de comandos. Inyectar códigos de tecla reales a través del SAA3007 emulado da estados a los que el firmware realmente llega — y fue un barrido por fuerza bruta sobre los 256 códigos de tecla lo que reveló qué tecla activa qué manejador.

**Sospecha primero de tu propio emulador.** Tres errores en nuestro núcleo produjeron un comportamiento "inexplicable" del firmware: `ACALL` ejecutado como `AJMP`, un flag de acarreo auxiliar ausente (por lo que `DA A` se comportaba mal y el firmware parecía contar en binario), y una interrupción de teclado duplicada. Cada hallazgo de ese periodo se volvió a medir después.

---

## El camino hasta aquí

**Primero lo estático.** Un desensamblador con una tabla de opcodes completa, luego descenso recursivo con heurísticas de tablas de salto. Eso produjo 30 508 bytes de código y dejó 13 637 bytes sin contabilizar.

**Luego lo dinámico.** Una ejecución de traza — arranque en frío, las 23 teclas del panel frontal, ambas direcciones del mando giratorio, todos los modos de operación, 86 millones de ciclos — marcando cada dirección que realmente se ejecutó. Contrastada con el análisis estático, encontró exactamente **una** zona que el descenso había pasado por alto, y 10 686 de los bytes sin explicar resultaron ser cinco bloques de tablas conocidos.

**Luego los esquemas.** El OCR del manual de servicio es inútil para los esquemas, pero las imágenes de página a 400 dpi son excelentes. Cortadas en teselas solapadas, son legibles hasta los números de pin. Se leyeron seis hojas de esta forma — y donde cinco pistas paralelas discurren a 90 píxeles de distancia, la inspección visual se sustituyó por un script (`lines.py`) que extrae los segmentos de línea del mapa de bits.
Descargar herramienta