Howdy y'all,
Ceci est mon outil CAO pour prendre des photos d'un masque ROM et extraire les bits, afin que le contenu de la ROM puisse être récupéré.
Les raccourcis clavier de cet outil ne sont pas facultatifs. Veuillez lire la documentation GUI ci-dessous avant de commencer à explorer.
Si vous trouvez que cet outil est utile, veuillez acheter une copie de mon livre sur les exploits de microcontrôleur pour vous-même ou un étudiant intelligent.
- TRAVIS GOODSPEED

Gbrom-tutorial vous apprend à commencer par des photographies de la ROM du masque du Gameboy et à vous frayer un chemin vers une image ROM précise.
Myk82 ROM détient un dépotoir terminé de la ROM de la puce Myk82 dans une carte Fortezza. Il s'agit du successeur de la puce Clipper, et le référentiel comprend non seulement tous les bits ROM mais aussi la re-rechange pour la correction des erreurs.
Wersi-SLM2-51173 est une ROM Zilog Z8 d'un module de synthèse musicale.
master - Améliorations des performances en évitant les copies profondes dans les listes. Nombre de bits approprié dans la barre d'état et la barre d'état utilise désormais une police à largeur fixe.
2024-08-18 - L'option de solveur de Gatorom utilise désormais des noms de fiilenames descriptifs. GUI peut désormais exporter un ensemble de résultats résolus avec un fichier / exportation / solversetBytes. Rectangle de sélection plus clair. R et C dessineront désormais le type de ligne correct lorsque l'utilisateur les confond. ^H définit maintenant la position de la maison. Les touches de zoom et de mouvement fonctionnent désormais dans la deuxième vue. Les lignes parfaitement en double sont désormais abattues pendant la RDC par la touche V Les lignes et les colonnes sont maintenant stockées sous forme de listes triées au lieu des ensembles. Les lignes et les colonnes sont désormais dans un ordre cohérent dans l'exportation de fichiers. Les performances augmentent dans le marquage des bits, le marquage des bits en arrière-plan et l'alignement. Binaire universel pour macOS. ROMALALIGNERTILTING fonctionne mieux pour les conceptions avec un écart entre les banques. Les bits extérieurs ne sont plus dessinés lors de la traînée, accélérant les groupes ajustant les longues lignes.
2024-07-14 - Corrige le crash lors de la suppression d'un article à double sélection. Supprimer et backpace supprime désormais des objets comme D . Multipliers Dissemblers. Les décodages sont désormais mis à jour car les seuils de décodage sont modifiés.
2024-06-23 - résolution de règles Yara. Améliorations de stabilité. Crosshairs Mise à jour des angles des lignes sélectionnées. L'espace répète maintenant la dernière ligne, que ce soit une ligne ou une colonne. Plusieurs éléments peuvent être sélectionnés et Shift + D les reproduise. Sélectionnez avec Shift pour ajouter plus de lignes ou CTRL (CMD sur macOS) pour supprimer les lignes. Le glisser droit déplace plusieurs lignes, prévisualisant uniquement les bits pertinents. Les couleurs de réticulation et de sélection sont désormais sélectionnables. Le fond n'est plus carrelé lors du zoom arrière.
2024-05-19 - Les violations de la RDC sont désormais effacées lorsque des bits sont forcés. Exportation d'histogramme pour tracer les distributions de couleurs dans GNUPLOT. Support pour Wayland. WordSize explicite Support en CLI, GUI, solveur et décodeurs de base. Solver sets, exportant toutes les solutions potentielles sous forme de fichiers binaires. L'aligneur peu fiable a été obsolète. Solver GUI. Le désassembleur appelle l'unidasme de Mame.
2024-01-28 - Annuler et refaire. Dialogue Strings. Clé de barre arrière pour la visibilité des calques. Algorithme d'alignement fiable. La fenêtre principale de fermeture ferme l'application.
2024-01-01 - Correction de l'erreur de bus dans le décodeur Z8 lors de la résolution de tailles impaires. Mode verbeux dans la CLI Gatorom. Mode squeeze-lr maintenant dans GUI Decoder. Modifiez l'élément de menu pour effacer toutes les corrections de bits. E sélectionnera la prochaine violation de la RDC. Les images parfaitement verticales ne cassent plus l'algorithme d'alignement.
2023-12-07 - Présentation de la sélection. Row / colonne compte dans la barre d'état. Solveur ASCII. Corrige plusieurs accidents dans le solveur à partir de tailles ROM maladroites. Décodage de Gatorom dans l'interface graphique. Élimination des décodeurs redondants. Visionneuse hexagonale et mise en évidence des octets sélectionnés. Gatorom CLI est désormais très strict quant à la sortie de l'accès illégal. Support Zilog Z8 ROM.
2023-09-13 - Option CLI pour désactiver OpenGL. Support d'impression. Création des fenêtres fonctionnelles.
2023-08-06 - OpenGL est désormais fonctionnel et par défaut. Gatorom inclus pour le décodage des bits.
2023-07-20 - Prise en charge de l'affichage secondaire. Échantillonnage grand. Corrige le crash lors de la frappe V après avoir supprimé une ligne.
2023-06-17 - Ajout de macOS sur x86_64 et ARM64.
2023-05-30 - First Windows Release.
Cet outil fonctionne dans Windows, Linux, FreeBSD et MacOS, en utilisant QT6 avec l'extension QTCharts.
La construction de l'outil est la plus facile de la CLI. Dans 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
Dans Windows et MacOS, utilisez le QT pour le programme d'installation open source, en étant sûr d'inclure les graphiques et les extensions des formats d'image. Ensuite, ouvrez CMakeLists.txt en tant que projet. Ctrl+B compilera ensuite maskromtool . Si vous avez un problème avec votre importation, comme le choix de la mauvaise installation QT, supprimez CMakeLists.txt.user et réouverture le projet pour réessayer.
Pour la commodité des utilisateurs de Windows et de MacOS, nous avons également effectué des versions prédéfinies.
Utilisez d'abord le fichier / l'ouverture de la ROM pour ouvrir une image ROM comme photographie. Essayez d'utiliser des formats non compressés, mais méfiez-vous que MacOS n'aime pas les fichiers TIFF.
Maintenir la touche de commande (commande sur macOS) lors du roulement de la roue de la souris zoomer et sortira. Vous pouvez également pincer le zoom sur un piste de piste. Le glisser avec le bouton du milieu pana ou fait défiler avec deux doigts comme votre système d'exploitation aime.
Par convention arbitraire, les bits doivent être en longues colonnes avec des lignes plus courtes. Si les lignes de décodeur sont visibles, elles devraient être en haut de l'image. N'hésitez pas à le photographier dans un sens, puis à le faire pivoter pour le balisage.
Lorsque vous enregistrez votre projet, le nom de fichier de l'image sera étendu avec .json . Ce fichier JSON trié et en retrait devrait être approprié pour une utilisation dans le contrôle de version, tels que les référentiels GIT.
Ces boutons du clavier fournissent ensuite la majeure partie de votre entrée. Pour les lignes de dessin, cliquez d'abord une fois pour choisir la position de démarrage, puis appuyez sur la touche lorsque la souris est au-dessus de la position finale. La suppression d'un élément ou la définition de sa position s'appliquera à la ligne la plus récemment placée, sauf si vous faites glisser une boîte pour sélectionner une ligne.
Sélectionnez un élément en faisant glisser dessus avec un clic gauche de la souris et en regardant pour qu'il devienne vert. L'élément le plus récemment placé est automatiquement sélectionné. Certaines commandes fonctionnent sur plusieurs éléments sélectionnés; D'autres juste un.
Vous pouvez supprimer une erreur avec D ou ajuster un peu sa position avec S , les touches de flèche ou un clic droit. Pendant le mouvement, les morceaux de lignes non apparentés peuvent être cachés pour les performances, et la clé M ou la libération du bouton de la souris droit les redeviendra.
Sur macOS, ^ signifie commande au lieu 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.
Lorsque vous commencez à marquer des bits, le logiciel ne connaîtra pas encore le seuil entre un et un zéro. Vous pouvez configurer cela avec Choose Bit Threshold View / Choisissez.
Même les meilleurs bits ne seront pas tous parfaitement marqués, alors utilisez SHIFT+F pour forcer les valeurs de bit où vous voyez que le logiciel est faux. SHIFT+A est similaire et marque un peu comme ambigu ou endommagé. Le menu DRC contient des vérifications de règles de conception qui mettront en évidence les problèmes de votre projet, tels que les bits faibles ou l'alignement brisé.
Si placer de nombreuses lignes devient fastidieux, sélectionnez un groupe avec le bouton de la souris gauche et dupliquez l'ensemble entier avec SHIFT+D Vous pouvez ensuite le faire glisser avec le bouton droit de la souris vers la nouvelle position, en laissant une autre copie en position d'origine. Si le framerate tombe pour cela, utilisez la touche TAB pour masquer temporairement tous les bits, ce qui accélère considérablement le déplacement de nombreuses lignes dans des zones denses.
Le réticule s'adaptera à votre rangée et à votre colonne la plus récemment placée. Cela devrait les permettre de s'incliner un peu pour correspondre à la réalité de vos photographies.
Une fois que vous avez marqué les bits et SPOT, vérifié qu'ils sont précis avec DRC, exécutez le fichier / exportation pour les vider dans ASCII pour analyser avec d'autres outils, tels que Gatorom, BitViewer ou Zorrom.
En plus de l'interface graphique, cet outil a une interface de ligne de commande qui peut être utile dans les scripts. Utilisez le commutateur --help pour voir les derniers paramètres, et le commutateur --exit si vous préférez que l'interface graphique ne reste pas ouverte pour une utilisation interactive.
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.
Pour courir sans GUI, passez -platform offscreen . Si le programme s'écrase dans Wayland, forcez l'utilisation de Xorg en passant -platform xcb .
Sur Windows, il est gênant pour un exécutable d'avoir une interface graphique tout en conservant un journal sur la CLI. Nous résolvons cela en produisant deux exécutables; Veuillez utiliser maskromtool.exe pour l'interface graphique et maskromtoolcli.exe pour la CLI.
Un exécutable séparé, gatorom , enveloppe le décodeur de bit ROM sans les graphiques. Voir Gatorom pour plus de détails.
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.
J'ai conçu l'interface graphique autour d'un QGraphicsScene . Les objets de données sous-jacents utilisent le système de coordonnées QT, avec des flotteurs pour une précision meilleure que pixel.
Après avoir chargé une photographie ROM, l'utilisateur place les colonnes et les lignes sur la photo. Chaque intersection d'une colonne et d'une ligne est considérée comme un peu, et un seuil de couleur configurable détermine la valeur de ce bit. Lorsque la photo est mal lue, vous pouvez également forcer le bit à une valeur connue.
Une fois que tous les bits ont été marqués et le seuil choisi, le logiciel marquera chaque bit léger comme bleu (0) et chaque bit sombre comme rouge (1). Ces bits sont ensuite alignés sur des listes liées de lignes pour l'exportation comme ASCII, pour une utilisation dans d'autres outils.
Pour identifier les erreurs, un ensemble de vérifications de règles de conception (DRC) critiquera le projet ouvert. Bien que l'interface principale soit l'interface graphique, une CLI est également disponible pour les scripts et les tests.
Alors que quelques milliers de bits pourraient être marqués sans erreur, des projets plus importants devront inévitablement gérer leurs erreurs.
Un bon début consiste à utiliser les contrôles DRC et la configuration minutieuse des seuils de bit jusqu'à ce qu'il ne reste qu'aucune erreur évidente. Ensuite, naviguez dans le projet et appuyez sur la touche tab pour afficher et masquer les annotations, en vous assurant que chaque bit est reconnu correctement.
Lorsque cela est insuffisant, comme pour les ROM qui sont des dizaines ou des centaines de kilobits, cela aide à annoter la même ROM plusieurs fois, de préférence à partir de différentes photographies. Des erreurs de bit se produiront en annotant chaque photographie, bien sûr, mais elles se produiront à différents endroits. Vous pouvez ensuite utiliser la fonction --diff-ascii par rapport à la sortie de --export-ascii pour comparer les images, en réconciliant leurs différences jusqu'à ce que tous vos fichiers de projet soient d'accord.
La plupart des ROM peuvent être lues simplement en lisant la couleur d'un seul pixel au centre du bit. Pour ceux-ci, l'algorithme d'échantillonnage Default fonctionnera très bien.

Pour les roms de diffusion dont les bits ont été un peu trop retardés, le centre du bit n'a pas de couleur unique, mais il est entouré de lignes légèrement plus sombres. L'algorithme Wide prendra la couleur la plus foncée de chaque canal après avoir échantillonné sa taille de bits en largeur, et Tall fait de même mais verticalement.

Les correctifs et les améliorations de l'outil ROM de masque sont les bienvenus, mais veuillez ne pas spammer le tracker des problèmes avec les demandes de fonctionnalités. Les demandes de traction doivent être soumises via la page GitHub, et elles ne doivent pas emporter le projet avec des dépendances sur les bibliothèques tierces.
Le code est écrit dans un dialecte conservateur de C ++, avec une utilisation minimale de fonctionnalités avancées. J'ai essayé de commenter le code et les définitions de classe soigneusement.
Gatorom est inclus en tant que décodeur de ligne de commande qui résout pour les arrangements bit. Veuillez consulter son propre fichier ReadMe pour la documentation CLI, en particulier pour les méthodes de solveur qui ne sont pas encore prises en charge dans l'interface graphique.
Par ailleurs, Gatorom est utilisé comme bibliothèque pour décoder dans l'interface graphique maskromtool. Utilisez l'édition / le décodage pour définir le style de décodage et la vue / hexpreview pour voir un décodage en direct des bits en hexadécimal.

À partir du décodeur, vous pouvez mettre en évidence les octets hexagonaux et utiliser la sélection HEX View / Sight pour visualiser les octets sélectionnés. Ici, nous voyons les trois premiers mots de la ROM Myk82, qui emballent 32 bits dans chaque position. Un démontage est également disponible lorsque unidasm de Mame est sur le chemin.

Un solveur scripté est également pris en charge, dans lequel des masques simples ou des règles YARA décrivent le firmware attendu. Toutes les correspondances sont énumérées et en sautant entre elles, vous pouvez rapidement déchiffrer des images qui n'utilisent pas d'interleving, d'inversion de lignes ou d'autres complications.

Zorrom de John McMaster est un excellent décodeur et l'inspiration pour la bibliothèque de décodage de cet outil.
La rapidité d'Adam Laurie pourrait être le tout premier outil de marquage à être ouvert.
BitRact de Chris Gerlinsky est un autre outil open source pour le marquage des bits, et BitViewer est son outil de correspondance pour décoder les bits aux octets.
Le décodage PLA de Peter Bosch est un outil de marquage un peu utilisé pour extraire le vieux microcode Intel. Voir son discours Hardwear.io de 2020 pour plus de détails.