我幾乎用了好幾分鐘來考慮我該不該寫寫這段文字,最後我水平有限的理由終於還是被已經寫好的標題所屈服,所以我並不怕你笑我。
我沒有google過其他資料然後才寫此文的,只因一時興起,錯誤之處請指正。
在過去兩年,我曾寫過4次殼,這裡我把一些經驗寫出來,希望有寫殼的少走彎路。不廢話了,切入主題。
我的第一代殼:
當時我還在某學校練高中2年紀,那時候我就著手寫我的第一個殼,當時我對這方面完全不瞭解,手頭上幾乎只有幾篇介紹pe檔案格式的文章,當時我殼的構架是基於win 32調試機制的,也就是很像現在的arm和encryptpe,不過當時完全不知道有兩個東東。於是呼,在我當時使用的開發工具delphi 7建立一個工程就開始了,名字我想不起來了,似乎現在資料都還儲存在我一台筆記本硬碟裡面,永遠封存起來了。由於當時Code能力也爛到了極點,也就是註定這殼很快會夭折,不怕你笑話,當時我還不知道如何利用類這個東西,所以在資料格式的管理上簡直是原始到了不可言語的地步,當時基於調試api的構架初看起來很好,對code的操作能力很大,我甚至還設計了好多種代碼處理原形,不過正如我前面提到的,不久後,這殼夭折了。失敗原應是因為過於追求介面部分,還有code能力差,到後來發現構架並不是想象中的那麼好。最終此殼只加密成功過一個很小的程式。
總結一下構架方面,並不是說這樣的構架很差,而似乎它還有天生的優點,比如子進程不能直接調試,需要合并進程,對代碼操作能力好。從加殼處理方面來說操作性也很好,因為你可以寫一個標準的loader程式,然後把被加密的程式當作附加資料來處理。缺點是你必須考慮services程式的這個事實,還有就是加密dll是這種構架的天生弱點。
很快,在時代的步伐下,我各方面進步了,至少自我感覺進步了。我決定重新寫一款殼,這殼是我在主動退學後在美麗的家鄉居住的時候想到的。關於退學的事我除了說我退學了之外並不想說此時的具體原因。
我的第二代殼:
由於第一代殼的失敗,我決定花更多時間來搜集資料,但也不至於沒有天理的把自己扔到網頁堆裡,很快我開始動工了,這殼用的構架是基於寄生被加密pe的構架,也就是在原來的pe上添加一個新區段,然後修改入口,都在這裡面完成loader工作,當時我就考慮到vm將會在殼裡有所作為,但我並沒有意識到我特差的代碼能力將使其無所作為,而且當時我還設計了另外一種偽執行模式,是一種簡單高效的假vm執行引擎,但是當我使用大量內聯彙編尚未達到想要的效果的時候,我開始重新考慮My Code能力,很快的,這殼流產了。
失敗原因也是特差的代碼能力,和不夠好的構架,我很高興我有這麼多自由時間來完成這樣無聊而無結果的工作,這又一次告訴我需要提高自己個方面能力。
關於這樣寄生的構架,我並不推薦,初看起來很簡單,你不需要考慮建立一個pe所要考慮的各各方面, 你仍然可以做你所有能做的事情,但是你不得不考慮到如何將代碼完美的寄生到目標裡面去,你也許還會為此寫一個code link engine,你會想讓代碼是多麼的靈活,根據不同的選項產生特定的代碼,似乎聽起來非常的不錯,但是當你進一步為你的殼加入新功能的時候,你會發現代碼維護越來越困難。直到你開始抱怨。
我的第三代殼:
不久後,我開始在一個小城市和家鄉之間來回穿梭,但是即使這樣,我仍然有足夠的時間,於是呼,我開始寫我的第三帶殼。也就是後來的pe123。
前兩次的失敗或多或少讓我學到了不少東西, 這款殼的構架是基於建立PE的,加密時是直接拷貝代碼方式,也就是代碼先在加殼程式裡寫好,然後直接複製到目標程式,開始一切都很好,很快的,我完成了一系列代碼筐架,然後對於那些不夠好的代碼我只能說,因為當時我已開始使用另外一門開發語言c++,所以對於delphi我只能說我在尚未學好它時已經開始放棄使用它,這是一大遺憾,但是當時總總跡象表明,我必須得放棄它。對於c++我還想說一點,我並沒有看多少講這樣那樣的學習教程的書,因為那些書上的和教育局書上的差不多一個樣,除了個別精品之外,全是叫你用你那並不富裕的記憶記這樣那樣的文法,所以我選擇了另外一總學習方式,參考別人代碼,寫自己的代碼,遇到難題google.扯遠了。
pe123我並不以為是一特別失敗的殼,即使他很不成熟,而基於這樣的構架,很明顯是比較有優點的,你可以固定入口,所有代碼你不需要重新串連,重新置放,也就是說你不需要寫一個類似上面提到的link code engine這樣的東西,你可以把代碼寫好,然後直接複製進去用。然後對於加殼方式我並提倡這樣複製粘貼的方式。因為你遲早會發現你同樣會陷入管理代碼的泥潭而無法自拔。
我的第4代殼:
由於後來我除了寫小工具外,幾乎不用delphi了,所以本來不夠用的代碼能力已經無法將這個殼繼續延續下去了,所以我一天夜裡終於還是開啟了vs2005建立了一個名為PeCancer的工程。我的第4個殼開始了。
對於delphi代碼能力的不盡人意再一次提醒我在c++上面再也不能重複那樣的路子,於是整個PeCancer的開發成了我的一個學習過程,他的大部分代碼已經被我寫過第二次,剛開始我的殼採用的是那個什麼什麼b*m*殼的方式的進階版本,也就是擁有一個shell dll,+shell loader的構架,當然也是建立PE,這種構架的好處在於,你將充分享受shell dll為你帶來的代碼維護便利,你不用擔心你的這個函數的代碼會不會放錯位置,這個函數的調用會不會出問題,你還可以充分享受c++強大的調試能力給你帶來的便利,只要你代碼遇到問題,那麼只要你產生了pdb檔案,你可以立刻定位到相映的原代碼上,而且shell和加密程式碼完全分開,這樣你維護代碼將非常輕鬆,後來我將這個構架又更改了一下,改成了shell dll+shell loader dll模式,放棄了shell loader也靠複製粘貼的依賴,更加易於代碼的管理,這樣以來,殼的shell部分也擁有任何c++程式可以擁有的模式,比如debug,release,你可以更容易的調試管理,這是我經曆前幾次調試痛苦之後而產生的想法,因為殼不比其他程式,shell代碼位置肯定是要變動的,也就是說這樣基本不可能原始碼Just-in-Time 偵錯,至少當前來說。但是你可以通過asm+精確的原始碼定位來彌補這個缺陷。
雖然至今我尚未公開過PeCancer的任何版本,但是我想我已經擺脫了加殼技術問題的噩夢,公開他的第一個版本也是遲早問題,我曾經想過開源,因為我沒有太多時間來管理,但是被fly一語驚醒,開源的另一個意思就是放棄。但我不想放棄,因為我已經不想寫我的第5代殼了。
總結一下上面所說,我說用到的構架中,最後一種是我最推薦的。當然我並沒有去調查有沒有其他構架,所以僅推薦而已。
有機會我再寫一篇關於一些現在加殼所流行的技術,來闡述加殼的人是如何千方百計的刁難脫殼者的。