Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
z80-sans — OpenType-Schriftart, die Z80-Befehle disassembliert | Kitploit
Tools/GitHubGitHub/nevesnunes/z80-sans
Reverse EngineeringFuzzingCTFHardware-SicherheitBinäranalyseLernen & Bildung
GitHubnevesnunes/z80-sans

z80-sans

OpenType-Schriftart, die Z80-Befehle disassembliert

Repository anzeigen
506314vor 2 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Z80 Sans

Was ist dein Lieblings-Disassembler? Meiner ist eine Schriftart:

https://github.com/user-attachments/assets/bb6ceb18-c2fd-40a9-be4f-202321a214d9

Diese Schriftart wandelt Folgen von hexadezimalen Kleinbuchstaben in disassemblierte Z80-Befehle um, indem sie umfassend von OpenTypes Glyph Substitution Table (GSUB) und Glyph Positioning Table (GPOS) Gebrauch macht.

Wenn du es einfach ausprobieren möchtest, eine Kopie ist unter ./test/z80-sans.ttf verfügbar.

Installation

Getestet auf Debian GNU/Linux 12. Beachte, dass diese Debian-Version mit Ruby Version 3 ausgeliefert wird, während fontcustom für Ruby Version 2 geschrieben wurde und mit späteren Versionen inkompatibel ist (z.B. Syntaxfehler). Eine Ruby-Installation erfordert außerdem eine kompatible OpenSSL-Version. Daher kann RVM verwendet werden, um sowohl Ruby als auch eine lokale Installation von OpenSSL zu verwalten.

apt install imagemagick potrace
pip install fonttools

git submodule update --init --recursive

# fontforge
(
cd ./modules/fontforge/
git checkout 4f4907d9541857b135bd0b361099e778325b4e28
git apply ../../resources/fontforge.diff
mkdir -p build
cd build
cmake -GNinja ..
ninja
ninja install
)

# woff2
(
cd ./modules/woff2/
make clean all
)

# fontcustom
rvm use 2.7
rvm pkg install openssl
rvm install 2.4 --with-openssl-dir=$HOME/.rvm/usr
gem update --system 3.3.22
(
export PATH=$PWD/modules/woff2/build:$PATH
cd ./modules/fontcustom/
git apply ../../resources/fontcustom.diff
gem build fontcustom.gemspec
gem install ./fontcustom-2.0.0.gem
)

Ausführung

cp ./resources/droid-sans-mono.ttf /tmp/base.ttf
./gen.py ./resources/instructions.json

Die .ttf-Schriftartdatei wird nach ~/.local/share/fonts/ kopiert, was z.B. von LibreOffice verwendet wird.

Design

Im Vergleich zu anderen verfluchten Schriftarten hat Z80 Sans folgende Herausforderungen:

  • Mehrere Zeichen zum Rendern: es wäre unpraktisch, manuell Zeichen für Zeichen alle Substitutionsregeln für das Rendern zu definieren, daher können wir Glyphen erstellen, die mehrere Literale kombinieren (z.B. Mnemonics wie CALL), dies hängt jedoch auch mit dem nächsten Punkt zusammen...
  • Mehrere Kombinationen: bedenke, dass einige Z80-Befehle 16-Bit-Adressen und Register als Operanden annehmen können, was bedeutet, dass ein einzelner Befehl bis zu 65536 * 7 = 458752 mögliche Kombinationen haben kann;
  • Außerhalb der Reihenfolge liegende Operanden: z.B. können Register und Offsets in einer Reihenfolge in hexadezimale Bytes codiert, aber in einer anderen Reihenfolge disassembliert werden, was Rückverfolgungs-/Lookahead-Regeln erschwert;
  • Little-Endian-Adressen: Zeichen für das niederwertigste Byte müssen vor dem höchstwertigen Byte gerendert werden;
  • Vorzeichenbehaftete Offsets: Alle Offsets im Bereich 0x80..0xff müssen als negative Zweierkomplementzahl gerendert werden;

All dies lädt zu einer programmatischen Lösung ein. Während fontcustom und ImageMagick die Generierung von Glyphen übernehmen, scheint das .fea-Format eine bequeme Möglichkeit zum Schreiben von Lookup-Regeln zu sein, aber ich fand keinen Weg, es in das .ttx-Format von fonttools (das im Grunde XML ist) zu integrieren. Ich habe den Ansatz des kleinsten gemeinsamen Nenners gewählt, indem ich das .ttx von Noto Sans Mono direkt bearbeitet habe (obwohl die Glyphenformen aus Droid Sans Mono berechnet werden, da ich damit begonnen habe, als ich FontForge patchte).

Ein rekursiver Abstiegsparser wird verwendet, um alle möglichen Glyphen zu generieren, was bei der Auswertung von Ausdrücken in Kodierungen hilft (z.B. SET b,(IX+o) benötigt ein Bit und eine Verschiebung, kodiert als Ausdruck DD CB o C6+8*b). Diese Kodierungen wurden dann auf alle möglichen Werte erweitert, die Operanden annehmen können, bevor schließlich 1 oder mehrere hexadezimale Bytes jedem Disassemblierungsglyphen zugeordnet wurden, der zum Rendern eines erweiterten Befehls erforderlich ist.

Es gibt einige nette Referenzen für OpenType-Features, aber sie sind auf hohem Niveau oder im .fea(?)-Format geschrieben:

  • OpenType Feature File Specification | afdko
  • GSUB — Glyph Substitution Table (OpenType 1.9.1) - Typography | Microsoft Learn
  • Fonts and Layout for Global Scripts
  • GitHub - brew/opentype-feature-intro: An introduction to OpenType features for type designers.
  • Features, part 3: advanced contextual alternates | Glyphs
  • Opentype subtitution many by many (different number) - Glyphs Forum

Es ist nie ganz klar, wie man sie in .ttx übersetzt, also habe ich am Ende einfach die gesamte Noto Sans Familie konvertiert und den guten alten Brute-Force-Ansatz des "Lernens durch Beispiele" verwendet. Das macht sogar mehr Spaß, als es klingt, dank zahlreicher stiller Fehlschläge bei der Konvertierung von .ttx nach .ttf, bei denen Lookups aufgrund einiger Annahmen, die von fonttools nicht validiert werden, nicht übereinstimmen (z.B. müssen Klassendefinitionen für kontextuelle Verkettungssubstitutionen mindestens ein Coverage-Glyph mit class value="1" haben).

So ziemlich die meisten Herausforderungen wurden mit kontextuellen Verkettungsregeln gelöst. Um Adressen zu handhaben, wurde jedes Nibble im Bereich 0..f mit unterschiedlichen Glyphen kodiert, wobei Abstandszeichen verwendet wurden, um mehrere Substitutionen zu erstellen, ein Zeichen nach dem anderen. Verschiebungen haben auch zusätzliche vorzeichenbehaftete Varianten. Das ergibt insgesamt (4 + 2) * 16 Glyphen für Zahlen. Das war bereits ausreichend, um die Schriftartdatei unter der Grenze von 65536 Glyphen zu halten.

Der schlimmste Teil waren natürlich die außerhalb der Reihenfolge liegenden Operanden. Aufgrund der begrenzten Anzahl von Variationen, die diese in Befehlen haben, konnten sie jedoch mit der gleichen Strategie abgedeckt werden wie Befehle mit mehrdeutig kodierten Präfixen, z.B.

["SET b,(IX+o)", "DD CB o C6+8*b"],
["SET b,(IY+o)", "FD CB o C6+8*b"],

Wird von denselben Lookup-Regeln abgedeckt wie:

["SRA (IX+o)", "DD CB o 2E"],
["SRA (IY+o)", "FD CB o 2E"],
["SRL (IX+o)", "DD CB o 3E"],
["SRL (IY+o)", "FD CB o 3E"],

Eine interessante Eigenschaft im Z80-ISA ist, dass Bits und Register bis zu 8 Variationen haben, und diese Out-of-Order-Fälle betreffen nur Offsets und einen dieser spezifischen Operanden. Daher können wir Bits oder Register als Literale kodieren. Mit ausreichenden Lookaheads können wir bis zum letzten hexadezimalen Byte abgleichen und für jeden Fall dedizierte Lookups erstellen. Die letzten Literale können reduziert werden, indem eine Ligatur erzeugt wird, die mit dem Suffix-Glyphen übereinstimmt. Das Endergebnis waren Dutzende weitere generierte Lookups für diese Fälle (die wahrscheinlich gruppiert werden könnten, um diese Anzahl zu reduzieren).

Bekannte Probleme

  • Während der gesamte ursprüngliche Befehlssatz disassembliert werden sollte, haben einige Befehle kleinere Fehler:
    • LD (IX+o),r wird als LD (IX+o r), gerendert;
    • SET b,(IX+o) wird als SET b,(IX+o)) gerendert;
  • Code in "CTF-Qualität" 😅;

Zukünftige Arbeiten

Tool herunterladen