1 puan yazan GN⁺ 2023-10-16 | 1 yorum | WhatsApp'ta paylaş
  • 30 yıllık tescilli elektronik tablo yazılımı Lotus 1-2-3, tesadüfen kurtarılan materyaller ve ikili dosya hack’leriyle, piyasaya çıktığı dönemde var olmayan Linux üzerinde yerel olarak çalıştırıldı
  • 1990’ların BBS yedeklerinde kaybolduğu sanılan LPL eklenti SDK’sı ve UNIX için Lotus 1-2-3 bulununca, örnek eklentilerin derlenmesi ve UNIX ikili dosyalarının analizi mümkün oldu
  • UNIX dağıtımında sıkıştırılmış Intel 80386 COFF nesnesi 123.o yer alıyordu; yaklaşık 20.000 sembol ve hata ayıklama bilgisi iç yapıyı ortaya çıkardı
  • Portlama yalnızca COFF’u ELF’e çevirmekle bitmedi; Linux ile UNIX arasındaki sistem çağrısı ve yapı ABI farklarını coffsyrup ve sarmalayıcı işlevlerle aşmak gerekti
  • Mevcut port çökmeden çalışıyor ve %100 kullanılabilir, ancak bazı sorunlar ve terminal sürücüsü portlaması hâlâ durduğu için DOS emülasyon sürümü şimdilik daha iyi görünüyor

30 yıllık tescilli bir uygulamayı Linux’a taşımanın başlangıç noktası

  • Lotus 1-2-3, 30 yıllık abandonware olarak kalmıştı; ancak çeşitli keşifler ve hack’ler sayesinde Linux yerel portu mümkün hale geldi
  • Portlama hedefi klasik Lotus 1-2-3 R3 idi; Lotus 1-2-3’ün kendisi ise 2002’ye kadar sürümler aldı
  • Bu proje, modern sistemlerde Lotus 1-2-3’ün düzgün çalışmasını sağlayan lotusdrv sürücüsünü sürdürme çalışmasından doğdu
    • Sürücü API’si tersine mühendislikle anlaşıldı ve mevcut sürücü modern sistemlerde iyi çalışıyor

Kayıp LPL SDK’sı ve BBS yedeği

  • Lotus 1-2-3, eklentiler yani add-in’ler ile genişletilecek şekilde tasarlanmıştı; ancak eklentilerin LPL adlı özel bir dille yazılması gerekiyordu
  • LPL derleyicisi ve SDK kaybolmuş durumdaydı; Lotus ise SDK’yı ücretsiz dağıtmıyor, 395 dolara satıyordu
  • 1990’ların BBS sistemine ait teyp yedeklerini saklayan eski bir sysop aracılığıyla SDK’nın warez biçimindeki kopyası kurtarıldı
    • Kurtarılan ADK 123DADK.ZIP olarak indirilebilir
    • Örnek LPL programı modern.pl olarak yayımlandı
  • Aynı BBS yedeğinde, yaygın olarak kaybolduğu düşünülen UNIX için Lotus 1-2-3’ün warez kopyası da vardı

UNIX için Lotus 1-2-3 disk imajlarının analizi

  • UNIX sürümü, 123UNIX1.TD0 ile 123UNIX5.TD0 arasındaki TD0 dosyaları kümesi olarak kalmıştı
  • TD0’nun 1980’lerden kalma eski bir sıkıştırılmış disk imajı biçimi olduğu anlaşıldı ve samdisk kullanılarak ham disk imajına dönüştürüldü
  • Dönüştürülen imajlardan ilki tar archive, diğerleri ise pre-SVR4 ya da odc biçiminde ASCII cpio archive idi
  • Tüm disk imajları Internet Archive’a yüklendi
  • Arşiv açıldığında lotus/123.v10 altında yürütülebilir dosyalar, yardım dosyaları, tuş haritaları, yazıcı ve video sürücüsü verileri, örnek dosyalar, kılavuzlar vb. ortaya çıktı
    • Toplam yapı 35 dizin ve 338 dosya düzeyindeydi

Kritik ipucu: 123.o

  • sysV386/lib dizininde 123.o.z_1 ve 123.o.z_2 olarak ikiye bölünmüş büyük bir dosya bulundu
  • İki parça birleştirilip sıkıştırma açılınca 123.o dosyasının Intel 80386 COFF object file olduğu anlaşıldı
    • stripped edilmemiş nesne dosyası
    • 5 bölüm
    • sembol ofseti 0x1efbdc
    • 19.755 sembol

      • optional header size 28
      • Bu dosya private symbol’lar ve hata ayıklama bilgisi içerdiği için Lotus 1-2-3’ün iç yapısını anlamada büyük yardım sağladı
      • alt.folklore.computers üzerinden gelen yanıt, bu dosyanın yanlışlıkla eklenmediği yönündeydi
      • 1990’ların başındaki UNIX’lerde dlopen() yaygın kullanılmadığından, genişletmelerle yeniden linklemek için kullanılan partially linked object olma olasılığı yüksekti

Hata ayıklama bilgisinin ortaya çıkardığı iç yapı

  • UNIX sürümü, DOS sürümünün doğrudan kaynak portuna yakın olduğu için büyük ölçüde aynı şekilde çalışıyordu
  • İçindeki hata ayıklama bilgisi, Lotus 1-2-3’ün iç yapısına dair birçok soruyu çözdü
  • Grafik çıktısını iyileştirmek için sürücüden rasterizer’a hook koymak isteniyordu; ancak yalnızca belgelerle işleyişi anlamak zordu
  • Hata ayıklama bilgileri sayesinde rasterizer’ın küçük bir bytecode programını dinamik olarak oluşturduğu ve grafik motorunun bunu yorumladığı anlaşıldı
  • Opcode’lar öğrenildikten sonra raster.c içinde bunları disassemble edip değiştirerek çıktı iyileştirmelerinde kullanmak mümkün oldu

COFF’tan ELF’e dönüştürme

  • objcopy, COFF nesne dosyasını Linux’un kullandığı ELF biçimine dönüştürebiliyor
  • objcopy -I coff-i386 -O elf32-i386 123.o 123elf.o komutuyla 123.o, 123elf.o dosyasına dönüştürüldü
  • Dönüştürme sonucu ELF 32-bit LSB relocatable, Intel 803386, version 1 (SYSV), not stripped olarak doğrulandı
  • objdump’a göre orijinal nesne dosyasının derlenme zamanı 8 Eylül 1990 06:23:50 idi; bu, Linux’un ilk sürümünün çıkmasından önceye denk geliyor

Linux ve UNIX ABI farklarını ele alma

  • İlk sorun, Linux ile UNIX’in uyumlu sistem çağrısı arayüzü kullanmamasıydı
  • UNIX sürümü lcall7 arayüzünü kullanıyordu; örneğin open(), call 0x7:0x0 biçimindeki bir callgate’i çağırıyordu
  • Linux’ta bu callgate desteklenmediğinden, olduğu gibi çalıştırılınca çökme meydana geliyordu
    • Linux’ta bir dönem lcall7 ve lcall27 uyumluluk desteği vardı, ancak artık yok
  • Hedef, bu çağrıları ortadan kaldırıp tüm çağrıları glibc üzerinden yönlendirmekti

Relocation ve coffsyrup

  • Basitçe objcopy --strip-symbol open ile sembolü kaldırmaya çalışıldı, ancak open relocation içinde kullanıldığı için objcopy bunu reddetti
  • Relocatable object file, hangi adrese yüklenirse yüklensin çalışabilmek için sembol referansları ve relocation bilgileri içerir
  • Bir sembolü kaldırmak için o sembole referans veren relocation bilgilerini de birlikte değiştirmek gerekir
  • Bunun için küçük bir araç olan coffsyrup yazıldı
    • objcopy’nin reddettiği COFF sembollerini de kaldırabiliyor
    • Örnek olarak open sembolünü ve ilgili relocation’ları bulup işliyor

İkili uyumlu olmayan UNIX işlevleri

  • Standart UNIX işlevlerinin önemli bir bölümü kaynak uyumlu olsa da ikili uyumlu değildir
  • Tipik örnek struct stattir
    • Aynı C kodu çeşitli UNIX türevlerinde derlenebilir
    • Ancak derlenmiş nesne dosyası, struct stat boyutu ya da st_size ofseti farkları nedeniyle başka sistemlerde bozulabilir
  • Ele alınması gereken başlıca işlevler stat(), times(), uname(), fcntl(), ioctl() vb. idi
  • Yaklaşım, objcopy ile sembol adlarını değiştirmek, coffsyrup ile undefined hale getirmek ve Linux yapılarını UNIX yapılarına dönüştüren sarmalayıcı işlevler yazmaktı
  • termios özellikle büyük bir zorluktu; ayrıntılı davranışları UNIX sistemleri arasında ince farklar gösterdiği ve uyumsuz olduğu için hata ayıklaması zordu

Lisans kontrolü ve çalışma sonucu

  • Çeşitli hack’lerden sonra program çökmeden çalıştı, ancak lisans yoksa çalışmıyordu
  • exit() üzerine breakpoint koyarak yapılan kontrolde, geçerli lisansı doğrulayan iç sembolün lic_init() olduğu anlaşıldı
  • IDA ile kod incelendiğinde lisans kontrolünün LICENSE.000 dosyasını aradığı; içindeki son kullanma tarihi, kullanıcı adı ve sistem adının sistemin bildirdiği değerlerle eşleşip eşleşmediğini kontrol ettiği görüldü
  • Sonuçta Lotus 1-2-3 yeni işletim sistemi Linux’a portlandı
  • Mevcut durum şöyle
    • Çökmeden çalışıyor
    • %100 kullanılabilir

      • Bazı sorunların daha da iyileştirilmesi gerekiyor
      • Terminal sürücüsü portlaması hâlâ duruyor
      • Şimdilik emülasyonda çalışan DOS sürümü daha iyi görünüyor, ancak bu düzeltilebilir
      • Portlama kodu github’da yayımlandı

1 yorum

 
GN⁺ 2023-10-16
Hacker News yorumları
  • Eski bir BBS sisteminin teyp yedeğinden SDK'nın warez kopyasını kurtarıp örnek eklentiyi bile derlemiş olmaları inanılmaz gibi
    Why History Needs Software Piracy yazısını hatırlatıyor

    • Günümüzde satılan synthesizer'lar, Eurorack ekipmanları vb. için kılavuzları, firmware güncellemelerini, sürücüleri ve yardımcı araçları toplayıp uzun vadeli koruma arşivi oluşturmak istemiştim
      Bu tür ekipmanlar onlarca yıl sonra bile varlığını sürdürecek donanımlar olduğundan, üretici bazında kişisel bulutta saklama seviyesinin ötesinde, tüm topluluğun kullanabileceği merkezi ve uzun ömürlü bir depo olmasının kamu yararı açısından değeri büyük
      Arşivi her yıl dağıtmayı ya da yaklaşık 100 yıl dayanacak fiziksel medya olarak archival Blu-ray satmayı da düşünmüştüm
      Böylece ARM tabanlı DSP Eurorack modülünün bozulmuş firmware'ini kurtarmak için gereken son nadir .bin dosyasının birilerinde bulunma olasılığı 1'e yaklaşırdı
  • Babam, eski Windows yüklü yedek bir dizüstü bilgisayarda bir sürü önemli Lotus 1-2-3 dosyası tutuyordu; ara sıra açması gerektiği için bu durum epey endişe vericiydi
    Yakın zamanda LibreOffice'in Lotus dosyalarını ODF/ODS'ye, hatta komut satırından bile dönüştürebildiğini öğrendim ve basit bir bash betiğiyle hepsini dönüştürdüm
    Dönüştürülen dosyaları Collabora bağlı Nextcloud'a topluca yükleyip babama bir hesap ve kısa kullanım talimatı verdim; artık dosyaları çevrimiçi görebiliyor ve sunucunun normal yedekleme rutinine de dahil oluyorlar
    OP gibi veri arkeologlarına ve LibreOffice katkıcılarına çok teşekkürler

    • Bu kadar eski olmasına rağmen hâlâ önemli dosyalar olmaları ilginç; ne tür dosyalar olduklarını epey merak ettim
  • 7 yaşındayken Nintendo almaları için ısrar edince babamın onun yerine 286 PC ile Lotus 1-2-3 ve Indiana Jones metin macerası aldığını hatırladım

    • Boston'daki Computer Museum'da gördüğüm LISP Machine çok havalı göründüğü için ondan istemiştim ama sonunda Commodore 64 aldım
      Böylece ilk dilim LISP değil BASIC oldu; hayattaki tüm başarısızlıklarımı bu trajediye bağlamayı düşünüyorum, itiraz kabul etmiyorum
    • NES almaları için çok ısrar ettim ama babam “bu daha iyi, sonra anlayacaksın” diyerek C64 aldı ve sonunda hayatım değişti
    • BBC Micro istemiştim ama ZX Spectrum aldım; sonuçta programlamaya ilgi duymamı sağlama konusunda çok daha iyi oldu
      Spectrum'un artık düşüş döneminde olduğu bir zamanda bile böyleydi
    • Apple IIgs ve Leisure Suit Larry aldım; ne ben ne de benden büyük ağabeyim açılıştaki yaş doğrulama sorularının cevaplarını güvenilir şekilde tutturabiliyorduk
  • Benzer bir iş yapıyorum, ancak programın bazı kısımlarını önce nesne dosyalarına çevirme adımını ekliyorum
    Böylece yalnızca elde kalmış mevcut nesne dosyalarına bağlı kalmıyorum, ama çalışır hale getirmek için bir miktar tersine mühendislik gerekiyor
    Atari Jaguar linker'ı aln ile bir kavram kanıtı hazırladım; Linux x86 a.out çalıştırılabilir dosyasını ELF nesne dosyalarına ayırıp ABI farklarını aşarak yeniden ELF x86 çalıştırılabilir dosyası olarak linkledim
    https://forums.atariage.com/topic/354341-porting-the-original-atari-jaguar-sdk-to-elf/

  • Birçok açıdan ilginçti
    Kaynak kodu da, özgün derleyici ve dili de olmadan UNIX binary'sinden Linux binary'sine taşıma süreci harika görünüyordu; HN'e yakışan içerik tam da bu
    2023'te bile Usenet'in yalnızca rar dosyası dağıtımı dışında amaçlarla kullanıldığını da hatırlatıyor
    İnternetin kitleselleşmesinden önceki BBS kültürünün tutkuyu ve iyi shareware dağıtımını geniş kitlelere yaydığı geçmişi de akla getiriyor

    • BBS ruhu geri dönüyor gibi
      Twitter ve diğer sosyal medyanın çöküş eğilimine bakınca bu daha da öyle; yaşça büyük Z kuşağı 80'ler ve 90'lar nostaljisine kapılıp modem el sıkışma seslerini zil sesi olarak indiriyor
      23 yaşındaki yeğenim de yakın zamanda bunu yaptı; American Horror Story ve Stranger Things gibi yapımlar da bu nostaljiyi daha da besliyor
      Yeterince uzun beklersen her şey yeniden moda olur diyen eski söz doğru çıkıyor
  • Geçen yıl, Mayıs 2022'de de iyi bir tartışma olmuştu
    https://news.ycombinator.com/item?id=31455968

  • Bu harika yazıda bağlantısı verilen https://scenelist.org/ tam da bu sabah ihtiyacım olan nostalji bombasıydı
    Anılara yolculuk için çok iyi, şiddetle tavsiye ederim

  • İlgili bağlantılar
    Lotus 1-2-3 for Linux - https://news.ycombinator.com/item?id=35807639 - Mayıs 2023, 73 yorum
    Lotus 1-2-3 - https://news.ycombinator.com/item?id=35872758 - Mayıs 2023, 117 yorum
    Lotus 1-2-3 For Linux - https://news.ycombinator.com/item?id=31455968 - Mayıs 2022, 83 yorum
    Lotus 1-2-3 arbitrary resolution - https://news.ycombinator.com/item?id=26316637 - Mart 2021, 123 yorum

  • Geçen yıl kısa süre kullanmış olmama rağmen 1-2-3'ü tamamen unutmuşum
    Linux'ta 123 binary'si hâlâ sorunsuz çalışıyor; uzun zaman önce ortadan kaybolmuş bir yazılımın öylece çalışması epey büyük bir başarı

  • Hep böyle bir şey istemiştim. Elektronik tablolarda yazı tipi ya da görselleri pek kullanmadığım için terminal tabanlı bir elektronik tablo tam bana göre
    Sonunda çıkmış olmasına sevindim; Mac ve Windows'a da port edilse iyi olur

    • Aynı web sitesinde çeşitli terminal Linux elektronik tablo programları incelemeleri de var
      https://lock.cmpxchg8b.com/spreadsheet.html
    • Emacs'te uzun zamandır bir elektronik tablo modu olan SimpleEmacsSpreadsheet vardı
      Hiç kullanmadım ama bakmaya değer
      Ayrıca Emacs'in Org-Mode'u sonu gelmeyecek kadar kurcalanabilecek bir araç; org-mode tablo hücrelerini Emacs Calc özelliğiyle birlikte elektronik tablo gibi kullanmanın bir yolu da var
      https://www.youtube.com/watch?v=15aDIvb5LJs
      Oldukça güçlü görünüyor ve Emacs'e yakışır şekilde hem terminalde hem de pencere ortamında çalışabiliyor
    • Zaten sc var: https://www.unix.com/man-page/linux/1/sc/