Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
z80-sans — OpenType फ़ॉन्ट जो Z80 निर्देशों को डिसअसेंबल करता है | Kitploit
उपकरण/GitHubGitHub/nevesnunes/z80-sans
रिवर्स इंजीनियरिंगफज़िंगCTFहार्डवेयर सुरक्षाबाइनरी विश्लेषणलर्निंग और शिक्षा
GitHubnevesnunes/z80-sans

z80-sans

OpenType फ़ॉन्ट जो Z80 निर्देशों को डिसअसेंबल करता है

रिपॉजिटरी देखें
50631 साल पहलेKitploit द्वारा समीक्षित

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

Z80 Sans

आपका पसंदीदा डिस्सेम्बलर कौन सा है? मेरा तो एक फ़ॉन्ट है:

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

यह फ़ॉन्ट हेक्साडेसिमल लोअरकेस कैरेक्टर्स के सीक्वेंस को डिस्सेम्बल की गई Z80 निर्देशों में बदलता है, जो OpenType के Glyph Substitution Table (GSUB) और Glyph Positioning Table (GPOS) का व्यापक उपयोग करता है।

अगर आप इसे आज़माना चाहते हैं, तो ./test/z80-sans.ttf पर एक प्रतिलिपि उपलब्ध है।

इंस्टॉल

Debian GNU/Linux 12 पर परीक्षण किया गया है। ध्यान दें कि इस Debian संस्करण में ruby संस्करण 3 शामिल है, जबकि fontcustom को ruby संस्करण 2 के लिए लिखा गया था, और बाद के संस्करणों के साथ असंगत है (जैसे सिंटैक्स त्रुटियाँ)। ruby इंस्टॉल के लिए एक संगत OpenSSL संस्करण की भी आवश्यकता होती है। इसलिए, RVM का उपयोग ruby और OpenSSL के स्थानीय इंस्टॉल दोनों को प्रबंधित करने के लिए किया जा सकता है।

root@kitploit:~
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
)

चलाना

root@kitploit:~
cp ./resources/droid-sans-mono.ttf /tmp/base.ttf
./gen.py ./resources/instructions.json

.ttf फ़ॉन्ट फ़ाइल ~/.local/share/fonts/ में कॉपी की जाती है, जिसका उपयोग जैसे LibreOffice द्वारा किया जाता है।

डिज़ाइन

अन्य अभिशप्त फ़ॉन्ट्स की तुलना में, Z80 Sans में ये चुनौतियाँ हैं:

  • एकाधिक कैरेक्टर रेंडर करना: रेंडरिंग के लिए मैन्युअली प्रत्येक कैरेक्टर के लिए प्रतिस्थापन नियम परिभाषित करना अव्यावहारिक होगा, इसलिए हम ऐसे ग्लिफ़ बना सकते हैं जो कई शाब्दिकों को जोड़ते हैं (जैसे CALL जैसे म्नेमोनिक), हालांकि यह अगले बिंदु से भी जुड़ा है...
  • एकाधिक संयोजन: याद रखें कि कुछ Z80 निर्देश 16-बिट पतों और रजिस्टरों को ऑपरेंड के रूप में ले सकते हैं, जिसका मतलब है कि एक एकल निर्देश में 65536 * 7 = 458752 तक संभावित संयोजन हो सकते हैं;
  • क्रम से बाहर ऑपरेंड: उदाहरण के लिए, रजिस्टर और ऑफसेट को हेक्साडेसिमल बाइट्स में एक क्रम में एन्कोड किया जा सकता है, लेकिन दूसरे क्रम में डिस्सेम्बल किया जाता है, जो बैकट्रैकिंग/लुकअहेड नियमों को जटिल बनाता है;
  • लिटिल-एंडियन पते: सबसे कम-महत्वपूर्ण बाइट के कैरेक्टर को सबसे अधिक-महत्वपूर्ण बाइट से पहले रेंडर करने की आवश्यकता होती है;
  • साइन किए गए ऑफसेट: 0x80..0xff रेंज के सभी ऑफसेट को ऋणात्मक दो-पूरक संख्या के रूप में रेंडर करने की आवश्यकता है;

यह सब एक प्रोग्रामेटिक समाधान को आमंत्रित करता है। जबकि fontcustom और ImageMagick ग्लिफ़ उत्पन्न करने का ध्यान रखते हैं, ऐसा लगता है कि लुकअप नियम लिखने का एक सुविधाजनक तरीका .fea प्रारूप है, लेकिन मुझे इसे fonttools के .ttx प्रारूप (जो मूलतः xml है) के साथ एकीकृत करने का कोई तरीका नहीं मिला। मैंने Noto Sans Mono के .ttx को सीधे संपादित करने का न्यूनतम सामान्य विभाजक दृष्टिकोण अपनाया (हालांकि ग्लिफ़ आकार Droid Sans Mono से गणना किए जाते हैं, क्योंकि मैंने FontForge पैच करते समय उसी से शुरुआत की थी)।

सभी संभावित ग्लिफ़ उत्पन्न करने के लिए एक रिकर्सिव डिसेंट पार्सर का उपयोग किया जाता है, जो एन्कोडिंग में अभिव्यक्तियों का मूल्यांकन करने में मदद करता है (जैसे SET b,(IX+o) एक बिट और एक विस्थापन लेता है, जिसे अभिव्यक्ति DD CB o C6+8*b के रूप में एन्कोड किया गया है)। इन एन्कोडिंग्स को फिर सभी संभावित मानों तक विस्तारित किया गया जो ऑपरेंड ले सकते हैं, अंत में एक विस्तारित निर्देश को रेंडर करने के लिए आवश्यक प्रत्येक डिस्सेम्बली ग्लिफ़ के साथ 1 या अधिक हेक्साडेसिमल बाइट्स को जोड़ा गया।

OpenType सुविधाओं के लिए कुछ अच्छे संदर्भ हैं, लेकिन वे उच्च-स्तर पर लिखे गए हैं, या .fea(?) प्रारूप में:

  • 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

यह कभी भी बहुत स्पष्ट नहीं होता है कि उन्हें .ttx में कैसे अनुवादित किया जाए, इसलिए अंत में मैंने बस Noto Sans परिवार के सभी को कनवर्ट किया और "उदाहरणों द्वारा सीखना" के अच्छे पुराने ब्रूट फोर्स दृष्टिकोण का उपयोग किया। यह सुनने में जितना मजेदार है उससे भी अधिक मजेदार है, .ttx से .ttf में कनवर्ट करते समय कई मौन विफलताओं के लिए धन्यवाद, जहां लुकअप कुछ धारणाओं के कारण मेल नहीं खाएंगे जो fonttools द्वारा मान्य नहीं हैं (जैसे कि प्रासंगिक श्रृंखलन प्रतिस्थापन के लिए वर्ग परिभाषाओं में कम से कम एक कवरेज ग्लिफ़ होना चाहिए जिसका class value="1" हो)।

अधिकांश चुनौतियों को प्रासंगिक श्रृंखलन नियमों के साथ हल किया गया। पतों को संभालने के लिए, 0..f रेंज में प्रत्येक निबल को अलग ग्लिफ़ के साथ एन्कोड किया गया, जिसमें स्पेसिंग कैरेक्टर का उपयोग करके एक बार में एक कैरेक्टर के लिए कई प्रतिस्थापन बनाए गए। विस्थापनों में अतिरिक्त हस्ताक्षरित रूप भी हैं। यह हमें संख्याओं के लिए कुल (4 + 2) * 16 ग्लिफ़ देता है। यह फ़ॉन्ट फ़ाइल को 65536 ग्लिफ़ की सीमा से नीचे रखने के लिए पहले से ही पर्याप्त था।

सबसे बुरा हिस्सा निश्चित रूप से क्रम से बाहर ऑपरेंड था। हालांकि, निर्देशों में इनकी सीमित संख्या के कारण, उन्हें अस्पष्ट रूप से एन्कोड किए गए उपसर्गों वाले निर्देशों के समान रणनीति द्वारा कवर किया जा सकता है, उदाहरण के लिए

root@kitploit:~
["SET b,(IX+o)", "DD CB o C6+8*b"],
["SET b,(IY+o)", "FD CB o C6+8*b"],

निम्नलिखित के समान लुकअप नियमों द्वारा कवर किया गया है:

root@kitploit:~
["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"],

Z80 ISA में एक दिलचस्प गुण यह है कि बिट्स और रजिस्टरों में 8 तक भिन्नताएं होती हैं, और ये क्रम से बाहर के मामलों में केवल ऑफसेट और उन विशिष्ट ऑपरेंड में से एक शामिल होता है। इसलिए, हम बिट्स या रजिस्टरों को शाब्दिक के रूप में एन्कोड कर सकते हैं। पर्याप्त लुकअहेड के साथ, हम अंतिम हेक्साडेसिमल बाइट तक मेल कर सकते हैं, और प्रत्येक मामले के लिए समर्पित लुकअप बना सकते हैं। अंतिम शाब्दिक को एक लिगेचर उत्पन्न करके कम किया जा सकता है जो प्रत्यय ग्लिफ़ से मेल खाता हो। अंतिम परिणाम इन मामलों के लिए दर्जनों और उत्पन्न लुकअप था (जिसे संभवतः इस संख्या को कम करने के लिए समूहित किया जा सकता है)।

ज्ञात मुद्दे

  • जबकि मूल निर्देश सेट के सभी को डिस्सेम्बल किया जाना चाहिए, कुछ निर्देशों में मामूली खामियां हैं:
    • LD (IX+o),r को LD (IX+o r), के रूप में रेंडर किया गया है;
    • SET b,(IX+o) को SET b,(IX+o)) के रूप में रेंडर किया गया है;
  • "CTF गुणवत्ता" कोड 😅;

भविष्य का कार्य

FontForge GenerateFeatureFile() और MergeFeature() कमांड का उपयोग करके सुविधाओं के स्क्रिप्टेबल संशोधन का समर्थन करता है (इसका संक्षेप में The Terrible Secret of OpenType Glyph Substitution - Ansuz - mskala's home page में उल्लेख किया गया है)। मुझे .ttx आधारित कार्यान्वयन करने के बाद ही इसके बारे में पता चला, लेकिन यह संभावित रूप से .ttx फ़ाइलों से छेड़छाड़ करने से बचा सकता था।

अधिक जटिल निर्देश सेट के लिए, एक वैकल्पिक दृष्टिकोण जो कम बाधाओं वाला लगता है, फ़ॉन्ट शेपर्स का उपयोग करना है। कुछ उदाहरण:

  • fuglede/llama.ttf: A font for writing tiny stories;
  • hsfzxjy/handwriter.ttf: Handwriting synthesis with Harfbuzz WASM.;

श्रेय

  • Droid Sans Mono और Noto Sans Mono का उपयोग Z80 Sans के आधार के रूप में किया गया;
  • ./resources/instructions.json को maziac/z80-instruction-set से अनुकूलित किया गया;
  • GSUB प्रतिस्थापन के लिए प्रेरणा:
    • Font with Built-In Syntax Highlighting;
    • Fontemon, विशेष रूप से "How I did it";
    • Addition Font;
    • Sans Bullshit Sans;

लाइसेंस

  • Droid Sans Mono Apache Licence के अंतर्गत है;
  • Noto Sans Mono Open Font License के अंतर्गत है;
  • ./resources/instructions.json GNU Lesser General Public License संस्करण 3 के अंतर्गत है;
  • अन्य फ़ाइलें MIT License के अंतर्गत हैं;
टूल डाउनलोड करें