山寨裏的技術 – 小議“扒”
– 再回首:三十多年過去,彈指一揮間
不知何時,山寨這個名詞火了起來,並形成一種山寨文化,流行起來了。
這裏的山寨當然是指對知名或權威事物的仿冒,多有貶義,主要是對於產品的仿冒,常見但不隻限於電子產品,並發展到所有3C產品領域。但隨著仿冒水平的提高,產品質量也得到改善,使得山寨產品隱隱帶有“物美價廉”的內涵。
生產山寨產品,也是需要有技術支持的,主要就是山寨原始設計 – 這個設計被一個單字動詞描述的活靈活現:扒。
我近日開始回爐古典吉他,回想起四十年前按五線譜“扒”出來指法,其實這個“扒”就是其中的技術成分。我還偷懶,經常是等別人扒出指法來,我再從別人那裏二次“扒”,一點技術含量都沒有。後來有高手可以根據聽到的曲子“扒”出譜子來,這就更是高手了,或者叫高技術,特別是有多樂器合成的曲子,那對我簡直是不敢想象的。
但再怎麽高手,這也不是原創。原創的才是最有價值的,才是推動人類文明進步的基本動力。就像我現在彈吉他還是磕磕絆絆的,聽聽正宗的古典吉他,陳誌的高徒王雅夢小姐表演的《愛的羅曼史變奏》,我連再彈吉他的心情都沒有了 – 我當年也是跟著陳誌的吉他譜學的呀,這人和人的差距咋就那麽大呢啊?
山寨產品有簡單的,有複雜的。如果仿製的原產品沒有做必要的技術保護,仿製是很容易的。下麵我就聊一下我在八、九十年代經曆的“扒”的相關技術經曆。那時還沒有山寨這個說法,華強北也隻是賣東西的,“扒”是“高技術”,官稱“逆向工程” – 當然,真正合法的逆向工程需要符合“淨室原則”,而我這裏說的“扒”則完全是以100%複製為目的的。
這裏說的板,就是指PCB,印刷電路板。但在圈裏都直接稱為“板兒”,英文也就是 board 或 PCB(Printed Circuit Board)。那時的 PCB 的集成度還不高,雙麵板還有,常見的往往是四層、六層以下的,當然八層十層的也有。上麵的器件也往往都是容易買到的,就算大陸買不到也可以去香港買。
題外話:當時有巴統禁運,一些高標的東西限製大陸進口。記得我做聲音分析需要 AD 采樣,人的聽覺頻率上限大約是 20 KHz,所以采樣芯片需要 40 KHz (采樣定理:兩倍的目標信號頻率)。可是巴統禁運,12 位的采樣芯片允許進口的最高速就是 Analog Device 公司的 AD574,采樣上限是 35 KHz,我隻能多買幾個,從中挑選 margin 較高的,可以接近 40 KHz。
當時扒的板往往不是最終產品,隻是板級替代,比如程控交換機的用戶板、PC 上的圖像多媒體板、工控係統上的x線控板,當然也有漢卡、病毒卡等。對這樣的板卡,不用考慮係統,直接把硬件“複製”就可以了。
這個硬件複製過程主要就是把 PCB 的接線邏輯圖給“反”出來,然後就可以生產了。這個“反”圖是個“技術活”,就是把所有線路板上的節點連接情況都要明確,建立起來一個大表格,以確保各點的連接邏輯正確。
有同事為此做了一個發明,據說還申請了專利(我沒有驗證):一個金屬刷子,插在萬用表的一端;另一端就用萬用表的普通探針。選萬用表的測聯通檔,把探針放在一點,然後用金屬刷子一刷,碰到連接時萬用表就會發出聲音,這樣大大地提高了效率(相比於用萬用表自帶的兩個探針測試,每次隻能測兩點之間的連接,而不是一點到一麵的測試)。
這種方法隨著 PCB 的層數增加其難度變得越來越大,到了八層十層以上就很難分析出內部的連接情況了。有時隻靠無損檢測無法確定連接關係,還需要磨板。
測出了連接表,就可以照貓畫虎地複製出 PCB 了。
板上往往還有 ROM 一類的存儲,複製一下也就可以了,不是什麽難點。但後來出了 PAL/GAL 等可編程邏輯陣列芯片。這東西就像一個多進多出的邏輯係統,必須要測出內部的邏輯關係真值表,然後根據這個真值表來複製出邏輯芯片。
最難的是芯片複製。有些複雜的 PAL 無法完全靠邏輯分析出來內部的 fuse 情況,就需要有損的照相來觀看。這可不是普通的照相機可以完成的,是需要直徑超過一米的巨大放大效果的鏡頭。把 PAL 磨開,然後照相。當時好像國內隻有上海可以做。現在 PAL/GAL 都不見了,被 CPLD 等新型邏輯器件取代了。
聲明一下,這些本人都沒有做過,隻是在一旁耳濡目染。不過下麵有關扒軟件的勾當我可是沒少做。
那時很多軟件為了防止盜版,都有各種防盜技術,比如登陸密碼等。但在沒有網絡支持的時代,一個密碼可以到處用。特別是可以在硬盤上安裝軟件後,靠登陸密碼防止盜版也就是防君子不防小人了。
這時,就出現了密鑰,俗稱“加密狗”,或簡稱為狗。加密狗有兩種形式,軟磁盤密鑰(軟狗)和並口密鑰(硬狗,後來有 USB 接口的了,叫 software dongle)。被保護的軟件要想正常運行,作為密鑰的軟盤或並口插件必須存在才可以。
這是一個魔道爭霸的過程。開始,軟件隻是在一開始啟動時有一次檢驗狗是否存在。這時,就可以用跟蹤軟件找到機器碼這個位置,直接跳過去就可以了。還記得 x86 代碼 0xEB 條件轉跳改成 0xE9,就是長跳,就可以“解密”了。
後來軟件開發人員在某些關鍵部位也增加了檢查狗的調用,代碼跟蹤就比較複雜了,因為一步一步地跟著機器碼走太費時間。不過,也不是不可能。這種解密難度與軟件價值往往是不成比例的,估計這與軟件加密開發人員對解密方法的理解有關,也與軟件的性能考慮有關,畢竟經常訪問狗會降低運行效率,特別是軟狗。另外,在軟件中經常訪問狗也會增加軟件開發的維護難度。
那時我對軟件版權的意識不強,甚至覺得這就是弱肉強食,你有本事你就加密,他有本事他就解密。對相關的法律意識很淡漠,也無人管。我的一個朋友就是我們那裏的知識產權辦公室主任,一個在他的辦工桌上插兩麵小紅旗的裝X犯:一麵是五星紅旗,一麵是鐮刀斧頭,交叉著插在桌麵的筆架上。他們是幾個局聯合辦公的,就他一個光杆司令,既沒有權也沒有人。在那裏哪兒有什麽版權的概念?也就是組織配合一下抓那些賣盜版光盤的。
那時在工作之餘,我就喜歡研究 DOS (Diskette Operating System)係統,那是 PC 機上的基本操作係統,什麽軟件都需要在其上運行的。別人玩遊戲,我隻是看熱鬧,然後去改遊戲,比如可以通過駐留的程序控製鍵盤 (interrupt 9/16),降低遊戲的運行速度、增加人的響應時間同時減少機器的響應時間,增加 life 等,減少遊戲的難度。隻是這樣改動之後,遊戲本身也就不吸引人了。其實我對遊戲的熱情在讀研究生時就花光了 – 那時玩的是 PC 上的《警察抓小偷》,和蘋果II上的《十項全能》和《巷戰》。
比如那時時髦的挖金子(digger)遊戲,我可以控製計算機運行的快慢,從而讓人有更多的響應時間。那個遊戲的設計沒有根據絕對時間做控製,隻有相對時間控製,也就是依賴計算機的執行速度。在 286 出來以後,那個遊戲就快得失控了,需要我的“加持”。
隻有一次是有意義的,就是古典推箱子,日本人開發的,日語是Sokoban (倉庫番),150級,必須一級一級地升,不能跳過,每十級獎勵一個美女圖片,是一個動腦筋的智力遊戲 – 這是那時我唯一喜歡玩的遊戲。我們那裏有一個高手,進步最快,打到一百來級的時候發現有一級設計錯誤無法通過,結果我的招數就可以用上了,跳過這級。
當年技術熟練時我可以根據 x86 的機器碼大概看出執行流程,也可以用 debug 工具直接編程機器碼並執行程序。這種能力到了三十幾歲就不行了,當然也與事多心不靜有關。大廠們要求員工 996 到 35 歲退休也是有原因的。我還不到 35 歲時,就發現腦力和體力的下降:複雜的邏輯分析能力和記憶力不如從前了;打籃球時以前覺得可夠到的球這時夠不到了,如果強行伸展,就會被拉傷。
當然,加密解密也是我的一大樂趣。慢慢地有了點小名氣,經常會有外人來找我幫忙,當然也不是白幫的。
曾經做過一個價值數十萬元(或上百萬?)的 EDA 集成電路設計軟件的硬狗解密(記得當時好像是 0.6 微米的工藝技術已經是天花板了,現在已經是 2~3 納米了,大約 16 個摩爾周期之前!),花了一兩個小時就完成了。那個機構要求原硬狗不能離開實驗室,所以我的工作隻能在他們的實驗室進行。解密也隻是為了方便:那個軟件每次需要輸出電路圖時都要連上狗,而他們隻有一隻狗,幾十個人用起來很不方便。給我的要求是把硬狗解密,但要給軟件另外加密,以免流出。於是我在硬狗解密後給他們做了幾個軟狗,再把軟件用軟狗加密。其實就是他們實驗室想省錢,隻買了一個軟件 license,但想要多人一起使用。這個軟件是老外的,比較君子,隻設了一個檢查點,本來也就是防君子的。
那個實驗室的頭做事很地道,在解密過程中一直陪著我,或者說監視著我幹活兒,避免軟件被偷偷拷貝。等我解密成功後,他並不要那個解密軟件,隻是要求我在再次加密後把解密的軟件刪除,確保不會有解密的軟件流出。
這次解密是我自認為最漂亮的一次:解了密,又再加了密,時間也短,還很實用,價值也高。特別是一屋子頂級研究機構的陌生計算機專業人員看著,我就像有金手指一樣,給他們鬆綁。那種內心驕傲的感覺相當的爽 – 我畢竟不是計算機科班出身的,相當於民科一族,學校裏計算機專業課一門也沒有學過,連計算機語言學的都是 Fortran,純數學編程語言。
還做過一個價值幾萬元的酒店門禁係統解密,零零散散持續了數周時間。這個加密既不是軟狗也不是硬狗,而是一個時間狗。產品賣給酒店後,軟件公司提供一個密碼,可以用一個月,到期再續。悲催的是酒店把軟件款付給了來安裝軟件的人員,而那個人卷款走人了,他說因為是軟件開發公司欠他的工資。但軟件開發公司不認,要求酒店再付款才可以給繼續開通。酒店就不幹了,不想付雙份的費用,可這時這套門禁係統已經上線了,不能停,這也是軟件公司敢於和酒店叫板的原因。我就在這時被酒店找來幫忙,倒是也沒有費多大勁,就解了那個時間狗。
不料,過了幾天,酒店又來找,說是在另一個應用點上還有一個時間狗。無奈,我再去給解開。可是幾天後,又出現新的時間狗。這個時間狗設計很有意思,狗叫的時候並不是馬上停止服務,而是不斷預警:三天後就會停止服務。這是軟件公司向酒店催收應付款的一個好方法,而我也必須在限定的時間內解決問題。就這樣,來來回回好像有四五次,酒店就不再找我了,估計是都解幹淨了。因為軟件安裝在專用係統的硬盤上,我每次解密都要到酒店去,來來回回耗費了我不少時間,沒完沒了的,得不償失。
這次解密也是我感覺最鬧心的一次。中國人做的加密就是考慮得很嚴密。
我也碰到過解不開的加密技術。記得那是一款硬狗,而那隻狗裏不僅有防盜邏輯,還有軟件需要的數據。從狗中讀出來數據每次不一樣,按時間隨機的,用於填補應用軟件裏的需要的數據。這招比較高,我沒有耐心去把狗裏的數據都分析出來。其實,這時也就是成本問題,硬解這樣的加密狗相當於用 brutal force 來解 RSA 算法,意義不大了。但我仔細考慮一下,發現這種加密的成本比較高,因為軟件要把部分數據放到狗裏邊,這樣開發的連帶關係是比較麻煩的。
那時做解密也是有點手癢癢,看到加密的軟件就有去解密的衝動,就像玩智力遊戲一樣,去理解加密人員的思路,反過來考慮該如何加密更安全。
經過大量的解密實踐,我最後發現了一個通用解密方法,我管這種方法叫【內存鎖定】。那時的 PC 都是 DOS 係統,實模式的,隻有 640K 的內存,是一個flat memory,沒有頁麵控製。我的【內存鎖定】法是先將一個小的駐留程序(我起名叫 weasel)放到內存高端處,然後運行待解密軟件(帶狗的)。等軟件運行通過了狗驗證之後,也就是拔出狗後軟件也是可以正常運行時,就激活我事先埋伏的小駐留程序,把整個內存給存到磁盤上,也就是 take a snapshot,然後按照 EXEC 的文件格式重新給這個 snapshot 加一個 EXEC 文件頭,就可以把 CS/DS/ES 段址在運行時複位了。
用這種方法,根本不用跟蹤軟件,整個過程可以自動處理。而且,我沒有發現市場上有人使用這樣的技術。這簡直就是一款通用的解密軟件。
一次在一個軟件展銷會上,一個加密軟件商不信我可以解開他的軟件,我現場試驗,在幾分鍾內就把用他的加密軟件加密的 PC-tools 給解開了,唯一不同的是軟件在磁盤中的大小變大了,從100 多 KB 變成 600 多 KB。但我後來又改進了,在文件上增加了一個自解壓頭,一般可以把這類程序文件壓縮到約1/10 之內(因為多數內存都是空白的),像這種情況,也就是 60 多 KB。
也是那次展覽會上,碰到一個同學。我們倆互相看著眼熟,都知道一定是同學,但都不記得是哪裏的同學。於是,我說,咱倆誰都別問,就坐在這兒互相相麵,誰能先叫出對方的名字,對方就負責午飯請客了。我中學換了好幾個,這時已經高中畢業十多年了,真有點難。到了飯時,我倆大眼瞪小眼,還是認不出來,就是越看越覺得熟。最後我說算了,我自曝一下幾個中學吧,看看交集。結果發現是上大學前高二時最後一年的同學,而且是前後桌的,他極為“憤慨”地說,我記不住你也就算了,可我是你的班長,怎麽你也記不住?
嘿嘿,我的記憶力都放到有趣的技術上了。比如那時閑著沒事兒,給計算機的硬盤加密,改了關鍵目錄 FAT 表的鏈接,每次需要訪問那個目錄時都要用 debug 現改那個 FAT 表,一個 32 位的地址。不然隻能看到自卷的目錄,也就是這個目錄的子目錄就是本目錄,無限循環,DIR 列目錄就會刷屏。這種目錄多了、時間長了就很難記住,那可真是閑的。
玩到這個時候,我也開始慢慢對解密的興趣索然了。而且,後來 Windows 在市場上也開始起步了,在保護模式下我的許多招式也都不靈了,有沒有硬件 ICE 支持,跟蹤軟件很累。特別是還需要養家糊口,得開始掙錢了,幹事兒也不能全憑興趣,於是就不太玩解密了。
隻有做了解密,才知道如何加密更安全。
在總結了各種解密經驗後,我自己做的加密係統有幾個關鍵,是在其他加密軟件中沒有發現的。
其一是反跟蹤。用過 debug 的開發人員都知道,stepping (也叫 single step,既單步中斷,PC上是用 interrupt 3,代碼 0xCC,來修改下一條指令來實現的)是跟蹤軟件最笨,但也是最難防的招數。用遠端設置斷點(break point)雖然快,但無法真正跟蹤到執行邏輯,隻能做大致的流程篩選。
為了反跟蹤,我利用了 x86 的指令 pipeline cache 技術。這個 cache 不是後來 CPU 的 L1/L2 instruction/data 大 cache,而是 CPU 在 load 指令後進行解碼的 pipleline cache。其特點是,如果用 stepping 跟蹤,這些 pipeline 的每條指令都會被 invalidate,就是無效後重新 load,這樣的執行路徑與會與沒有 stepping 跟蹤的路徑不同。用這種方法就會徹底把跟蹤人的思路搞亂,不知道程序是如何執行的,一會兒就會跟到了死胡同。其實,就連我自己知道原理,跟蹤起來也是很無力,因為這相當於步步陷阱,一不小心就誤入歧途了。
其二是反駐留。防止高端內存的 interrupt 20/21/25/26 等 DOS 調用,避免係統被控製。這個是防止有像我上麵提到的【內存鎖定】之類的招數,雖然我沒有見過別人有。
其三是控時。檢查 interrupt 8 計數在我的程序執行之間的變化,以確定是否被跟蹤。interrupt 8 是一個時鍾中斷,每秒會被激活 18.2 次。這個和近年國內高速上測超速是同一個道理:在兩個檢查點之間,如果用時太短了,那就一定是超速了。我這裏的用法是反向的,就是如果執行我的代碼超過了兩個 ticks,說明有人在跟蹤,就跳到無效路徑上去誤導解密者。
另外,係統軟件開發人員都知道,goto 語句是最不好的,破壞了軟件的層級結構。但是,goto 語句對防解密是最好的,可以把跟蹤者的思路搞亂。
在解密中我就發現,反跟蹤最有效的辦法不是發現被跟蹤後就宕機,而是進行誤導,讓解密者無法判斷是否是在正路上,直到太晚了以後,也無法知道是在哪裏迷路的。
在製造軟狗時,用超大扇區(8 KB)格式化軟盤(3.5” 和 5.25” 的軟盤都一樣)的第 4 道(track),這時可以在這個道的首尾相連縫隙處產生一個四個字節的隨機數。我把這四個字節的隨機數讀出來,經變換後寫到磁盤的引導扇區的引導記錄後麵的空白處。我的解碼程序就去讀軟盤的第 4 道的隨機數和寫到引導扇區裏變換後的結果,用來判斷是不是合法的磁盤。這種方法很可靠,也很安全,軟狗很難複製,因為那個四字節數是隨機生成的,而且不可控製。
我後來自己做的小產品都用了這種加密來保護,防止拷貝。這種軟狗的成本幾乎是零,軟件可以就裝在那軟盤裏麵,也很方便,還穩定可靠。
遺憾的是,那個 pipeline cache 的技術在 586 (奔騰)出現後不靈了。估計是 586 的體係結構在指令內存空間加上了隻讀限製,使得我在運行過程中修改指令的方法失效了,害得我隻能在我的加密軟件中取消了這種反跟蹤。當時已經沒有多大興趣搞加密解密了,所以也就沒有興趣具體去研究關於 586 的解決方案。特別是軟件都開始向 Windows 轉移,就更沒有 incentive 去做了。x86 的體係結構很複雜,比我後來涉及到的 RISC 芯片如 MIPS/ARM/PPC 等複雜多了。不過,估計花些時間也許是可以改進的。
經過一番折騰,這時我已經意識到不按規矩出牌的軟件技術後患無窮了。比如那時有本時髦的技術資料,《DOS未公開的秘密》,裏麵記錄了不少各種後門的應用。但是這些未公開的東西就是潛在的麻煩,將來可能會改變。Lessons learned。
吹個小牛:那時把 DOS 玩透了,看計算機就像進到自己家一樣,看程序運行就會想到其底層的執行方式。一次,一位硬件哥們兒的 PCB 設計硬盤被病毒給黑了,大半年的工作沒有軟盤備份,而項目不允許拖延。他的頭求我幫助恢複數據,我開始也心裏沒數,誰知道病毒幹了什麽壞事,也許把他的數據都給抹除了呢?但他運氣不錯,我在那硬盤的 FAT 備份分區表裏找到了幾個孤鏈,可以手動恢複,其中有一個鏈居然就是他的最新 PCB 數據文件,而且數據居然完整,把他們高興壞了,他們的軍工項目不至於拖期了,當晚就請我大搓一頓,除了白酒,還有那個頭剛剛從美國帶回來的袋裝葡萄酒,一袋好像有七八斤,喝得我酩酊大醉。
也是在那個晚上,我第一次可以和別人在酒後胡咧咧,說起了我那悲催的童年(見《童年的記憶》)。
盜版一般隻是在通用計算機上才可以。在專用的工業計算機上,複雜的軟件往往無法直接盜用其機器碼的程序的,除非是你可以100%複製了整個硬件軟件係統,但這時你又無法升級、無法維護,連 bug 都被拷貝過來了。
這裏說個笑話:當年菊花起步的時候盜版思科,就是把 bug 也一起盜走了,成為罪證。
真扒軟件是一個逆向工程,雖然不是“淨室技術”下的合法逆向工程,但也是一個不小的工程。
有些工具可以使用,記得當年有一個叫 SoftICE 的東西,可以把機器碼反成 C 語言。當然,反出來的 C 代碼是很難讀的,和機器碼也差不多,但邏輯基本正確,可以在此基礎上打磨加工,形成真正的源代碼。
其實,這個工作和 RSA 求逆算法差不多,隻是算法複雜度的非對稱性沒有那麽高,結果的要求也不是必須 100% 的一致。
係統軟件的正向開發大體是這樣的:
1)有經驗的 architect 可以按軟件邏輯分組,把一個大項目切割成幾個小項目。其實,現實中因為公司政治的存在,這種切分往往體現的是公司的結構,結果軟件的結構會跟著公司的結構走,而不是按著合理的設計走。所以往往如果公司的結構不合理,或和應用邏輯不匹配,結果就是出產的軟件結構不合理,最後甚至成為垃圾。
2)每個子項目再細化,分到人頭上。各子項目都要有至少一個大腕來進行總控把關。各種關鍵的應用邏輯都在這裏體現。設計文檔就是要在這一步生成,最後匯總到總體文檔中。這裏也是軟件的核心價值所在,要“扒”出來的也是這裏的應用邏輯。近十幾年時髦 lean production,講究 agile 軟件開發,我一直對之嗤之以鼻,因為我總會想到當年的“抓革命,促生產”時搞出來的“邊設計、邊施工”的土八路招數。我的組裏從來不搞 agile,公司要求也不幹。我現在好像可以把 agile 和左左們聯係起來。
3)按開發總管 VP 的要求安排,開發出來的各子項目按時開始集成,啟動集成測試。
4)進入到 release 的 schedule,開始係統測試。當bug少到一定程度後,就可以release了。release後的軟件就進入維護期了,branch 出來,另行維護。
軟件逆向工程也是差不多就是把這個軟件劃分給“扒”出來。
1)先把機器碼反成高級語言,比如 C 語言。這就是一堆雜亂無章的符號,所有的 label 標簽都不過是字母數字。
2)根據團隊組織結構,把這些垃圾般的代碼劃分到各個開發人員處。這些人讀代碼並理解其目的,按每個子函數 function 的意義和目的,為其命名。我有一個老友,多年的係統建構師,他有一句名言,我深以為是:software development is all about naming – 軟件開發的核心就是命名。
3)對於不理解的 function,交由大家討論,互相切磋。實在解決不了,留待以後,當了解的多了就可能有解了。這裏有一句圍棋格言:棋盤很大,不好走的地方先放一放,後麵就會有變化的。
4)當絕大多數的 function 都有了合適的名字的時候,就可以開始係統集成了。編譯出來的係統進行調試,驗證,修改,回到了正向開發的 release 步驟中。
這時,軟件也就真的“扒”完了。這些“扒”的開發人員也就學習到了軟件的設計原理,為什麽這樣做,等等。這之後,也可以逆向地完成設計文檔了。“扒”到了這一步,也是“扒”界的天花板了。但和玩真的還是不一樣,是沒有原發性、開創性的,隻是高級拷貝。
鑒於眾所周知的 sensitivity,我就不舉例說明了。但真正合法的逆向工程是另一種形式的,稱為淨室設計技術:開發人員需要分成兩組,A 組負責研究目標仿製係統,根據其運行方式寫出設計規範,他們隻能看其硬件係統運行狀況;B 組人員不許接觸目標仿製係統,隻能根據 A 組人員撰寫的設計文檔,去實現設計 – 這個實現過程 A 組人員不允許參加。嗯,這種技術還有個名字,叫【中國牆】(Chinese wall technique),不是互聯網的長城哈,雖然其名字也是來源於長城的,但早在三十年代就在華爾街的金融係統上使用了,用以分割券商和投行之間的信息,後來計算機係統開發逆向工程也借用了這個定義。
最著名的軟件開發淨室設計技術成果就是現在幾乎所有基於 PC 結構的計算機都在使用的 Phoenix BIOS (Basic Input and Output System,PC 機上的必備底層啟動軟件,前麵提到的多個 interrupt,除了DOS 的軟中斷 20/21/25/26 外,大多數都是由這個 BIOS 提供的處理功能),是 Phoenix 根據逆向研究 IBM 的PC BIOS,通過淨室技術開發實現的。那時 IBM 開放了其 PC 結構,但總是打官司說別人侵權了他們的軟件,主要就是那個 BIOS,於是 Phoenix BIOS 被大多數 PC 兼容機廠商選用,現在 IBM 的 BIOS 已經很罕見了,而 Phoenix 的 BIOS 到處都是。另外,IBM 采用了微軟的 DOS,稱為 MS-DOS,作為其 PC 的操作係統,又犯了一個大錯,造就了另一個比自己還壯大的黑巨人。
記得上大學時流行勵誌講座。當年好像是聽李燕傑還是曲嘯講的,IBM 的 CEO 是多麽牛逼,手指剛剛夾起一隻古巴雪茄來,旁邊馬上會湊過來好幾個打火機獻媚。其實,那時的 IBM 已經犯下了這兩個錯誤,後來導致這個藍色巨人早早地就把自己獨創的 PC 業務賣給了聯想,徹底剝離出來了。當然,IBM 的 CEO 也沒有那麽大的範兒,隻是我們那時還沒有接觸西方世界,被李燕傑們忽悠得一愣一愣的。當然,也許他們就是真的這樣認為的也說不定。關於有關的笑話,可以看閻潤濤在文學城上發表的《曲嘯在美國遭遇滑鐵盧紀實》 – 閻潤濤已經在三年前故於新冠病毒,他的故事很精彩。
回過頭來總結一下。從技術角度看,“扒”板就是累傻小子(或傻妞)的體力活兒;盜版解密就是抖小機靈的小偷勾當;加密防盜就是小區保安的辛苦活兒,不過信息技術複製幾乎沒有成本,所以這是一個機器人保安的活兒;逆向工程是江洋大盜的活兒,不僅有法律風險,還有經濟風險和技術風險,但也很接近於真正的產品開發了。
我對盜版的認識也是逐步建立起來的。從開始的不在乎、無感,甚至某種程度的認同,到後來遠離盜版,是一個緩慢的過程。
記得當初有一位“扒”防病毒卡的哥們兒有一句“名言”:“打擊假冒偽劣”,其實假冒沒有什麽危害,偽劣才是真正侵害消費者的。所以他理直氣壯地賣他的廉價盜版防病毒卡,說中國的國情就是這樣,正版的賣高價,有錢人買,有服務;盜版的賣低價,窮人買。這樣可以保證人人平等。這好像是印度仿藥的理論基礎。我懷疑如微軟那些大公司很少在中國打知識產權官司可能也有這一層的考慮。
我當時也稀裏糊塗地基本讚同他的觀點。
當年還有一個說法,就是在國內的盜版軟件成為了一種市場營銷技巧。比如 MS-DOS,有哪一位花過錢買版權?但這是一個消費習慣的培養,接著 MS-Windows/Office 也是差不多,但到了一定程度,真正官方使用人員必須用正版的了,不然會有不可預知的麻煩,包括法律上的麻煩和技術上的麻煩。而沒有盜版鋪墊的軟件則缺少大眾支持,當該花錢選購軟件產品時人們也會首先考慮自己熟知的軟件,而不會選擇那些生疏的軟件。記得以前看過一種說法,就是用戶的操作習慣和對軟件的交互界麵的熟悉程度是該軟件的市場資源,是很有價值的東西。
這個觀點在某種程度上有一定道理。西方國家也是對在高校裏使用的各種軟件用低價或免費的方式推廣,除了支持教育以外,也有培養未來潛在客戶的意圖。那些高校畢業生到了工作市場中就會把他們的習慣和喜好也帶入工作場景,成為那些有鋪墊軟件的支持者、愛好者,最後成為采購者。
但無節製的盜版對知識產權的危害其實是相當大的。最直接的危害就是讓原創者缺少了開發產品的動力,特別是對中小軟件企業。
比如,現在國內遊戲公司有一個共識,那就是絕對不能做麵向國內的單機遊戲產品。因為無論你這款遊戲口碑有多好,最後一定都會撲街在盜版上。在沒有網絡進行中央版權控製的情況下,硬件還好說點,盜版可以追蹤;軟件盜版的追蹤成本奇高,懲罰手段寥寥,最後開發公司/人員隻能選擇放棄。
更有甚者,打民族牌。就在六年前,一款國產的單機遊戲《ICEY》上架沒有幾天就被解密,並被發到網上(現在有了網絡,盜版發行比正版要高效得多),最終迫於輿論壓力,解密公司(對,不是個人行為)在網絡上下架了盜版,並發表了一篇道歉信:“對不起,我們不該解破國產遊戲” – 言外之意,解破外國的就可以了。
是的,國內各大遊戲論壇一個約定俗成的規則就是,國產遊戲不能破解,國外隨便破解。這叫做“支持國貨”。
對知識產權的保護,必須是國家法律的強行貫徹。靠道德約束和技術控製隻能是治標不治本。我自覺道德修煉得不錯了,但不僅以前有過這種盜版或協助盜版的行為,而且之後也不是那麽幹淨。人是不可靠的,哪裏也沒有聖人。
我雖然近三十年沒有進行過加密解密的相關活動,但最接近的一次是十年前,差一點就重操舊業了。那是在我開發係統時看到了一個合作商把他們的軟件進行了 cipher 處理,就是把源代碼的所有有意義的名字都替換成一些無意義的標識,並刪去格式控製字符,混成一團,鼻子連眼睛的。這種軟件可以正常編譯使用,但無法讀代碼去理解其設計原理。
我心想我們合作幹事兒,你們還這樣保護,就產生了 decipher 的衝動。這段被 cipher 的代碼是關於一個有限自動機上的一個帶通濾波器,是這個公司的 bread and butter,但也碰巧是我研究生學習時的專業內容,屬於信號處理範疇。這樣也讓我有點好奇去看看這個濾波器是怎麽設計的,到底有什麽值得保護的高招兒。
其實,這就是我在“軟件逆向工程”裏介紹的第(1)步完成後的狀態,而我很想做第(2)步,雖然沒有什麽經濟動機,可我還是技癢難耐,或者說是“惡習難改”啊。
這個 decipher 的工作其實要比我以前做的逆向工程容易多了,因為除了是我熟悉的應用領域,這段代碼還有一組 API,就是沒有 cipher 的外連函數調用。從這裏出發,我很快就可以一層一層地挖了下去。但真正下手試一下,發現很快就沒有了興趣 – 這段代碼量很大,全部 decipher 要花不少時間。特別是以前那種熱情沒有了,年紀大了?版權意識強了?incentive 不足?反正沒有了動力,隨後就把這個事兒拋在腦後了。
我終於沒有再次犯戒,謝天謝地,洗洗睡吧。希望耶穌和佛祖都原諒我。最後,再憋出兩句歪詩以抒發曾經的荒唐帶來的竊悅,以及遠離了荒唐後的一身輕鬆吧:
加鎖解密爽,高山流水長;
逆向誤工程,正道是滄桑。
說起來還要感謝盜版,我們這一代無不是從盜版碟開始窺探和了解外麵的世界的。
把一篇專業性很強的文章寫得絲絲入扣,外行也讀得下去,還讓人啞然失笑,點讚。