-- Genel

MoonStar Türkçe Denetim Editörü: İkili Dosya Formatları ve Tersine Mühendislik Analizi

1990’lı yıllarda Alper Özer tarafından Borland C++ ile 16-bit Windows (Win16 NE – New Executable) mimarisinde geliştirilen MoonStar Türkçe Denetim Editörü; 64 KB bellek segmentleri ve 1.44 MB’lık disket ortamında Türkçe yazım denetimi, sözlük, eş anlamlılar motoru ve kelime oyunları barındıran bir yazılımdır.

Bu yazıda; yazılımın ikili (binary) veri dosyalarını gün ışığına çıkarma sürecini, 2014’te yarım bırakılan açık kaynak girişiminin yapay zekâ destekli analizle nasıl tamamlandığını, MTU.EXE‘nin kendi içinde kullandığı sıkıştırma ve morfoloji tekniklerini, 16-bit x86 assembly rutinlerini, bayt seviyesindeki dosya yapılarını ve kurulan modern Python mimarisini teknik ayrıntılarıyla paylaşıyorum.


1. Veri Kaynağı ve İkili Format Yapısı

MoonStar’ın veri tabanı yapısı, yazılımın geliştiricisi Alper Özer (@aozer8080) tarafından 17 Aralık 2020’de şu şekilde açıklanmıştır:

“Sözlük ve Eşanlamlılar datası için Fono yayınları kullanıldı. Kendi oluşturduğumuz binary file formatına giriş için bir utility programı yazdık. Sonra tüm ofis çalışanları koca ciltlerdeki karşılıkların girişini yaptılar.”
Alper Özer (@aozer8080)

Veriler standart bir veritabanı motoru yerine, disket boyutunu ve bellek kullanımını minimize etmek amacıyla geliştirilen özel bir ikili formatta saklanmıştır.

Çalışma dizinindeki temel ikili dosyalar ve bunların MTU.EXE binary’si içerisindeki doğrudan ofset referansları:

Dosya AdıBoyutEXE İkili Ofsetiİkili Kanıt (Binary String / Roster)Kullanıldığı Menü & Modül
MTU.TRK832 KB0x1B61D, 0x1B8B8TRK dosya etiketi; 0x1B8B8 ek tablosuİngilizce Türkçe Sözlük (0x1BC6C)
MTU.TUR221 KB0x1BC54, 0x1B61D".SOZ\0MG2\x1a\0.SOZ\0TUR" filtresiTürkçe Leb Demeden (0x5E80F)
MTU.TES640 KB0x1B62C, 0x1B61DTESING1.Anlam (0x1B62C) etiketiTürkçe Eş Anlamlı Sözcükler (Ordinal 9)
MTU.ING655 KB0x1B61DING dosya etiketiKelime Oyunu (0x5D80F)
MTU.SOZ23 KB0x1B31F, 0x1BC4F*.SOZ filtre dizesi, MG2\x1a sihirli baytıEk yazım denetim listesi (Yer adları)
MTU.HLP105 KB0x1B23BWinHelp sınıf kaydı (HLP)Yardım (F1 tuşu)
MTU.INI1 KB0x1B23BProfil yükleme sınıf kaydıSeçenekler, Klavye Seçimi (0x5DE0F)

2. 2014’ten Günümüze: Yarım Kalan Açık Kaynak Girişimi

MoonStar dosya formatlarını analiz etme süreci 2014 yılında Eren Okka (@erengy) tarafından başlatılmıştır:

  • MTU.TRK (İngilizce-Türkçe) sözlüğünün morfem genişletme mantığı kısmen çözümlenmiştir.
  • MTU.TUR (26,775 kelimelik Türkçe başlık sözlüğü) temel hatlarıyla ayrıştırılmıştır.

Ancak çalışma şu noktalarda tıkanarak yarım kalmıştır:

  1. MTU.TES Dosyası Yanılgısı: Dosya yanlışlıkla “İngilizce Leb Demeden test modu / Quiz metadata” olarak etiketlenmiş ve içerisindeki eş anlamlılar yapısı çözülememiştir.
  2. Morfolojik Ek Zincirleri: MTU.TUR‘un Section 3 bloğundaki 3,218 adet morfolojik kuralın ikili bayt yapısı ve türetim mantığı deşifre edilememiştir.
  3. 16-Bit Win16 NE Assembly Karmaşası: Borland C++’ın Segment 3 içindeki dinamik bellek adresleme rutinleri çözümlenemediği için çok kelimeli öbekler ve uzmanlık kategorileri bozuk karakterler üretmiştir.

Bu 16-bit disassembly analizi, yapay zekâ destekli statik IDA/ndisasm kod dökümleri ve canlı DOSBox-X / NTVDM bellek izleme yöntemleriyle ele alınarak eksik kalan bayt yapıları ve algoritmalar çözümlendi.


3. MTU.EXE: Win16 NE Segment Mimarisi ve Ayrıştırma Yöntemleri

MTU.EXE, dosya ofseti 0x250 adresinde NE (New Executable) başlığına sahip 6 segmentli bir Borland C++ v5.10 derlemesidir:

NE Başlık Ofseti : 0x0250 (Magic: 'NE' - 0x454E)
Hedef İşletim Sis: Windows 3.x (0x02)
Bağlayıcı (Link) : Borland C++ v5.10 (0x0A05)
Giriş Noktası    : CS=1 IP=0x0000 | Otomatik Veri Seg: 6 (DGROUP) | Yığın: SS=6 SP=0
Bellek Tahsisi   : Yığın (Heap): 16,384 Bayt | Stack: 5,120 Bayt
Hizalama (Align) : 2^9 = 512 Baytlık Sektörler (Dosya Ofseti = Sektör × 512)
SegmentSektörDosya OfsetiBellek BoyutuBayraklarGörev ve İçerik
Seg 190x12009,051 B0x1D50Kod: Program başlatıcı, pencere sınıfları
Seg 2270x360020,985 B0x1D50Kod: TRTHESDLG (Ordinal 9 @ 0x5E1A), UI diyalogları
Seg 3810xA20019,697 B0x1D50Kod: 0xD1EC, 0xD422, 0xD5BD Arama ve metin motoru
Seg 41240xF80012,311 B0x1D50Kod: Yazım denetimi motoru ve SOZ ayrıştırıcı
Seg 51550x1360024,347 B0x1D50Kod: Sıkıştırma algoritmaları ve morfoloji rutinleri
Seg 62070x19E0043,516 B0x0D51Veri: DGROUP Statik tablolar, string havuzu

A. Kullanılan Tersine Mühendislik Araç Seti (Toolchain)

  • Ghidra: Win16 New Executable (NE) başlığı ve 6 segmentin haritası çıkarıldı; Borland C++ çalışma zamanı fonksiyonları, yığın çerçeveleri ve diyalog prosedürleri sembolik olarak dekompile edildi.
  • radare2 (r2): Komut satırından hızlı çapraz referans (xref) analizleri gerçekleştirildi (axt, axf). 0x1B61D dosya listesi ve 0x1B63A kategori tablosuna başvuran kod blokları tespit edildi.
  • ndisasm: Segmentlerin dosyadaki ham sektör ofsetleri üzerinden 16-bit x86 makine kodları (ndisasm -b 16 -o 0xXXXX) doğrudan assembly metnine dönüştürüldü.
  • DOSBox-X Hata Ayıklayıcı: Canlı çalışma anında CPU yazmaçları (CS, DS, ES, SS) ve 0x60348 RAM adresindeki geçici metin tamponları gerçek zamanlı izlendi.
  • Python: Ayrıştırılan ikili protokollerin simülasyonu, morfolojik doğrulama ve birim test otomasyonu için kullanıldı.

B. Segment 3 Ayrıştırması: 0xD422 Durum Makinesi

; DL yazmacında o an okunan kayıt bayrağı (flag) bulunur:
00003250  F6C280    test dl, 0x80     ; Bit 7 set edilmiş mi? (Morfolojik slot başlığı)
00003253  7405      jz 0x325A
00003255  E84501    call 0x339D       ; 0x80 başlık ayrıştırıcısına dallan
00003258  8AC2      mov al, dl
0000325A  240F      and al, 0x0F      ; Alt 4 bit: Anlam grubu (0x00..0x0A)
00003262  3A46F5    cmp al, 0x0C      ; 0x0C: Bilimsel uzmanlık kategorisi mi?
00003265  7508      jne 0x326F
00003267  8A5E04    mov bl, [bp+4]    ; Sonraki baytı kategori indeksi (top_id) olarak oku
0000329C  F6C240    test dl, 0x40     ; Bit 6: Fiil kökü alt-kayıt (Deverbal subrecord) ayracı
0000329F  7512      jnz 0x32B3        ; Alt kayda dallan

C. Segment 3: 0xD5BD Metin Birleştirici ve Deyim Çözücü

; ES:DI metin tamponuna işaret eder, SI veri akışını okur:
000033E0  AD        lodsw             ; AX = [DS:SI], SI += 2
000033E1  8BD8      mov bx, ax
000033E3  81E3FF7F  and bx, 0x7FFF    ; BX = Kelime indeksi (Bit 0-14)
000033E7  A90080    test ax, 0x8000   ; Bit 15: Ek zinciri devam bayrağı mı?
000033EA  740C      jz 0x33F8         ; Devam bayrağı yoksa kelimeyi bitir
000033EC  E8AEFD    call 0x319D       ; Section 3 ekini oku ve fonetik olarak iliştir

D. 24 Girişlik Atlama Tablosu (Jump Table) ve format_sub

SUB AL, 2             ; Frekans değerinden 2 çıkar
CMP AL, 23            ; 23'ten büyükse işlem yapmadan dön
SHL AL, 1
MOV BX, AX
JMP [CS:BX + 0x1237]  ; İlgili UI yordamına sıçra
mov dl, [bp+0x6]      ; DL = parametre (0-7)
mov ax, dl
shl ax, 1             ; AX = param * 2
add ax, 0x1015        ; AX = param*2 + 0x1015 (tablo girişi)
mov si, ax            ; SI -> tablo girişi
mov al, 1
mov cl, dl
shl al, cl            ; AL = 1 << param
xor [0x283A], al      ; Durum bayrağını evir: flag ^= (1 << param)

4. MTU.TUR Dosya Anatomisi ve Bölüm Yapısı

MTU.TUR dosyası (221,466 bayt), 4 baytlık MG2\x1a sihirli baytı ile başlayan 6 bölümlü ikili bir morfoloji dosyasıdır:

letter_count = 32
sec1_size = (letter_count + 1) * 2                  # 66 bayt
sec2_size = (letter_count ** 2 + 1) * 2             # 2,050 bayt
sec3_off  = 12 + sec1_size + sec2_size              # 2,128 (Boyut: 3,218 * 14 = 45,052 B)
sec4_off  = sec3_off + sec3_count * 14              # 47,180 (Boyut: 26,775 * 4 = 107,100 B)
sec5_off  = sec4_off + word_count * 4               # 154,280 (Ham ek baytları havuzu)
sec6_off  = sec5_off + sec5_len                     # 158,288 (Boyut: 910 * 4 = 3,640 B)

Section 6 Ünsüz Sertleşme Algoritması: Eğer (byte2 & 0x80 == 0) ve (byte1 & 0x10 != 0) ise gövde sertleştirilir: ğ ➔ k, b ➔ p, c ➔ ç, d ➔ t, g ➔ k.


5. Çift Yönlü Sözlük Motorları

A. İngilizce ➔ Türkçe Sözlük (MTU.TRK – 832 KB)

17,988 madde başı; 676 adet iki harfli önek ofset tablosu ve 195 girişlik İngilizce suffix tablosu (-ability, -ness, -ization, -fully, -ing, -tion) kullanılarak çözümlenmiştir.

İngilizce Türkçe Sözlük Modülü

B. Türkçe ➔ İngilizce Sözlük (TR_EN Ters İndeksleme)

MTU.TRK dosyasındaki 17,988 adet İngilizce-Türkçe çifti tersine indekslenerek 27,105 adet temiz Türkçe ➔ İngilizce sözlük maddesi elde edilmiştir.

Türkçe İngilizce Sözlük Modülü

C. Türkçe ➔ Türkçe Sözlük (“Türkçe Leb Demeden” – MTU.TUR)

26,775 madde başı; ilk iki harften Section 1 ve Section 2 ofset tablolarına $O(1)$ sürede zıplayarak anlık arama ve yazım denetimi yapar.


6. Kelime Oyunu ve Quiz Motoru (MTU.ING – 655 KB)

32,000 yuvalı ofset tablosunda 12,437 aktif oyun kaydı bulunur. Yuva başlığı: [0x00, (trk_idx + 1) % 256, category_byte].

flag_low   = flag & 0x7F        # varyant biti temizlenir (bit 7)
is_variant = bool(flag & 0x80)  # bit 7: alternatif oyun modu
topic_idx  = flag_low % 36      # 36 uzmanlık konusu (0-35)
quiz_mode  = flag_low // 36     # quiz zorluk modu: 0, 1 veya 2

7. MTU.SOZ Dosya Mimarisi (Yer Adları – 23 KB)

14,034 karakterlik kesintisiz alfabetik harf akışında kelime sınırları (\0 veya boşluk) saklanmaz; 19 grup ayracı bulunur. MTU.EXE yer adı sorgularını akış üzerinde doğrudan alt-dize taraması (substring search) yaparak doğrular.


8. MTU.TES İkili Formatı ve Kayıt Protokolü

Toplam 640,866 baytlık veritabanı, 26,775 kelimeye ait eş anlamlı kümelerini saklar (21,076 aktif kayıtlı slot).

  • 0x80 Morfolojik Başlık: İzleyen 16-bit ek ID’si türemiş başlığı tanımlar (1,727 slot).
  • 0x40 Fiil Kökü Alt-Kayıt Ayracı: Fiilden türeyen alt başlıkları başlatır (1,906 alt-kayıt).
  • Çok Kelimeli Deyim Formülü: word_count = ((flag >> 4) & 3) + 1
  • Bit-15 Morfem Zincirleme: 16-bit sözcük okunurken Bit 15 set edilmişse sonraki 16-bit ek kuralı okunur (Örn: çek + in + me + z + lik ➔ çekinmezlik).

9. MTU.EXE İçindeki 36 Bilimsel Kategori Tablosu

MTU.EXE veri segmentinde (0x1B63A - 0x1B7B6) yer alan 36 uzmanlık konusu:

IDKategoriIDKategoriIDKategori
0Mecaz12Ekonomi24Meteoroloji
1Argo13Elektrik, elektronik25Mimarlık
2Renk14Felsefe26Müzik
3Türemiş15Fizik27Otomobil, otomotiv
4Anatomi16Gökbilim (astronomi)28Ruhbilim (psikoloji)
5Askerlik17Hayvanbilim29Sinema
6Bitkibilim18Hekimlik30Spor
7Biyoloji19Hukuk31Teknik, teknoloji
8Coğrafya20İskambil32Ticaret
9Denizcilik21Kimya33Tiyatro
10Dilbilgisi, dilbilim22Mantık34Yazın (edebiyat)
11Dinsel23Matematik35Yerbilim (jeoloji)

10. Kritik Hata Çözümleri ve Vaka Analizleri

  • Vaka 1: 0x0C Bilimsel Kategori Başlığı (anevrizma): Alt 4 biti 0x0C olan baytların 36 bilimsel kategoriyi temsil ettiği çözülerek Hekimlik: damar hastalığı tanımı kurtarıldı.
  • Vaka 2: 0xC0 Çapraz Başvuru Mimarisi (siyasi): 8,179 kelimelik çapraz başvuru mimarisinde yönlenilen ana başlığın listeye eklenmesi sağlanarak politik, siyasal eşleşmesi tamamlandı.
  • Vaka 3: Eşsesli (Homonym) Yuva Seçim Hatası (araç, cami, çeşme, aks): Boş slot filtresi uygulanarak 528 temel kelime sisteme kazandırıldı (21,505 aktif kelime).
  • Vaka 4: Morfem Yumuşama Kontrolü (hafif): Fiil köklerinde yumuşama bypass’ı uygulanarak tartıda az çeken ve güçlüksüz çıktıları canlı Windows 3.1 ekranlarıyla eşitlendi.

11. Python Tabanlı Modüler Mimari

src/
├── core/                      # Çekirdek Sabitler ve Metin Fonksiyonları
│   ├── constants.py           # 32 harfli alfabe, 36 kategori tablosu
│   └── text.py                # tr_lower, normalize_turkish, sıralama algoritmaları
│
├── engine/                    # Tersine Mühendislik Çekirdek Motorları
│   ├── phonetics.py           # Ünlü uyumu, ünsüz yumuşama ve sertleşme kuralları
│   ├── suffix.py              # SuffixEngine: 3,218 adetlik Section 3 ek tablosu
│   ├── binary_parser.py       # TesBinaryParser: 0x80, 0xC0, 0x0C ve 0x40 akış ayrıştırıcı
│   └── thesaurus.py           # ThesaurusEngine: O(1) indeksler ve koordinatör (~250 satır)

12. Web Arayüzü

Elde edilen veritabanını tarayıcı üzerinde incelemek amacıyla Vanilla HTML/CSS ve Python http.server tabanlı hafif bir web arayüzü (ui.py) hazırlandı:

  • Windows 3.1 Masaüstü: Klasik teal arka plan (#008080), 3D kabartmalı pencereler, lacivert başlık çubuğu.
  • Orijinal Buton Sprite’ları: MTU.EXE kaynaklarından çıkarılan sarı onay eli, “Tamam” ve “Değiştir” butonları.
  • Pencere Sürükleme Motoru (makeDraggable): CSS transform ortalamasını mutlak piksel koordinatlarına dönüştüren sürükle-bırak motoru.
  • Canlı Arama: 26,775 kelime içinde harf yazıldıkça anında çalışan sözlük ve eş anlamlılar listesi.

13. Doğrulama (Ground Truth Testi)

Python motorunun çıktılarının orijinal 16-bit yazılımla birebir örtüştüğünü teyit etmek için DOSBox-X üzerinde Windows 3.1 ortamında çalışan MTU.EXE ile karşılaştırmalı testler (test_comparison.py) yürütüldü. Ekran görüntüleri alınan temel kelimelerin anlam grupları, morfolojik türevleri ve deyimleri karşılaştırılarak tam uyum sağlandı:

KelimeAnlam GruplarıÖne Çıkan Doğruluk Kriteri
öz1, 2, 3.Anlam, Türemiş (63 eş)15/15 türemiş sözcük eşleşmesi
kitap1.Anlam (1 eş)elkitabı (bileşik tamlama)
elma1.Anlam (2 eş)amerikaelması, kirazelması
ekmek1.Anlam, 2.Anlam (17 eş)ekip biçmek, francala
gelmek1.Anlam (17 eş)sökün etmek, çıkagelmek
yüz1, 2.Anlam, Mecaz (22 eş)bet beniz, çehre, fizyonomi
göz1.Anlam (5 eş)bakış açısı, görüş açısı
akıl1.Anlam (34 eş)eseme, feraset, havsala, izan
güzel1, 2.Anlam (48 eş)bir içim su, ay parçası, gelgelli
test1.Anlam (13 eş)deneme, tatma, sınav
mali1.Anlam (3 eş)mal ile ilgili, para ile ilgili, parasal
hafif1, 2, 3.Anlam (41 eş)tartıda az çeken, güçlüksüz
dolu1.Anlam (41 eş)avuç avuç, az buz değil
ağır1.Anlam, Mecaz (21 eş)balyoz gibi, battal, kunt
boş1, 2.Anlam (24 eş)abes, beyhude, nafile
adalet1.Anlam (22 eş)hâk yemezlik, âlicenaplık, tarafsızlık
cesaret1.Anlam (24 eş)çekinmezlik, cüretkârlık, korkusuzluk
hürriyet1.Anlam (15 eş)başına buyrukluk, bağımsızlık
barış1.Anlam (4 eş)ateşkes, sulh, uyuşma
zengin1, 2, 3.Anlam (44 eş)fazlasıyla, ibadullah
ölüm1.Anlam (22 eş)cana kıyma, göçüp gitme, ecel
giriş1.Anlam (24 eş)açılış, başlayış, ilk başta
çıkış1.Anlam (10 eş)kaynak, köken, mahreç, menşe
el1..4.Anlam, 2 Mecaz (33 eş)aracı/araç/vasıta ve baskı/etki/idare
anevrizmaHekimlik (1 eş)damar hastalığı (0x0C başlığı)
siyasi1.Anlam (2 eş)politik, siyasal (0xC0 çapraz başvuru)
araç1.Anlam (7 eş)vasıta, otomobil, taşıt, taksi
cami1.Anlam (1 eş)mescit
çeşme1.Anlam (17 eş)pınar, kaynak, memba, kuyu
aks1.Anlam (1 eş)dingil
çit1.Anlam (11 eş)parmaklık, çeper, ağıl