大多數的客戶項目在任務完成以後都會很快的從記憶裏消退,但有些,你一生都不會忘記。git
我要說的這個屬於後者。程序員
在一個至關大的公司裏,公司名我就不說了。那個軟件有一大堆程序,是一個商業系統的核心模塊,由一個、單獨的一個的小夥維護着,這個傢伙不久前被炒了。github
像這樣的事情其實都很正常,一些公司一般會發現他們的一些關鍵性技術自始至終都保存在一我的的頭腦裏,當有事情發生時,就像如今這我的,你一般會經歷一陣痛苦階段去閱讀他留下的東西,以後生活慢慢趨於正常。函數
此次有點不同。加密
這個程序出了點問題,公司派了一個去修復這個問題,等他回來後發現精神有點反常,不是哭就是笑,嘴裏嘟囔着什麼「匹薩調用漢堡而且傳入了包子」。.net
程序員的代碼裏一般體現着本身對幽默的理解以及對‘工做保密’這個詞的認識。咱們都據說過一些難以置信的故事,好比說公司辭退了某個搞技術的傢伙 後,結果被告知如不在48小時內向某個海外帳戶打入多少錢,會計軟件將會自動刪除全部客戶記錄。像這種的小伎倆相對而言還好處理 —— 假設這些傳說的故事大多數都是真的,我仍是很難相信,我歷來沒有在現實生活中遇到過這種事情。cdn
這個傢伙留下來的軟件裏沒有任何的邏輯炸彈或下流的陰謀,編譯很正常,除了有一個bug外,一切都工做的很好。可是,你須要想像一下:程序中的全部 函數、變量名都是以食物命名的。匹薩,西紅柿,,水果,蔬菜,酒,等等,一篇一篇,全是這樣。裏面惟一能讓你立刻知道意義的地方只有 ‘main’函數名和C標準類庫的調用。blog
不信大家看看:github.crmeb.net/u/LXTget
就這樣,我接手了這個費力不討好的爛攤子,努力的把程序恢復到一個可維護的狀態。it
說實話,這是一個極好的加密形式,只有拿到密鑰你才能讓這些「代碼沙拉「變得有意義。一點一點的,我把這些函數名和變量名改爲具備意義的命名,開始很麻煩,以後慢慢的變得容易些。
把已知的函數和源代碼進行恢復要比對未知的代碼進行反向解析容易的多,由於首先你要分清代碼裏哪些是程序,哪些是數據,而放在我前面的這些程序顯然 都是明文,全部這活兒並非不可能完成,或者說是格外的困難,只是這活兒太乏味太無趣了。一旦你發現了某個變量可能應該給個什麼樣有意義的名字,餘下的就 是查找和替換。
另一個問題是,代碼寫的太爛,事實上,這意大利麪條式的代碼比這些毫無心義的符號更讓人困惑,等我把函數名和變量名都改回有意義的名稱後,我開始把一大堆的代碼重寫,讓它們易於理解、效率更高。
我始終沒有弄明白他是否還有一套沒有加密混淆過的代碼,他可使用一些‘混淆’腳本經過替換的方法把原始變量名混淆成這樣。我很難相信一我的會在最初時就把代碼寫成這樣,由於這對他本身也是一個巨大的挑戰,這裏確定有一些高超的技術。
固然,若是你的腦子裏還在想:你不能由於個人變量名沒有什麼意義就把我開除了(或應該招我回來改程序),那你是在妄想,無論這個傢伙的用意是什麼,他的作法十分的錯誤(我很難想象他的前任老闆還會推薦他),無論怎樣,這事兒讓我樂了好幾周。