1 poin oleh GN⁺ 2023-10-16 | 1 komentar | Bagikan ke WhatsApp
  • Lotus 1-2-3, spreadsheet proprietari berusia 30 tahun, akhirnya bisa berjalan secara native di Linux melalui pemulihan materi yang terjadi secara kebetulan dan peretasan biner, meski Linux belum ada saat produk ini dirilis
  • Ditemukannya SDK add-in LPL yang sempat dianggap hilang dan Lotus 1-2-3 for UNIX dari backup BBS era 1990-an memungkinkan pembangunan plugin sampel dan analisis biner UNIX
  • Distribusi UNIX menyertakan objek COFF Intel 80386 terkompresi 123.o, dan sekitar 20.000 simbol beserta informasi debug mengungkap struktur internalnya
  • Porting ini tidak selesai hanya dengan mengubah COFF ke ELF; perbedaan system call dan ABI struktur antara Linux dan UNIX harus diakali dengan coffsyrup dan fungsi pembungkus
  • Port saat ini berjalan tanpa crash dan 100% dapat digunakan, tetapi masih ada beberapa masalah dan port driver terminal yang tersisa, sehingga versi emulasi DOS masih terlihat lebih baik

Titik awal memindahkan aplikasi proprietari 30 tahun ke Linux

  • Lotus 1-2-3 telah lama menjadi abandonware berusia 30 tahun, tetapi berbagai penemuan dan peretasan memungkinkan lahirnya port native Linux
  • Target porting adalah Lotus 1-2-3 R3 klasik, meski Lotus 1-2-3 sendiri masih dirilis hingga 2002
  • Proyek ini bermula dari pemeliharaan driver lotusdrv agar Lotus 1-2-3 dapat berjalan baik di sistem modern
    • API driver dipahami lewat reverse engineering, dan driver yang ada bekerja dengan baik di sistem modern

SDK LPL yang hilang dan backup BBS

  • Lotus 1-2-3 dirancang agar bisa diperluas dengan plugin, yaitu add-in, tetapi add-in harus ditulis dalam bahasa khusus bernama LPL
  • Compiler LPL dan SDK-nya sempat hilang, dan Lotus tidak mendistribusikan SDK secara gratis melainkan menjualnya seharga 395 dolar
  • SDK dalam bentuk warez berhasil dipulihkan melalui mantan sysop yang menyimpan backup tape dari sistem BBS era 1990-an
    • ADK yang dipulihkan bisa diunduh sebagai 123DADK.ZIP
    • Program LPL contoh dipublikasikan sebagai modern.pl
  • Backup BBS yang sama juga berisi salinan warez Lotus 1-2-3 for UNIX yang secara luas dianggap telah hilang

Analisis image disk Lotus 1-2-3 for UNIX

  • Versi UNIX tersisa sebagai kumpulan file TD0 dari 123UNIX1.TD0 hingga 123UNIX5.TD0
  • TD0 diidentifikasi sebagai format image disk terkompresi lawas dari era 1980-an, lalu dikonversi menjadi raw disk image menggunakan samdisk
  • Dari image hasil konversi, yang pertama adalah tar archive, sedangkan sisanya adalah ASCII cpio archive dalam format pre-SVR4 atau odc
  • Seluruh image disk diunggah ke Internet Archive
  • Setelah diekstrak, di bawah lotus/123.v10 muncul executable, bantuan, keymap, data driver printer dan video, file sampel, manual, dan lainnya
    • Susunan lengkapnya mencapai 35 direktori dan 338 file

123.o sebagai petunjuk yang menentukan

  • Di direktori sysV386/lib, ditemukan file besar yang terpecah menjadi 123.o.z_1 dan 123.o.z_2
  • Setelah kedua potongan digabung dan didekompresi, 123.o teridentifikasi sebagai file objek COFF Intel 80386
    • file objek yang tidak di-strip
    • 5 section
    • offset simbol 0x1efbdc
    • 19.755 simbol

      • ukuran optional header 28
      • File ini memuat simbol privat dan informasi debug yang sangat membantu memahami struktur internal Lotus 1-2-3
      • Tanggapan dari alt.folklore.computers cenderung menyatakan file ini tidak masuk secara tidak sengaja
      • Karena dlopen() belum umum dipakai di UNIX awal 1990-an, kemungkinan besar ini adalah objek partially linked untuk ekstensi dan relinking

Struktur internal yang terungkap lewat informasi debug

  • Versi UNIX sangat dekat dengan port langsung dari source versi DOS, sehingga sebagian besar bekerja dengan cara yang sama
  • Informasi debug yang disertakan menjawab berbagai pertanyaan tentang internal Lotus 1-2-3
  • Untuk meningkatkan output grafik, ada keinginan memasang hook ke rasterizer dari driver, tetapi perilakunya sulit dipahami hanya dari dokumentasi
  • Melalui informasi debug, diketahui bahwa rasterizer secara dinamis membuat program bytecode kecil dan mesin grafis menafsirkannya
  • Setelah opcode diketahui, mekanisme ini bisa didisassemble dan dimodifikasi di raster.c untuk meningkatkan output

Mengubah COFF ke ELF

  • objcopy dapat mengubah file objek COFF ke format ELF yang digunakan Linux
  • Dengan perintah objcopy -I coff-i386 -O elf32-i386 123.o 123elf.o, 123.o dikonversi menjadi 123elf.o
  • Hasil konversi teridentifikasi sebagai ELF 32-bit LSB relocatable, Intel 803386, version 1 (SYSV), not stripped
  • Menurut objdump, waktu kompilasi file objek aslinya adalah 8 September 1990 06:23:50, sebelum versi pertama Linux dirilis

Menangani perbedaan ABI Linux dan UNIX

  • Masalah pertama adalah Linux dan UNIX tidak menggunakan antarmuka system call yang saling kompatibel
  • Versi UNIX memakai antarmuka lcall7; misalnya open() memanggil callgate berbentuk call 0x7:0x0
  • Di Linux, callgate ini tidak didukung sehingga program langsung crash bila dijalankan apa adanya
    • Linux dulu sempat memiliki dukungan kompatibilitas lcall7 dan lcall27, tetapi kini sudah tidak ada
  • Tujuannya adalah menghapus panggilan semacam ini dan merutekan semuanya melalui glibc

Relokasi dan coffsyrup

  • Awalnya dicoba menghapus simbol dengan objcopy --strip-symbol open, tetapi objcopy menolak karena open dipakai dalam relocation
  • Relocatable object file memuat referensi simbol dan informasi relokasi agar tetap bisa bekerja di alamat mana pun saat dimuat
  • Untuk menghapus simbol, informasi relokasi yang merujuk ke simbol tersebut juga harus diubah
  • Untuk itu dibuat alat kecil bernama coffsyrup
    • alat ini dapat menghapus simbol COFF yang ditolak oleh objcopy
    • sebagai contoh, simbol open dan relokasi terkait dicari lalu ditangani

Fungsi UNIX yang tidak kompatibel secara biner

  • Cukup banyak fungsi UNIX standar yang kompatibel di level source tetapi tidak kompatibel di level biner
  • Contoh paling representatif adalah struct stat
    • Kode C yang sama bisa dikompilasi di banyak turunan UNIX
    • Tetapi file objek hasil kompilasinya bisa rusak di sistem lain karena perbedaan ukuran struct stat atau offset st_size
  • Fungsi utama yang harus ditangani mencakup stat(), times(), uname(), fcntl(), ioctl() dan lainnya
  • Pendekatannya adalah mengganti nama simbol dengan objcopy, menjadikannya undefined dengan coffsyrup, lalu menulis fungsi wrapper yang mengonversi struktur Linux ke struktur UNIX
  • termios menjadi kendala besar tersendiri, karena perilaku detailnya sedikit berbeda dan tidak kompatibel antar sistem UNIX, sehingga debugging menjadi sulit

Pemeriksaan lisensi dan hasil eksekusi

  • Setelah berbagai peretasan, program akhirnya berjalan tanpa crash, tetapi tetap tidak bisa digunakan tanpa lisensi
  • Dengan memasang breakpoint pada exit(), diketahui bahwa simbol internal yang memeriksa lisensi valid adalah lic_init()
  • Setelah kode ditelaah dengan IDA, pemeriksaan lisensi ternyata mencari file LICENSE.000 dan memverifikasi apakah tanggal kedaluwarsa, nama pengguna, dan nama sistem di dalamnya cocok dengan nilai yang dilaporkan sistem
  • Pada akhirnya, Lotus 1-2-3 berhasil di-port ke sistem operasi baru bernama Linux
  • Status saat ini adalah sebagai berikut
    • berjalan tanpa crash
    • 100% dapat digunakan

      • beberapa masalah masih perlu dirapikan
      • port driver terminal masih tersisa
      • untuk saat ini, versi DOS yang berjalan di emulasi masih terlihat lebih baik, tetapi ini bisa diperbaiki
      • kode porting dipublikasikan di github

1 komentar

 
GN⁺ 2023-10-16
Komentar Hacker News
  • Sulit dipercaya mereka berhasil memulihkan salinan warez SDK dari backup tape sistem BBS lama, bahkan sampai membangun plugin contoh
    Ini mengingatkan pada Why History Needs Software Piracy

    • Saya pernah ingin mengumpulkan manual, pembaruan firmware, driver, dan utilitas untuk synthesizer, perangkat Eurorack, dan semacamnya yang dijual saat ini, lalu membuat arsip pelestarian jangka panjang
      Karena perangkat seperti ini adalah hardware yang masih akan ada puluhan tahun kemudian, akan sangat bernilai bagi publik jika ada repositori terpusat dan tahan lama yang bisa dipakai seluruh komunitas, bukan sekadar disimpan di cloud pribadi masing-masing produsen
      Saya juga sempat memikirkan cara mendistribusikan arsipnya setiap tahun, atau menjual archival Blu-ray sebagai media fisik yang kira-kira bisa bertahan 100 tahun
      Dengan begitu, peluang bahwa seseorang masih memiliki file .bin langka terakhir yang dibutuhkan untuk menyelamatkan firmware rusak pada modul DSP Eurorack berbasis ARM akan mendekati 1
  • Ayah saya menyimpan banyak file Lotus 1-2-3 penting di laptop cadangan dengan Windows lama, dan karena kadang perlu dibuka, kondisinya terasa cukup mengkhawatirkan
    Baru-baru ini saya tahu bahwa LibreOffice bisa mengonversi file Lotus ke ODF/ODS, bahkan dari command line, jadi saya mengonversi semuanya dengan skrip bash sederhana
    File hasil konversi saya unggah massal ke Nextcloud yang terintegrasi Collabora, lalu saya memberi ayah saya akun dan petunjuk penggunaan singkat; sekarang ia bisa melihat file-file itu secara online dan semuanya juga masuk ke rutinitas backup server biasa
    Sangat berterima kasih kepada para arkeolog data seperti OP dan para kontributor LibreOffice

    • Menarik juga, file seperti apa sampai masih penting meski sudah setua itu
  • Saya teringat ketika berusia 7 tahun dan minta dibelikan Nintendo, tetapi ayah saya malah membelikan PC 286, Lotus 1-2-3, dan petualangan teks Indiana Jones

    • Saya melihat LISP Machine di Computer Museum di Boston dan menganggapnya keren, jadi saya bilang ingin punya itu, tetapi akhirnya saya mendapat Commodore 64
      Jadi bahasa pertama saya bukan LISP melainkan BASIC, dan saya berniat menyalahkan tragedi ini atas semua kegagalan hidup saya; saya tidak menerima bantahan
    • Saya merengek minta NES, tetapi ayah saya membelikan C64 sambil berkata, “ini lebih bagus, nanti kamu akan tahu,” dan akhirnya itu mengubah hidup saya
    • Saya menginginkan BBC Micro, tetapi mendapat ZX Spectrum, dan hasilnya justru jauh lebih baik untuk membuat saya tertarik pada pemrograman
      Itu tetap benar meskipun saat itu Spectrum sudah mulai meredup
    • Saya mendapat Apple IIgs dan Leisure Suit Larry, tetapi baik saya maupun kakak laki-laki saya yang lebih tua tidak bisa menjawab pertanyaan verifikasi usia di awal secara konsisten
  • Saya sedang mengerjakan sesuatu yang mirip, tetapi menambahkan langkah untuk terlebih dahulu mengubah sebagian program menjadi file objek
    Dengan begitu, saya tidak hanya terikat pada file objek yang masih tersisa, meski perlu cukup banyak reverse engineering agar bisa berjalan
    Saya membuat proof of concept dengan aln, linker Atari Jaguar, lalu memecah executable Linux x86 a.out menjadi file objek ELF dan menautkannya kembali menjadi executable ELF x86 dengan mengakali perbedaan ABI
    https://forums.atariage.com/topic/354341-porting-the-original-atari-jaguar-sdk-to-elf/

  • Menarik dari banyak sisi
    Proses memindahkan binary UNIX menjadi binary Linux tanpa source code, compiler asli, maupun bahasanya terlihat keren, dan ini benar-benar tipe konten yang khas HN
    Ini juga mengingatkan bahwa pada 2023 Usenet masih dipakai untuk hal selain sekadar distribusi file rar
    Juga membangkitkan ingatan tentang budaya BBS sebelum internet menjadi arus utama, yang menyebarkan antusiasme dan distribusi shareware yang bagus ke publik

    • Sepertinya semangat BBS sedang kembali
      Apalagi melihat Twitter dan media sosial lain yang sedang runtuh; Gen Z yang lebih tua pun terobsesi dengan retro 80–90-an sampai mengunduh suara negosiasi modem sebagai nada dering
      Keponakan saya yang berusia 23 tahun baru-baru ini juga melakukan itu, dan karya seperti American Horror Story atau Stranger Things makin menyuburkan nostalgia tersebut
      Pepatah lama bahwa jika menunggu cukup lama, semua hal akan kembali menjadi tren, tampaknya benar
  • Pada Mei 2022 tahun lalu juga ada diskusi yang bagus
    https://news.ycombinator.com/item?id=31455968

  • https://scenelist.org/ yang ditautkan dari tulisan bagus ini adalah bom nostalgia yang persis saya butuhkan pagi ini
    Sangat bagus untuk perjalanan mengenang masa lalu, sangat direkomendasikan

  • Ini beberapa tautan terkait
    Lotus 1-2-3 for Linux - https://news.ycombinator.com/item?id=35807639 - Mei 2023, 73 komentar
    Lotus 1-2-3 - https://news.ycombinator.com/item?id=35872758 - Mei 2023, 117 komentar
    Lotus 1-2-3 For Linux - https://news.ycombinator.com/item?id=31455968 - Mei 2022, 83 komentar
    Lotus 1-2-3 arbitrary resolution - https://news.ycombinator.com/item?id=26316637 - Maret 2021, 123 komentar

  • Saya benar-benar sempat melupakan 1-2-3 karena sempat mencobanya sebentar tahun lalu
    Binary 123 masih berjalan dengan baik di Linux, dan fakta bahwa software yang sudah lama lenyap bisa langsung berfungsi adalah pencapaian yang cukup luar biasa

  • Saya selalu menginginkan hal seperti ini. Karena saya tidak banyak memakai font atau gambar di spreadsheet, spreadsheet berbasis terminal terasa sangat pas
    Senang akhirnya ini muncul, dan semoga juga di-port ke Mac dan Windows

    • Di situs web yang sama juga ada ulasan berbagai program spreadsheet Linux berbasis terminal
      https://lock.cmpxchg8b.com/spreadsheet.html
    • Emacs sudah lama memiliki mode spreadsheet bernama SimpleEmacsSpreadsheet
      Saya belum pernah mencobanya, tetapi layak dicek
      Selain itu, Org-Mode di Emacs adalah alat yang bisa digali tanpa habis, dan ada juga cara memakai sel tabel org-mode seperti spreadsheet bersama fitur Emacs Calc
      https://www.youtube.com/watch?v=15aDIvb5LJs
      Tampaknya cukup kuat, dan seperti biasa untuk Emacs, bisa berjalan baik di terminal maupun lingkungan berjendela
    • Sudah ada sc: https://www.unix.com/man-page/linux/1/sc/