2022年7月27日 星期三

程式碼虛胖暴肥,保護與破解想當年

引文:遊戲開發者Cliffski抱怨現在程式碼誇張膨脹「可能有99%的內容都是垃圾」

哈哈,會抱怨這種事的,恐怕都有點年紀,比方說,我。

對於從 DOS 時代一路走來的程式匠,倒是很能體會那種感覺。想當年,😁,記憶體標配 640K 、沒有網路的刻苦環境,無所謂 middleware, 3rd party library 少見,即使有 open source ,也很難拿到手。總之,幾乎什麼都要自己搞;可以列入考慮的外部資源,僅有 OS, BIOS 和 C library。

進入網路時代,資源逐漸多樣豐富且容易取得,「什麼都要自己搞」變得不切實際也沒有必要。為了迅速鍥入市場,除了核心技術不能假手他人,其餘大都撿現成,有時甚至撿便宜。於是正如引文所述,往往為了微不足道的單一功能,引進一拖拉古多餘部件;倘若仔細盤點,搞不好當真 99% 都沒用處。

使用者在乎記憶和儲存容量的時候,還會想辦法減肥;等到大家都在網路上看直播,隨便一支 TikTok 都比我的主程式有噸位,瘦身變成沒人感激的徒勞,就放它暴肥罷。可能要到那天摩爾定律失靈,記憶儲存不再大幅增長而被各種臃腫物件撐爆,才會有人開始下決心清腸消脹。

倒是因此勾起一絲回憶。當 99% 的程式碼都是垃圾的時候,有件事情就會變得很繁瑣,不太可能全仗人力,就是逆向工程。我自己最後一次搞這檔事,標的是支 DOS 程式,不到 80KB ,雖說以當年標準不算小,卻也是渾身精實,沒半分贅肉。由於最終要出報告列為呈堂證供(見「第一場智財權官司」),必須徹底剖析,前後花上將近一個月的閒餘時間。工具也不能只靠 DOS 內建的 debug 程式,用上反組譯的 Sourcer 和 open source 的 DosBox。後者的作用是,只須稍加修改,就能記錄所有 DOS/BIOS 的中斷呼叫(interrupt call)及其參數、回傳等,對理解程式運作幫助很大。(其實在 DOS 下寫一支常駐程式,可以做到同樣的事,但當時 Windows Vista 都上市了,我當然不想弄一台實體機器灌 DOS)

更早期由學生時代到出社會兩三年,搞的則是比較輕鬆愉快的程式破解,其中多半是遊戲。窮學生沒錢買遊戲,偏又愛玩;有錢同學買了一套原版,就有人起鬨讓我試試,能不能眾樂樂。那年頭的軟體保護還很原始,多半是檢查遊戲磁片上的什麼東西(以壞軌最常見,例如有個技倆好像叫雷射穿孔,就是肉眼看不到的實體缺損)。若以中斷呼叫讀取,破解之道比較簡單,就是寫一支常駐程式來唬它;萬一它竟然自己寫一段程式去讀,就只能進行侵入性療法,找出該段程式,植入機器碼改變其行為。後者雖然一勞永逸,但有其風險與麻煩,比方它另外執行加密或一致性檢查,就得一一處理掉。

其實我並不愛好遊戲,幫同學破解純粹練功。這種事只須抓住要害,不必全盤剖析,頂多兩三個鐘頭搞定。可竟然有人來問我,遊戲中某個關卡要怎麼破😦。拜託,我自己沒在玩哩😒!然而答案也不是沒有, RPG 遊戲通常對話不斷,其中自然有線索,而這些對話,就在程式檔裡頭。把所有文字倒出來,便是現成手冊秘笈,你自個兒參罷。結果人家竟然嫌:這還有什麼意思😬!呿,我管得著嗎😠!

後來自己進入軟體業,智財權保護當然關乎公司營運甚至存亡,不過我對此事悲觀,一直提不起興致。只要有人肯花時間去磨,沒什麼保護無法破解,愈困難鬥志愈高昂哩。針對這點,曾經有學長這麼搞:對程式加密,等於一層防護殼,然後反覆實施三百次,每次金鑰不同,讓破解者無趣到杜姑😴。我說這辦法對我有效,我大概重複個三次就會無聊打退堂鼓,但比我有恆心毅力的大有人在,且觀後效。結果比前一版,大概多撑了六個月😏。

到了網路時代,攻防就完全是另一番局面。自己上了年紀,不再有纏鬥的精神氣力,時間也遠比年輕時寶貴,不值得為小錢傷神。前述打官司那檔事,純屬盛情難卻才破誓出關,發完功透體淋漓,下不為例。而那支程式檔才不到 80KB,對比今日動輒數十上百 MB 的軟體只是零頭。後者恐怕得專門開發一套工具來耙梳篩淘(雖然我敢肯定早就有人這麼做),才能應付這種在垃圾山裡找戒指的活兒。從另一個角度看,這跟我學長三百層保護殼的招數,有異曲同工之妙,而且渾然天成,毋須雕琢哩😆。

 
本文圖片均由估狗加工增艷




 




 

 

沒有留言:

張貼留言