Hola a todos,
Esta es mi herramienta CAD para tomar fotografías de una máscara de roms y extraer los bits, para que se pueda recuperar el contenido de la ROM.
Los atajos de teclado en esta herramienta no son opcionales. Lea la documentación de GUI a continuación antes de comenzar a explorar.
Si encuentra que esta herramienta es útil, compre una copia de mi libro sobre exploits de microcontroladores para usted o un estudiante inteligente.
--Travis Goodspeed

Gbrom-Tutorial te enseña cómo comenzar con fotografías de la Rom Mask de Gameboy y avanza hacia una imagen ROM precisa.
Myk82 ROM tiene un volcado completo de la ROM del chip Myk82 en una tarjeta Fortezza. Este es el sucesor del chip Clipper, y el repositorio incluye no solo todos los bits de ROM sino también rehacios para la corrección de errores.
Wersi-SLM2-51173 es una ROM Zilog Z8 de un módulo de sintetización musical.
master : mejoras de rendimiento evitando copias profundas en las listas. El recuento de bits adecuado en la barra de estado y la barra de estado ahora usa una fuente de ancho fijo.
2024-08-18-La opción Solución de soluciones de Gatorom ahora utiliza los nombres de Fiilens descriptivos. La GUI ahora puede exportar un conjunto de resultados resueltos con File/Export/SolversetBytes. Rectángulo de selección más claro. R y C ahora dibujarán el tipo de línea correcto cuando el usuario los confunda. ^H ahora establece la posición de inicio. Las teclas de zoom y movimiento ahora funcionan en la segunda vista. Las líneas perfectamente duplicadas ahora son sacrificadas durante la DRC por la tecla V Las filas y las columnas ahora se almacenan como listas ordenadas en lugar de conjuntos. Las filas y las columnas ahora están en un orden constante en la exportación de archivos. El rendimiento aumenta en el marcado de bits, el marcado de bit de fondo y la alineación. Binario universal para macOS. Romalignertilting funciona mejor para diseños con una brecha entre los bancos. Los bits fuera de visión ya no se dibujan durante el arrastre, acelerando a grupos de ajuste de largas colas.
2024-07-14-Se corrige el bloqueo al eliminar un elemento de doble selección. Eliminar y Backspace ahora elimine objetos como D . Múltiples desarmadores. Las decodificaciones ahora se actualizan a medida que se cambian los umbrales de decodificación.
2024-06-23-Resolución de reglas de Yara. Mejoras de estabilidad. Actualización de pasas de mira a los ángulos de las líneas seleccionadas. El espacio ahora repite la última línea, ya sea fila o columna. Se pueden seleccionar varios elementos y cambiar+D duplicados. Seleccione con Shift para agregar más líneas o CTRL (CMD en macOS) para eliminar las líneas. El arrastre derecho mueve varias líneas, previsualizando solo bits relevantes. Los colores de la color de cruz y la selección ahora son seleccionables. El fondo ya no se balancea cuando se aleja.
2024-05-19-Las violaciones de la RDC ahora se limpian cuando se forzan bits. Exportación de histograma para trazar las distribuciones de color en Gnuplot. Apoyo a Wayland. Soporte explícito de palabras en CLI, GUI, solucionador y decodificadores básicos. Conjuntos de solucionadores, exportando todas las soluciones potenciales como archivos binarios. Alineador poco confiable ha sido desaprobado. Solucionador de GUI. Desmembler llama al unidasm de Mame.
2024-01-28-Deshacer y rehacer. Diálogo de cadenas. Clave de barra de inactividad para la visibilidad de la capa. Algoritmo de alineación confiable. El cierre de la ventana principal cierra la aplicación.
2024-01-01-Se corrige el error del bus en el decodificador Z8 al resolver tamaños impares. Modo detallado en el Gatorom CLI. Modo squeeze-lr ahora en el decodificador GUI. Edite el elemento del menú para borrar todas las correcciones de bits. E seleccionará la próxima violación de la RDC. Las imágenes perfectamente verticales ya no rompen el algoritmo de alineación.
2023-12-07-Destacado de selección. Cuenta de fila/columna en la barra de estado. Solucionador ascii. Corrige múltiples bloqueos en solucionador de tamaños de ROM incómodos. Decodificación de Gatorom en la GUI. Eliminación de decodificadores redundantes. Visor hexadecimal y resaltado de bytes seleccionados. Gatorom CLI ahora es muy estricto por salir de acceso ilegal. Soporte de ROM Zilog Z8.
2023-09-13-Opción CLI para deshabilitar OpenGL. Soporte de impresión. Windows Windows Build.
2023-08-06-OpenGL ahora es funcional y predeterminado. Gatorom incluido para la decodificación de bits.
2023-07-20-Soporte de visualización secundaria. Muestreo alto. Las correcciones se bloquean al golpear V después de eliminar una línea.
2023-06-17-Se agregaron macOS en X86_64 y ARM64.
2023-05-30-Primer lanzamiento de Windows.
Esta herramienta funciona en Windows, Linux, FreeBSD y MacOS, utilizando QT6 con la extensión Qtcharts.
Construir la herramienta es más fácil desde el CLI. En Debian Bullseye (11.x),
% sudo apt install make gcc g++ cmake git qt6-base-dev libqt6charts6-dev
qt6-translations-l10n linguist-qt6 qt6-l10n-tools qt6-tools-* qt6-image-formats-plugins
% git clone https://github.com/travisgoodspeed/maskromtool/
...
% cd maskromtool
% mkdir build; cd build
% cmake ..
% make -j 8 && sudo make install
En Windows y MacOS, use el QT para el instalador de código abierto, asegurándose de incluir las extensiones de gráficos y formatos de imagen. Luego abra CMakeLists.txt como proyecto. Ctrl+B luego compilará maskromtool . Si tiene un problema con su importación, como elegir la instalación de QT incorrecta, elimine CMakeLists.txt.user y reabrir el proyecto para intentarlo nuevamente.
Para la comodidad de los usuarios de Windows y MacOS, también hemos realizado algunas versiones previas a la construcción.
Primero use el archivo/Abra ROM para abrir una imagen ROM como una fotografía. Intente usar formatos sin comprimir, pero tenga cuidado con que MacOS no le gusten los archivos TIFF.
Mantener la tecla de control (comando en macOS) mientras roda la rueda del mouse se acercará y saldrá. También puedes pellizcar en una plataforma de pista. Arrastrarse con el botón central se desplazará o se desplazará con dos dedos como le gusta a su sistema operativo.
Por convención arbitraria, los bits deben estar en columnas largas con filas más cortas. Si las líneas de decodificador son visibles, deberían estar en la parte superior de la imagen. Siéntase libre de fotografiarlo de una manera, luego rotarlo para obtener el marcado.
Cuando guarde su proyecto, el nombre de archivo de la imagen se extenderá con .json . Este archivo JSON ordenado y sangrado debe ser apropiado para su uso en el control de versiones, como los repositorios GIT.
Estos botones de teclado luego proporcionan la mayor parte de su entrada. Para las líneas de dibujo, primero haga clic una vez para elegir como posición de inicio y luego presione la tecla cuando el mouse esté por encima de la posición final. Eliminar un elemento o configurar su posición se aplicará a la línea colocada más recientemente, a menos que arrastre un cuadro para seleccionar una línea.
Seleccione un elemento arrastrándose sobre él con un clic izquierdo del mouse y observando que se vuelva verde. El elemento colocado más recientemente se selecciona automáticamente. Algunos comandos funcionan en múltiples elementos seleccionados; Otros solo uno.
Puede eliminar un error con D o ajustar un poco su posición con S , las teclas de flecha o un arrastre de clic derecho. Durante el movimiento, los bits de líneas no relacionadas pueden estar ocultas para el rendimiento, y la tecla M o la liberación del botón derecho del mouse los volverá a dibujar.
En macOS, ^ significa comando en lugar de ctrl.
Tab -- Show/Hide bits.
-- Show/Hide rows and columns.
^ -- Show/Hide background.
ALT -- Show/Hide crosshair.
R -- Draw a row from the last left-click position.
SHIFT R -- Repeat the last row.
C -- Draw a column from the last left-click position.
SHIFT C -- Repeat the last column.
SPACE -- Repeat the last row or column.
D -- Delete the selected objects.
SHIFT D -- Duplicate the selected lines.
S -- Set the selected object to the mouse position.
F -- Jump to the selected item.
ARROWS -- Move the selected items.
right-drag -- Move the selected items. (SHIFT or ^)
middle-drag -- Pan the view.
^ wheel -- Zoom.
Q -- Zoom to zero.
A -- Zoom in.
Z -- Zoom out.
H -- Jump to home position.
^H -- Set the home position.
SHIFT F -- Force a bit's value. (Again to flip.)
SHIFT A -- Force a bit's ambiguity. (Again to flip.)
M -- Remark all of the bits.
SHIFT M -- Update hex decoding and disassembly.
V -- Run the Design Rule Checks.
SHIFT V -- Clear the DRC violations.
E -- Jump to next violation.
^Z -- Undo
SHIFT ^Z -- Redo
^S -- Save changes.
Cuando comience a marcar por primera vez, el software aún no sabrá el umbral entre uno y un cero. Puede configurar esto con View / Choose Bit Threshold .
Incluso los mejores bits no se marcarán perfectamente, así que use SHIFT+F para forzar los valores de bits donde ve que el software está mal. SHIFT+A es similar, y se marca un poco como ambiguo o dañado. El menú DRC contiene verificaciones de reglas de diseño que resaltarán los problemas en su proyecto, como bits débiles o alineación rota.
Si colocar muchas líneas se vuelve tediosa, seleccione un grupo con el botón izquierdo del mouse y duplique todo el conjunto con SHIFT+D . Luego puede arrastrarlo con el botón derecho del mouse a la nueva posición, dejando otra copia en la posición original. Si la fotograma cae para esto, use la tecla TAB para ocultar temporalmente todos los bits, lo que acelera enormemente moviendo muchas líneas en áreas densas.
La mira se ajustará a su fila y columna más recientemente colocadas. Esto debería dejarlos inclinar un poco para que coincidan con la realidad de sus fotografías.
Después de haber marcado los bits y verificar que son precisos con DRC, ejecute el archivo/exportación para volcarlos en ASCII para analizar con otras herramientas, como Gatorom, BitViewer o Zorrom.
Además de la GUI, esta herramienta tiene una interfaz de línea de comandos que puede ser útil en las secuencias de comandos. Use el interruptor --help para ver los últimos parámetros y el interruptor --exit si prefiere que la GUI no permanezca abierta para uso interactivo.
forum% maskromtool --help
Usage: maskromtool [options] image json
Mask ROM Tool
Options:
-h, --help Displays help on commandline options.
--help-all Displays help, including generic Qt options.
-v, --version Displays version information.
-V, --verbose Print verbose debugging messages.
--stress Stress test bit marking.
-e, --exit Exit after processing arguments.
--disable-opengl Disable OpenGL.
--enable-opengl Enable OpenGL.
-d, --drc Run default Design Rule Checks.
-D, --DRC Run all Design Rule Checks.
--sampler <Default> Bit Sampling Algorithm.
--diff-ascii <file> Compares against ASCII art, for finding errors.
-a, --export-ascii <file> Export ASCII bits.
-o, --export <file> Export ROM bytes.
--export-histogram <file> Export histogram.
--export-csv <file> Export CSV bits for use in Matlab or Excel.
--export-json <file> Export JSON bit positions.
--export-python <file> Export Python arrays.
--export-photo <file> Export a photograph.
Arguments:
image ROM photograph to open.
json JSON lines to open.
Para ejecutar sin una GUI, pase -platform offscreen . Si el programa se bloquea en Wayland, forzue el uso de XORG pasando -platform xcb .
En Windows, es incómodo que un ejecutable tenga una GUI mientras conserva un registro en la CLI. Resolvemos esto produciendo dos ejecutables; Utilice maskromtool.exe para la GUI y maskromtoolcli.exe para el CLI.
Un ejecutable separado, gatorom , envuelve el decodificador de bits ROM sin los gráficos. Ver Gatorom para más detalles.
forum% gatorom
Usage: gatorom [options] bitstream
Gato ROM: A Decoder for Mask ROM Bits
Options:
-h, --help Displays help on commandline options.
--help-all Displays help, including generic Qt
options.
-v, --version Displays version information.
-V, --verbose Talk too much.
-w, --wordsize <8> Word size.bits
-r, --rotate <degrees> Rotates the image in multiples of 90
degrees.
--flipx Flips the bits along the X axis.
--flipy Flips the bits along the Y axis.
-i, --invert Inverts the bits.
-o, --output <out.bin> Output file.
--random Randomize a ROM for testing.
--Random Randomize a crazy ROM.
--rawwidth, --seanriddle <width> Width of a raw binary input, in Sean
Riddle's style.
-I, --info Info about input.
-d, --dis <arch> Disassemble.
--print Print with a GUI dialog.
--printpdf <file.pdf> Print to a PDF file.
--decode-tlcs47font Decodes as a TMP47C434N Font.
--decode-z86x1 Decodes as a Zilog Z86x1.
--decode-cols-downl-swap Decodes as a uCOM4 ROM.
--decode-cols-downr Decodes first down then right like a
Gameboy.
--decode-cols-downl Decodes first down then left.
--decode-cols-left Decodes left-to-right.
--decode-cols-right Decodes right-to-left.
--decode-squeeze-lr Decodes even bits from the left, odd bits
from right like in the TMS32C15.
-z, --zorrom Zorrom compatibility mode, with flipx
before rotation.
--leftbank Only the left half of the bits.
--rightbank Only the right half of the bits.
-a, --print-bits Prints ASCII art of the transformed bits.
-A, --print-pretty-bits Prints ASCII art with spaces.
--solve Solves for an unknown format.
--solve-bytes <bytes> Bytes as a hint to the solver.
0:31,1:fe,2:ff
--solve-ascii Look for ASCII strings.
--solve-string <bytes> Byte string as a hint to the solver.
31,fe,ff
--solve-yara <rule> Yara rule file.
--solve-set <prefix> Exports all potential solutions.
Arguments:
bitstream ASCII art of ROM to decode.
He diseñado la GUI alrededor de un QGraphicsScene . Los objetos de datos subyacentes utilizan el sistema de coordenadas QT, con flotadores para una precisión de mejor que el píxel.
Después de cargar una fotografía ROM, el usuario coloca columnas y filas en la fotografía. Cada intersección de una columna y una fila se considera un poco, y un umbral de color configurable determina el valor de ese bit. Cuando la fotografía se lee mal, también puede forzar el bit a un valor conocido.
Una vez que todos los bits se hayan marcado y el umbral elegido, el software marcará cada bit de luz como azul (0) y cada bit oscuro como rojo (1). Estos bits se alinean en listas vinculadas de filas para la exportación como ASCII, para su uso en otras herramientas.
Para identificar errores, un conjunto de verificaciones de reglas de diseño (DRC) criticará el proyecto abierto. Si bien la interfaz principal es la GUI, una CLI también está disponible para secuencias de comandos y pruebas.
Si bien unos pocos miles de bits pueden estar marcados sin un error, los proyectos más grandes inevitablemente necesitarán administrar sus errores.
Un buen comienzo es usar las comprobaciones de DRC y la configuración cuidadosa de los umbrales de bits hasta que no queden errores obvios. Luego navegue por el proyecto y presione la tecla tab para mostrar y ocultar las anotaciones, asegurándose de que cada bit se reconozca correctamente.
Cuando eso es insuficiente, como para las ROM que son decenas o cientos de kilobits, ayuda a anotar la misma ROM varias veces, preferiblemente de diferentes fotografías. Los errores de bits ocurrirán al anotar cada fotografía, por supuesto, pero ocurrirán en diferentes lugares. Luego puede usar la función --diff-ascii contra la salida de --export-ascii para comparar imágenes, conciliando sus diferencias hasta que todos los archivos de su proyecto estén de acuerdo.
La mayoría de las ROM se pueden leer simplemente leyendo el color de un solo píxel en el Centro de Bit. Para aquellos, el algoritmo de muestreo Default funcionará bien.

Para las roms de difusión cuyos bits han sido demasiado retrasados, el centro de la broca no tiene un color único, pero está rodeado de líneas ligeramente más oscuras. El algoritmo Wide tomará el color más oscuro en cada canal después de probar su tamaño de bits en ancho, y Tall hace lo mismo pero verticalmente.

Los parches y mejoras para la herramienta ROM enmascaran son bienvenidos, pero no envíen spam al rastreador de problemas con solicitudes de funciones. Las solicitudes de extracción deben enviarse a través de la página de GitHub, y no deben enredar el proyecto con dependencias en bibliotecas de terceros.
El código está escrito en un dialecto conservador de C ++, con un uso mínimo de características avanzadas. He intentado comentar el código y las definiciones de clase a fondo.
Gatorom se incluye como un decodificador de línea de comandos que resuelve para las disposiciones de bits. Consulte su propio archivo ReadMe para la documentación de CLI, particularmente para los métodos de solucionador que aún no están compatibles con la GUI.
Por separado, Gatorom se usa como una biblioteca para decodificar dentro de la GUI MaskromTool. Use Editar/decodificar para definir el estilo de decodificación y la vista/hexpreview para ver una decodificación en vivo de los bits a hexadecimal.

Desde el decodificador, puede resaltar bytes hexadecimales y usar la selección HEX de vista/resaltar para visualizar los bytes seleccionados. Aquí vemos las primeras tres palabras de la rom myk82, que empacan 32 bits en cada posición. El desmontaje también está disponible cuando unidasm de MAME está en el camino.

También se admite un solucionador con guión, en el que las máscaras simples o las reglas de Yara describen el firmware esperado. Se enumeran todas las coincidencias, y al saltar entre ellos puede descifrar rápidamente las imágenes que no usan la interjución, la reversión de la fila u otras complicaciones.

Zorrom de John McMaster es un excelente decodificador y la inspiración para la biblioteca de decodificación en esta herramienta.
Rompar de Adam Laurie podría ser la primera herramienta de marcado de bits para ser abierto.
BitRact de Chris Gerlinsky es otra herramienta de código abierto para el marcado de bits, y BitViewer es su herramienta de juego para decodificar bits a bytes.
El decodio PLA de Peter Bosch es una herramienta de marcado bit que se usa para extraer el microcódigo Intel viejo. Vea su charla Hardwear.io desde 2020 para obtener más detalles.