本篇文章更新時間:2026/02/02
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
破解 40 年前的複製保護:從 RPG II 編譯器到平行埠加密狗的軟體考古學
編輯前言:這篇文章來自 Dmitry Brant 的軟體考古實錄Defeating a 40-year-old copy protection dongle。作者用非常工程師的方式,帶我們走過一段「解放古老軟體」的奇幻旅程,也提供了理解早期企業級軟體防拷措施的難得案例。
核心觀點 (Key Takeaways)
- 這套 RPG II 編譯器使用平行埠硬體加密狗做軟體保護,但機制其實非常單純:只要回傳固定常數即可。
- 作者逆向找出檢查例行程式後,只用 4 個位元組 就能完全繞過保護。
- 舊時代的企業軟體不僅依賴古老語言(如 RPG),更充滿難以維運的硬體依賴,顯示保存老軟體的重要性與難度。
深入解析
這篇文章的背景其實相當戲劇化:一家會計公司在 2026 年仍靠 Windows 98 + DOS 版本的 RPG II 軟體維持營運,所有功能都被一顆平行埠加密狗綁住。Dmitry 透過完整磁碟映像展開調查,意外挖到的,是一整套 1990 年代的 RPG II 工具鏈與完整會計系統原始碼。
作者很快發現,真正需要加密狗的是 RPG II 編譯器本身,而編譯器還會把同樣的保護邏輯植入所有產生的執行檔裡。這正是加密狗上寫著 "RUNTIME" 的原因。
接著進入本文的技術核心:逆向複製保護例行程式。作者使用 Reko 反組譯工具,找到了一段「只有 0x90 bytes」的可疑平行埠通訊程式碼。
原文中有一句很關鍵:
“Which can only mean that the result of this routine is completely constant!”
這個例行程式不接受任何輸入、不依賴外部狀態,只會和平行埠做固定的讀寫,最後把結果放在 BX 寄存器。也就是,只要我們知道 正確的常數,完全不需要真的與加密狗通訊。
於是破解方式幾乎優雅得不可思議:
- BH 值固定為 0x76(程式碼裡硬編寫)
- BL 只有 256 種可能 → 暴力測試即可
結果 BL = 0x06。於是完整魔術值 BX = 0x7606。
因此,只需用以下 4 個位元組就能取代整段加密狗邏輯:
BB 06 76 MOV BX, 7606h
CB RETF
不只 SEU.EXE,整個編譯器套件裡所有執行檔的保護邏輯都一模一樣——彷彿「橡皮圖章」般地附著在每個程式裡。
筆者心得與啟發
讀完這篇文章,我最大的感觸是:軟體歷史的保存遠比想像中困難。許多商用軟體不是因為程式碼難,而是因為被卡在古老的硬體、語言、作業系統與保護機制中。像這種平行埠加密狗,一旦滅絕,就等於把整套工作流程連帶埋葬。
更有趣的是,這份「企業級」保護機制的單純程度讓人苦笑。我們總以為早年的 copy protection 玄而又玄,但現實可能是:
- 設計者只需要「看起來有保護」
- 使用者理所當然地依賴它
- 幾十年後,反而成為維護成本最高的部分
從工程角度來看,我反而欣賞作者最後那句:
“Software West’s RPG II compiler is now free from the constraint of the parallel port dongle!”
這不只是一次破解,而是一種「數位考古保存行為」。如果未來能公開這套編譯器,對想研究 RPG、AS/400 開發史、甚至早期 copy protection 的人來說,都是珍貴的文物。
這篇文章提醒我,面對老系統時,我們不是在維修,而是在「考古」。能夠把化石級工具重新帶回現代平台運行,本身就是一種浪漫。
