Lotus 1-2-3 untuk Linux
(lock.cmpxchg8b.com)- 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
coffsyrupdan 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.TD0hingga123UNIX5.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.v10muncul 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 menjadi123.o.z_1dan123.o.z_2 - Setelah kedua potongan digabung dan didekompresi,
123.oteridentifikasi 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.computerscenderung 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
objcopydapat mengubah file objek COFF ke format ELF yang digunakan Linux- Dengan perintah
objcopy -I coff-i386 -O elf32-i386 123.o 123elf.o,123.odikonversi menjadi123elf.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; misalnyaopen()memanggil callgate berbentukcall 0x7:0x0 - Di Linux, callgate ini tidak didukung sehingga program langsung crash bila dijalankan apa adanya
- Linux dulu sempat memiliki dukungan kompatibilitas
lcall7danlcall27, tetapi kini sudah tidak ada
- Linux dulu sempat memiliki dukungan kompatibilitas
- Tujuannya adalah menghapus panggilan semacam ini dan merutekan semuanya melalui glibc
Relokasi dan coffsyrup
- Awalnya dicoba menghapus simbol dengan
objcopy --strip-symbol open, tetapiobjcopymenolak karenaopendipakai 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
opendan relokasi terkait dicari lalu ditangani
- alat ini dapat menghapus simbol COFF yang ditolak oleh
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 statatau offsetst_size
- Fungsi utama yang harus ditangani mencakup
stat(),times(),uname(),fcntl(),ioctl()dan lainnya - Pendekatannya adalah mengganti nama simbol dengan
objcopy, menjadikannya undefined dengancoffsyrup, lalu menulis fungsi wrapper yang mengonversi struktur Linux ke struktur UNIX termiosmenjadi 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 adalahlic_init() - Setelah kode ditelaah dengan IDA, pemeriksaan lisensi ternyata mencari file
LICENSE.000dan 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
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
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
.binlangka terakhir yang dibutuhkan untuk menyelamatkan firmware rusak pada modul DSP Eurorack berbasis ARM akan mendekati 1Ayah 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
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
Jadi bahasa pertama saya bukan LISP melainkan BASIC, dan saya berniat menyalahkan tragedi ini atas semua kegagalan hidup saya; saya tidak menerima bantahan
Itu tetap benar meskipun saat itu Spectrum sudah mulai meredup
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 x86a.outmenjadi file objek ELF dan menautkannya kembali menjadi executable ELF x86 dengan mengakali perbedaan ABIhttps://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
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
123masih berjalan dengan baik di Linux, dan fakta bahwa software yang sudah lama lenyap bisa langsung berfungsi adalah pencapaian yang cukup luar biasaSaya 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
https://lock.cmpxchg8b.com/spreadsheet.html
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
Calchttps://www.youtube.com/watch?v=15aDIvb5LJs
Tampaknya cukup kuat, dan seperti biasa untuk Emacs, bisa berjalan baik di terminal maupun lingkungan berjendela
sc: https://www.unix.com/man-page/linux/1/sc/