1 पॉइंट द्वारा GN⁺ 2023-10-16 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 30 साल पुराना proprietary spreadsheet Lotus 1-2-3 संयोग से रिकवर हुए data और binary hacking के बाद, उस Linux पर native रूप से चल पाया जो release के समय मौजूद भी नहीं था
  • 1990s के BBS backup में खोया हुआ माना जा रहा LPL add-in SDK और Lotus 1-2-3 for UNIX मिलने से sample plugin build और UNIX binary analysis संभव हुआ
  • UNIX distribution में compressed Intel 80386 COFF object 123.o शामिल था, और करीब 20,000 symbols व debug information ने इसकी internal structure उजागर की
  • Porting सिर्फ COFF को ELF में बदलने भर से पूरी नहीं हुई; Linux और UNIX के system call और structure ABI differences को coffsyrup और wrapper functions से bypass करना पड़ा
  • मौजूदा port बिना crash के चलता है और 100% usable है, लेकिन कुछ issues और terminal driver porting अभी बाकी हैं, इसलिए DOS emulation version फिलहाल देखने में बेहतर है

30 साल पुराने proprietary app को Linux पर लाने की शुरुआत

  • Lotus 1-2-3 30 साल पुराने abandonware के रूप में बचा हुआ था, लेकिन कई discoveries और hacking के जरिए Linux native port संभव हुआ
  • Porting target classic Lotus 1-2-3 R3 है, जबकि Lotus 1-2-3 के releases खुद 2002 तक आते रहे थे
  • यह project modern systems पर Lotus 1-2-3 को ठीक से चलाने वाले lotusdrv driver maintenance work से शुरू हुआ
    • Driver API को reverse engineering से समझा गया, और existing drivers modern systems पर अच्छी तरह चलते हैं

खोया हुआ LPL SDK और BBS backup

  • Lotus 1-2-3 को plugins, यानी add-ins के जरिए extend करने के लिए design किया गया था, लेकिन add-ins को LPL नाम की special language में लिखना पड़ता था
  • LPL compiler और SDK गायब थे, और Lotus SDK को free में distribute नहीं करता था बल्कि 395 dollars में बेचता था
  • 1990s के BBS system के tape backups संभालकर रखने वाले एक पूर्व sysop के जरिए warez form में SDK recover हुआ
    • रिकवर किया गया ADK 123DADK.ZIP के रूप में download किया जा सकता है
    • Sample LPL program modern.pl के रूप में public है
  • उसी BBS backup में Lotus 1-2-3 for UNIX की warez copy भी थी, जिसे व्यापक रूप से खोया हुआ माना जाता था

Lotus 1-2-3 for UNIX disk image analysis

  • UNIX version 123UNIX1.TD0 से 123UNIX5.TD0 तक के TD0 files के bundle के रूप में बचा हुआ था
  • TD0 को 1980s का पुराना compressed disk image format पाया गया, और samdisk का उपयोग करके raw disk images में convert किया गया
  • Converted images में पहला tar archive था, बाकी pre-SVR4 या odc format के ASCII cpio archive थे
  • पूरे disk images Internet Archive पर upload किए गए
  • Extract करने पर lotus/123.v10 के नीचे executables, help, keymaps, printer और video driver data, sample files, manuals आदि मिले
    • कुल structure लगभग 35 directories और 338 files का था

निर्णायक clue बना 123.o

  • sysV386/lib directory में 123.o.z_1 और 123.o.z_2 में बंटा एक बड़ा file मिला
  • दोनों pieces जोड़कर decompress करने पर 123.o एक Intel 80386 COFF object file निकला
    • Unstripped object file
    • 5 sections
    • Symbol offset 0x1efbdc
    • 19,755 symbols

      • optional header size 28
      • इस file में private symbols और debug information शामिल थे, जिससे Lotus 1-2-3 की internal structure समझने में बहुत मदद मिली
      • alt.folklore.computers से मिली response इस ओर थी कि यह file गलती से शामिल नहीं हुई थी
      • शुरुआती 1990s के UNIX में dlopen() widely used नहीं था, इसलिए यह extensions के साथ relink करने के लिए partially linked object होने की संभावना ज्यादा थी

Debug information से सामने आई internal structure

  • UNIX version, DOS version के direct source port के करीब था, इसलिए ज्यादातर उसी तरह काम करता था
  • शामिल debug information ने Lotus 1-2-3 internals से जुड़े कई सवाल हल कर दिए
  • Graph output सुधारने के लिए driver से rasterizer में hook लगाना था, लेकिन सिर्फ documentation से behavior समझना मुश्किल था
  • Debug information से पता चला कि rasterizer छोटे bytecode programs dynamically generate करता है, और graphics engine उन्हें interpret करता है
  • opcode समझने के बाद raster.c में इसे disassemble और modify करके output improvement में इस्तेमाल करना संभव हुआ

COFF से ELF में conversion

  • objcopy COFF object file को Linux में इस्तेमाल होने वाले ELF format में convert कर सकता है
  • objcopy -I coff-i386 -O elf32-i386 123.o 123elf.o command से 123.o को 123elf.o में convert किया गया
  • Conversion result ELF 32-bit LSB relocatable, Intel 803386, version 1 (SYSV), not stripped के रूप में confirm हुआ
  • objdump के अनुसार original object file का compile time 8 सितंबर 1990 06:23:50 था, यानी Linux के पहले version के आने से पहले

Linux और UNIX ABI differences संभालना

  • पहली समस्या यह थी कि Linux और UNIX compatible system call interface इस्तेमाल नहीं करते
  • UNIX version lcall7 interface इस्तेमाल करता था; उदाहरण के लिए open() call 0x7:0x0 form के callgate को call करता है
  • Linux में यह callgate supported नहीं है, इसलिए वैसे ही चलाने पर crash होता है
    • Linux में कभी lcall7 और lcall27 compatibility support था, लेकिन अब नहीं है
  • लक्ष्य था ऐसे calls हटाना और सभी calls को glibc के जरिए route करना

Relocation और coffsyrup

  • सिर्फ objcopy --strip-symbol open से symbol हटाने की कोशिश की गई, लेकिन open relocation में इस्तेमाल हो रहा था, इसलिए objcopy ने मना कर दिया
  • Relocatable object file में symbols references और relocation information होती है ताकि वह किसी भी address पर load होकर काम कर सके
  • Symbol हटाने के लिए उस symbol को reference करने वाली relocation information भी साथ में modify करनी होती है
  • इसके लिए छोटा tool coffsyrup लिखा गया
    • यह objcopy द्वारा reject किए जाने वाले COFF symbols भी हटा सकता है
    • उदाहरण के तौर पर open symbol और उससे जुड़ी relocations को ढूंढकर process किया गया

Binary-compatible न होने वाले UNIX functions

  • Standard UNIX functions में से कई source-compatible तो हैं, लेकिन binary-compatible नहीं
  • इसका प्रमुख example struct stat है
    • वही C code कई UNIX variants पर compile हो सकता है
    • लेकिन compiled object file, struct stat के size या st_size offset में differences की वजह से दूसरे system पर टूट सकता है
  • जिन मुख्य functions को handle करना था वे stat(), times(), uname(), fcntl(), ioctl() आदि हैं
  • Approach यह थी कि objcopy से symbol names बदले जाएं, coffsyrup से उन्हें undefined किया जाए, और Linux structures को UNIX structures में convert करने वाले wrapper functions लिखे जाएं
  • termios खास तौर पर बड़ी मुश्किल था, और इसकी detailed behavior UNIX systems के बीच subtle और incompatible तरीके से अलग होती है, इसलिए debugging कठिन थी

License check और execution result

  • कई hacks के बाद program बिना crash के चलने लगा, लेकिन license न होने पर काम नहीं करता था
  • exit() पर break लगाकर जांचने पर पता चला कि valid license verify करने वाला internal symbol lic_init() था
  • IDA से code देखने पर पता चला कि license check LICENSE.000 file खोजता है और उसमें expiry date, user name, system name को system-reported values से match करता है
  • अंततः Lotus 1-2-3 को नए operating system Linux पर port कर दिया गया
  • मौजूदा status इस प्रकार है
    • बिना crash के चलता है
    • 100% usable

      • कुछ issues को और polish करना बाकी है
      • Terminal driver porting बाकी है
      • फिलहाल emulation में चलने वाला DOS version देखने में बेहतर है, लेकिन इसे fix किया जा सकता है
      • Porting code github पर public है

1 टिप्पणियां

 
GN⁺ 2023-10-16
Hacker News की राय
  • पुराने BBS सिस्टम के tape backup से SDK की warez copy रिकवर करके sample plugin तक build कर लिया—यह लगभग अविश्वसनीय है
    Why History Needs Software Piracy याद आ गया

    • मैं अभी बिक रहे synthesizer, Eurorack gear वगैरह के manuals, firmware updates, drivers और utilities इकट्ठा करके एक long-term preservation archive बनाना चाहता था
      ऐसा gear कई दशकों बाद भी मौजूद रहने वाला hardware है, इसलिए हर manufacturer के हिसाब से किसी personal cloud में रखने के स्तर से आगे बढ़कर, पूरी community के इस्तेमाल लायक एक centralized और लंबे समय तक टिकने वाली repository हो तो उसका public-interest value बहुत बड़ा होगा
      हर साल archive distribute करने या लगभग 100 साल टिकने वाले physical media के रूप में archival Blu-ray बेचने का तरीका भी सोचा था
      तब किसी ARM-based DSP Eurorack module के corrupted firmware को बचाने के लिए जरूरी आखिरी rare .bin file किसी न किसी के पास होने की संभावना लगभग 1 हो जाएगी
  • मेरे पिता ने पुराने Windows वाले secondary laptop में बहुत सारी महत्वपूर्ण Lotus 1-2-3 files रखी हुई थीं, और कभी-कभी उन्हें खोलना पड़ता था, इसलिए वह स्थिति काफी असुरक्षित लगती थी
    हाल ही में पता चला कि LibreOffice Lotus files को ODF/ODS में, यहां तक कि command line से भी, convert कर सकता है; फिर एक simple bash script से सब convert कर दिया
    converted files को Collabora लगे Nextcloud पर bulk में upload किया और पिता को account व basic usage बता दिया; अब वे files online देख सकते हैं और वे server के regular backup routine में भी शामिल हैं
    OP जैसे data archaeologists और LibreOffice contributors का बहुत आभार

    • इतनी पुरानी होने के बावजूद वे अभी भी महत्वपूर्ण files हैं—काफी जिज्ञासा है कि वे किस तरह की files होंगी
  • याद आया, जब मैं 7 साल का था और Nintendo मांग रहा था, तो पिता ने उसकी जगह 286 PC, Lotus 1-2-3 और Indiana Jones text adventure खरीदकर दे दिया था

    • Boston के Computer Museum में देखी LISP Machine मुझे शानदार लगी थी, इसलिए मैंने वही चाही थी, लेकिन अंत में Commodore 64 मिला
      इसलिए मेरी पहली language LISP नहीं बल्कि BASIC बनी, और मैं जीवन की हर नाकामी का दोष इसी tragedy पर डालने वाला हूं; कोई आपत्ति स्वीकार नहीं
    • मैंने NES के लिए जिद की थी, लेकिन पिता ने “यह बेहतर है, बाद में समझोगे” कहकर C64 दिला दिया, और अंततः जीवन बदल गया
    • मैं BBC Micro चाहता था, लेकिन ZX Spectrum मिला, और नतीजा यह हुआ कि programming में रुचि जगाने के लिए वह कहीं बेहतर साबित हुआ
      भले ही उस समय Spectrum का दौर पहले से ढलान पर था
    • मुझे Apple IIgs और Leisure Suit Larry मिला था, लेकिन न मैं और न मेरा बड़ा भाई शुरुआत में आने वाले age verification questions के जवाब भरोसेमंद तरीके से सही दे पाते थे
  • मैं भी मिलता-जुलता काम कर रहा हूं, लेकिन program के कुछ हिस्सों को पहले object files में बदलने का step जोड़ रहा हूं
    इसलिए यह केवल बचे हुए existing object files तक सीमित नहीं रहता, लेकिन इसे चलाने लायक बनाने के लिए कुछ reverse engineering चाहिए
    Atari Jaguar linker aln के साथ proof of concept बनाया, और Linux x86 a.out executable को ELF object files में अलग करने के बाद ABI differences को bypass करके उसे फिर से ELF x86 executable के रूप में link किया
    https://forums.atariage.com/topic/354341-porting-the-original-atari-jaguar-sdk-to-elf/

  • कई मायनों में दिलचस्प था
    source code, original compiler और language के बिना UNIX binary से Linux binary में port करने की प्रक्रिया शानदार लगी, और ऐसी चीजें ही HN जैसी लगती हैं
    यह भी याद दिलाया कि 2023 में भी Usenet सिर्फ rar files distribute करने के अलावा दूसरे कामों में इस्तेमाल होता है
    Internet mainstream होने से पहले की BBS culture भी याद आ गई, जिसने जुनून और बेहतरीन shareware distribution को आम लोगों तक पहुंचाया था

    • लगता है BBS spirit लौट रही है
      Twitter सहित social media के टूटने-बिखरने के trend को देखें तो और भी ऐसा लगता है; उम्र में बड़े Gen Z लोग 80s–90s retro में डूबे हैं और modem negotiation sound को ringtone के तौर पर download भी करते हैं
      मेरे 23 साल के भतीजे ने भी हाल ही में ऐसा किया, और American Horror Story या Stranger Things जैसे shows उस nostalgia को और fuel कर रहे हैं
      पुरानी कहावत सही ही है कि पर्याप्त देर इंतजार करो तो हर चीज फिर fashion में आ जाती है
  • पिछले साल मई 2022 में भी अच्छी discussion हुई थी
    https://news.ycombinator.com/item?id=31455968

  • इस शानदार लेख में link किया गया https://scenelist.org/ आज सुबह मेरे लिए ठीक वैसा ही nostalgia bomb था जिसकी जरूरत थी
    memories की यात्रा के लिए बहुत बढ़िया है और strongly recommend करता हूं

  • संबंधित links
    Lotus 1-2-3 for Linux - https://news.ycombinator.com/item?id=35807639 - मई 2023, 73 comments
    Lotus 1-2-3 - https://news.ycombinator.com/item?id=35872758 - मई 2023, 117 comments
    Lotus 1-2-3 For Linux - https://news.ycombinator.com/item?id=31455968 - मई 2022, 83 comments
    Lotus 1-2-3 arbitrary resolution - https://news.ycombinator.com/item?id=26316637 - मार्च 2021, 123 comments

  • पिछले साल थोड़ी देर इस्तेमाल करने के कारण मैं 1-2-3 को पूरी तरह भूल गया था
    Linux पर 123 binary अभी भी ठीक चल रही है, और बहुत पहले गायब हो चुके software का बस यूं ही काम कर जाना काफी बड़ी उपलब्धि है

  • मैं हमेशा ऐसी चीज चाहता था। spreadsheets में fonts या drawings ज्यादा इस्तेमाल नहीं करता, इसलिए terminal-based spreadsheet बिल्कुल सही बैठती है
    आखिरकार यह आ गई, यह देखकर खुशी है; उम्मीद है Mac और Windows पर भी port होगी

    • इसी website पर अलग-अलग terminal Linux spreadsheet programs के reviews भी हैं
      https://lock.cmpxchg8b.com/spreadsheet.html
    • Emacs में बहुत पहले से spreadsheet mode SimpleEmacsSpreadsheet मौजूद था
      मैंने इस्तेमाल नहीं किया है, लेकिन देखने लायक है
      साथ ही Emacs का Org-Mode अंतहीन तरीके से explore करने लायक tool है, और org-mode table cells को Emacs Calc feature के साथ spreadsheet की तरह इस्तेमाल करने का तरीका भी है
      https://www.youtube.com/watch?v=15aDIvb5LJs
      काफी powerful लगता है, और Emacs की तरह terminal और window environment दोनों में चल सकता है
    • sc पहले से मौजूद है: https://www.unix.com/man-page/linux/1/sc/