內 容 簡 介
本書是由知名安全機構Immunity Inc的資深黑帽Justin Seitz先生主筆撰寫的一本關於程式語言Python如何被廣泛套用於黑客與逆向工程領域的書籍。老牌黑客,同時也是Immunity Inc的創始人兼首席技術執行官(CTO)Dave Aitel為本書擔任了技術編輯一職。本書的絕大部分篇幅著眼於黑客技術領域中的兩大經久不衰的話題:逆向工程與漏洞挖掘,並向讀者呈現了幾乎每個逆向工程師或安全研究人員在日常工作中所面臨的各種場景,其中包括:如何設計與構建自己的調試工具,如何自動化實現煩瑣的逆向分析任務,如何設計與構建自己的Fuzzing工具,如何利用fuzzing測試來找出存在於軟體產品中的安全漏洞,一些小技巧諸如鉤子與注入技術的套用,以及對一些主流Python安全工具如PyDbg、Immunity Debugger、Sulley、IDAPython、PyEmu等的深入介紹。作者藉助於如今黑客社區中備受青睞的程式語言Python引領讀者構建出精悍的腳本程式來一一應對上述這些問題。出現在本書中的相當一部分Python代碼實例借鑑或直接來源於一些優秀的開源安全項目,諸如Pedram Amini的Paimei,由此讀者可以領略到安全研究者們是如何將黑客藝術與工程技術優雅融合來解決那些棘手問題的。
本書適合熱衷於黑客技術,特別是與逆向工程與漏洞挖掘領域相關的讀者,以及所有對Python編程感興趣的讀者閱讀與參考。
推 薦 序
Python是一款非常流行的腳本程式語言。特別是在黑客圈子裡,你不會Python就幾乎無法與國外的那些大牛們溝通。這一點我在2008年的XCon,以及2009年的idefense高級逆向工程師培訓中感觸頗深。前一次是因為我落伍,幾乎還不怎么會Python,而後一次……記得當時我、海平和Michael Ligh(他最近出版的Malware Analyst's cookbook and DVD: Tools and Techniques for Fighting malicious Code)一書在Amazon上得了7顆五星!)討論一些惡意軟體分析技術時經常會用到Python,從Immunity Debugger的PyCommand、IDA的IDAPython到純用Python編寫的Volatility工具(這是一款記憶體分析工具,用於發現rootkit之類的惡意軟體)。Python幾乎無處不在!我也嘗試過對Volatility進行了一些改進,在電子工業出版社舉辦的“線上安全”Open Party上海站活動中,我以《利用記憶體分析的方法快速分析惡意軟體》為題進行了演講。
遺憾的是,之前市面上還沒有一本關於如何利用黑客工具中提供的Python(由於必須使用許多黑客工具中提供的庫函式,所以這時你更像在用一種Python的方言編程)的書籍。故而,在進行相關編程時,我們總是要穿行於各種文檔、資料之中,箇中甘苦只自知。
本書的出版滿足了這方面的需求,它會是我手頭常備的一本書,啊不!是兩本,一本備用,另一本因為經常翻看用不了多久就肯定會破爛不堪。
說到這本書的好處也許還不僅於此,它不僅是一本Python黑客編程方面的極佳參考書,同時也是一本軟體調試和漏洞發掘方面很好的入門教材。這本書的作者從調試器的底層工作原理講起,一路帶你領略了Python在調試器、鉤子、代碼注入、fuzzing、反彙編器和模擬器中的套用,涵蓋了軟體調試和漏洞發掘中的各個方面,使你在循序漸進中了解這一研究領域目前最新研究成果的大略。
本書譯者的翻譯也很到位。不客氣地說,不少好書是被糟糕的翻譯耽誤掉的。比如我在讀大學時的一本中文版的參考書,我看了三遍沒明白是怎么回事,後來想起老師推薦時用的是英文版,於是試著去圖書館借了本英文版,結果看一遍就明白了。不過這本書顯然不屬於此例。譯者丁贇卿本來就是從事這一領域研究的,對原文意思的理解非常到位,中文用詞也十分貼切。特別是這本書的英文版中原本是存在一些錯誤的(包括一些代碼),譯者在中文版中竟然已經一一予以糾正了,從這一點上也可以看出譯者在翻譯過程中的認真細緻。
我已經囉囉嗦嗦地講了不少了,你還在等什麼?還不快去賬台付錢?
崔孝晨
2010.12.16於Hannibal from Team509
譯 者 序
早在逆向工程這一行當如今日一般具備諸多的工程要義之前,我們更多地使用“Crack”這一富有獨立精神與草莽氣息的詞,來指代那些早期的為了反抗商業軟體文化所固有的封閉特性與壟斷本質而實施的破解行為。早期的Cracker們並不像如今的逆向工程師一般有福,有著大量強大豐富的自動化分析工具與成熟的方法論,然而在這些行業先行者身上所體現出的精神與文化值得我們學習。
Cracker中的開山鼻祖+ORC便是其中一位身兼工程師與哲學家氣質理念的傳奇人物,由其撰寫的18篇《How to crack》作為最早的破解布道書廣為流傳,除了純粹的技術內容外,其中不乏充滿靈性的隱喻與哲學理念。在其筆下,令人望而生畏的反編譯代碼被喻為“代碼叢林”(Code wood),而有幸踏入這塊領地的Cracker們則有如苦行於山澗叢林的狩獵者,他們沿著目標所留下的蛛絲馬跡苦苦追尋,在堅忍之中等待著正面相遇的那一刻因緣際會。然而完滿福德與美好因緣並不會輕易眷顧身帶凡夫之氣的新手,在他們求得般若之前,也許免不了輪迴於一次次觸破水月鏡花之後的悲喜,迷失於代碼叢林時的自我懷疑與望眼欲穿,以及柳暗花明後的唏噓短嘆。Crack的過程對於那些Old School(守舊派)來說更像是一次精神修行,幫助你在這旅途中發現自我,找尋一個更好的自我。+ORC在其撰寫的教程中不止一次地提及修行的Cracker在Crack之時,不應忘記破解之禪(Zen of Crack)。
也許任何一門迷人醉心的文化或者技藝都逃不過在商業洪流磨礪下重建秩序的宿命,就像朋克文化與搖滾樂一樣。隨著各種黑帽,灰帽會議召開,越來越多的安全愛好者與黑客從地下浮出,試圖在這個利益驅動的行業生態中尋求成功。於是在這個角色分工逐漸明細的行業中,黑帽們開發漏洞利用(exploit)與白帽們做應急回響的周期呈現交替縮短的態勢。對於各個黑帽組織與安全機構的領導者而言,將一群天賦過人,卻往往又性格迥異,而且成本不菲的安全工程師黏合到一起,在他們的創造性與工程可控性之間找到平衡點,成了他們需要解決的首要問題。誰能更好地處理這個問題,往往就能在這個分秒必爭的博弈局面中搶得先機。
Python語言似乎在這一衍變趨勢與安全技術社區的共同訴求中成為了潮流方向,這一同時具備腳本語言簡單、快捷與開發大型項目所需的嚴謹工程特性的精靈成為了眾多黑客之間的揉合劑。關於Python社區中有一句廣為流傳的口號“生命短暫,請用Python”,在Python身上所體現的理念與當今黑客與逆向工程師們所期待的不謀而合。這也許可以幫我們解釋為何眾多優秀的安全項目與黑客工具選擇Python的原因。比如,目前在逆向工程行業口碑甚佳的“白眉”便是一個使用純Python實現的項目,白眉的作者同時也是業界的大牛Pedram Amini向來對Python偏愛有佳。另一款值得稱道的調試器工具Immunity Debugger則是知名安全機構Immunity Inc的作品,來自Immunity的黑客們基於Python強大的底層操作能力與工程特性在繁雜瑣細的作業系統底層與上層套用之間抽象出一層API。從中我們可以領略到Immunity Inc的領導者,老牌黑客Dave Aitel在設計安全產品與協同眾多安全研究者方面的智慧與卓越策略。這些非常值得安全技術研究與商業化發展不盡人意的國內機構借鑑與學習。
在本書的翻譯過程中,我調試了書中所涉及的代碼,發現了原書的一些問題,給Justin先生髮了E-mail,並得到了Justin先生的確認。
感謝team 509的Hannibal為本書擔任審校一職,這是我完成翻譯工作的信心來源。
感謝我的朋友趙文凱、宋超以及趙超的慷慨幫助。
感謝博文出版社的畢寧老師對於我初次翻譯所犯錯誤的寬容與理解!
丁贇卿
2011年2月於上海
前 言
“搞定了嗎?”,這可能是在Immunity公司出現頻率最高的一句話了。你也許會在類似以下的場景中聽到這樣的發問:“我正要給Immunity Debugger開發一個新的ELF載入器”,片刻停頓之後,“搞定了嗎?”或者,“我剛發現了IE瀏覽器的一個Bug!”又一片刻的沉寂之後,“那個漏洞利用程式搞定了嗎?”在日常的安全項目中我們幾乎無時無刻地須要創建或者改寫自己的安全工具,並在這些頻繁的活動中始終保持高速的開發節奏,這使得Python逐漸成為了這個舞台上的明星。你可以在下一個安全項目中選擇Python作為自己的開發工具,也許你將會用它來創建一個特殊的反編譯器或者開發一個完整的調試器。
當我走進位於南邁阿密海灘的Ace Hardware(美國的一家連鎖五金店),沿著擺放著螺絲刀的通道走過時,常常會感到目眩。你會看到接近50多種不同規格的螺絲刀以整齊的順序陳列在貨架上。每一種規格的螺絲刀都與緊鄰的螺絲刀有著微小卻又十分重要的區別。我不是一個合格的修理能手,因此無法準確地說出每一種螺絲刀最為理想的使用場合,但是我很確信類似的情況同樣適用於我們的安全工具軟體。尤其是當你在對Web類型或者其他類型的高度定製化的應用程式進行安全審計時,你會發現每一次的審計任務都會需要一把特殊的“螺絲刀”來解決問題。要知道能夠及時地拼湊出一些類似SQL API函式鉤子之類的安全小工具已經不止一次地拯救了Immunity的工作團隊。當然這些工具並不僅僅適用於安全審計任務,一旦你能夠使用鉤子函式對SQL API進行攔截,你就可以輕易地編寫出一個工具用於實時檢測可疑的異常SQL查詢,並及時向你的客戶公司提供修複方案,以抵禦那些來自頑固黑客們的攻擊。
眾所周知,要讓你的每一個安全研究人員真正成為團隊的一部分是一件棘手的事情。很多安全研究人員無論在面對何種類型的問題時,都懷揣著白手起家式的過度熱情,企圖將需要藉助的工具庫完全重寫。比如說Immunity發現了某個SSL Daemon的一個安全漏洞,接下來很有可能發生的一件事就是,你突然發現你的某個安全研究人員居然正在試圖從頭開始編寫一個SSL客戶端。而他們對此通常給出的解釋是“我能找到的SSL庫都醜陋不堪”。
你需要盡力避免這種情況發生。事實情況並不是現有的SSL庫醜陋不堪——它只是沒有按照某個安全研究人員的特別偏好風格來設計而已。而我們真正需要做的是能夠深入分析大量的現有代碼,快速地發現問題所在,並對其進行修改以適應自身所需,這才是及時地搭建出一個可用的SSL庫,並用其開發出一個尚處於保鮮期內的漏洞利用程式的關鍵。而要做到這一點,你需要使你的安全研究員們能夠像一個真正的團隊一樣去工作。一個熟練掌握了Python的安全研究人員就有了一個強大的武器,也許就像那些掌握了Ruby的安全研究人員一樣。然而Python真正的與眾不同之處顯現在那些Python狂熱分子們協同工作時,他們將猶如一個高速運轉的超個體①一樣戰鬥力驚人。正如你家廚房中的螞蟻大軍一樣,當它們的數量足夠組成一隻大烏賊時,要殺死它們將比殺死一隻烏賊棘手得多。而這正是本書極力告訴你的一個事實。
你也許已經為自己想做的事找到了一些工具。你也許會問:“我已經有了一套Visual Studio,裡面附帶了一個調試器,為什麼還要去編寫一個供自己專用的調試器。”或者“WinDbg不是有一個外掛程式接口了嗎?”答案是肯定的。WinDbg的確提供了外掛程式接口,你可以通過那些API慢慢地拼湊出一些有用的東西。直到某一天你很可能又會說:“heck,如果我能和5000個WinDbg使用者互聯該有多好啊,這樣我們就可以互通各自的調試結果了”。如果你從一開始就選擇了Python,你只要寫 100 行左右的代碼就可以構建一個XML-RPC客戶端與服務端,接下來整個團隊可以同步地進行工作並使每個人及時地享有他人的成果和信息。
黑客絕不等同於逆向工程——你的目標並不是還原出整個應用程式的源碼。你的目標是對軟體系統獲得比系統開發者自身更加深入的理解。一旦你能做到這一點,無論目標以何種形式出現,你將最終成功地滲透它,獲得炙手可熱的漏洞利用(exploit)。這也意味著你需要成為可視化、遠程同步、圖論、線性方程求解、靜態分析技術以及其他很多方面的專家。因此,Immunity決定將這些都標準化實現在Python平台上,這樣一旦我們編寫了一個圖論算法,這個算法將在我們所有的工具中通用。
在第6章中,Justin向你演示了如何使用一個鉤子竊取Firefox瀏覽器中輸入的用戶名與密碼。這正是一個惡意軟體作者所做的事——從之前的一些相關報導中可以看出,惡意軟體作者通常使用一些更為高級語言來編寫此類程式。然而你同樣可以使用Python在15分鐘內編寫出一個樣例程式,用於向你的開發人員演示,讓他們明白他們對自己的產品所做的安全假設並不成立。現在的一些軟體公司出於他們所聲稱的安全考慮,在保護軟體內部數據方面的投資花費不菲。而實際上他們所做的往往只是實現了一些著作權保護和數字著作權管理機制而已。
這正是本書試圖教你的東西:快速創建安全工具的能力。你應當能夠藉助這種能力為你個人或者整個團隊帶來成功。而這也是安全工具開發的未來:快速實現、快速修改,以及快速互聯。我想,最後你唯一剩下的問題也許就是:“搞定了嗎?”
Immunity Ine的創始人兼CTO Dave Aitel
2009年2月於美國佛羅里達州,邁阿密海灘
致 謝
我想藉此機會感謝我的家人,對於他們在撰寫本書過程中所表現出來的理解和支持。感謝我的四個可愛的孩子:Emily、Carter、Cohen和Brady,是你們給了爸爸完成此書的理由,我為擁有你們而感到無比幸福。我還要為我的姐姐和兄弟們在這個過程中所給予的鼓勵說一聲謝謝,你們自己都曾經歷過著書立作的嚴苛和艱辛,擁有你們這些對技術作品出版感同身受的人真是受益匪淺——我愛你們。我還想對我的爸爸說,你的幽默感幫助我度過了那些難以執筆為繼的日子——我愛你,老爸,不要停止讓你周圍的人發出笑聲。
多虧了一路上眾多優秀的安全研究人員的幫助才使得本書得以羽翼漸豐,他們是:Jared DeMott、Pedram Amini、Cody Pierce、Thomas Heller(傳說中的無敵Python男)以及Charlie Miller——我欠你們大夥一個大大的感謝。至於Immunity團隊,毫無疑問,你們一直以來大度地支持著我來撰寫此書,正是得益於你們的幫助,我不僅僅成長為一個Python小子,同時更成為了一名真正的開發人員和安全技術研究者。Nico和Dami,抽出了額外的時間來幫助我解決問題,對此表示不勝感激。Dave Aitel,我的技術編輯,始終驅使著本書的進度直至完成,並確保本書的邏輯性與可讀性,在此致以莫大的感謝。對於另一個Dave, Dave Falloon,非常感謝你為我校閱此書,對於那些讓我自己都哭笑不得的錯誤,對於你在CanSecWest大會上拯救了本人的筆記本電腦的英雄行徑,以及你巫師一般神奇的網路知識,都令我印象深刻。
最後,是那些總是被放在最後感謝的傢伙們——No Starch出版團隊。Tyler與我經歷了本書的整個出版過程(相信我,Tyler將是你遇到的最有耐心的傢伙),Bill將鼓勵聲連同那個可愛的印有Perl小抄的咖啡杯贈予了我。Megan在本書創作的尾聲階段為我減輕了眾多的麻煩,還有其他為出版本書而工作在幕後的團隊成員——謝謝你們!。我對你們為我所做的每一件事充滿感激。現在這篇致謝詞的篇幅快要跟格萊美的獲獎感言有一拼了,最後再次說一聲感謝給所有那些幫助過我,卻可能被我忘記提及的朋友們——你們清楚自己之於本書的意義。
Justin Seitz
簡介
我為了進行黑客技術研究而特地學習了Python這門語言,我敢斷言在這個領域中的眾多其他同行們也是如此。我曾經花費了大量的時間來尋找一種能夠同時適用於黑客技術和逆向工程領域的程式語言,就在幾年前,Python成為了黑客編程領域內顯而易見的王者。而一個不盡人如意的事實是,到目前為止還沒有一本真正意義上的參考手冊,來指導你將Python套用於不同的黑客技術場景中。你往往需要遊走於各大論壇的技術討論帖子中或者各種工具手冊中。有時為了使你的工具能夠正確地運轉起來,花費一番不小的功夫來閱讀和調試原始碼也是司空見慣的情況。而本書正是致力於填補這方面的空缺,將引領你經歷一次“旋風”之旅——你將看到Python這門語言是如何被套用在各式各樣的黑客技術與逆向工程場景中的。
本書將向你揭示隱藏在各種黑客工具背後的原理機制,其中包括:調試器、後門技術、Fuzzer、仿真器以及代碼注入技術,本書將向你一 一演示如何駕馭這些技術工具。除了學到如何使用現有的基於Python的工具之外, 你還將學習如何使用Python構建自己的工具。需要有言在先的一點就是,這並不是一本大全式的參考手冊!有大量使用Python編寫的信息安全類工具未在此書中被提及。本書的信條是授之以漁,而非授之以魚!你應當把從本書中所獲得的技能靈活地套用於其他的場景中,根據自身的需求對你選擇的其他Python工具進行調試,並做出擴展和定製。
閱讀本書的方式不僅限於一種,如果你是個Python新手或者對於構建黑客工具尚感陌生,那么從前往後依次閱讀對你來說是最好的選擇,你將從最基本的理論開始,並在閱讀本書的過程中編寫相當數量的Python代碼。當你閱讀完本書時,你應當具備了自行解決各種黑客或逆向工程任務的能力。如果你對Python已有一定程度的了解,並且對Ctype庫的使用駕輕就熟,那么不妨直接跳過第1章。對於那些行業浸沉已久的老手,相信你們可以在本書中來回穿梭自如,歡迎你們在日常工作中隨時按需擷取本書中的代碼片段或者相關章節。
本書在調試器相關的內容上花費了相當的篇幅,從第2章講述調試器的基本原理開始,直至第5章介紹完Immunity Debugger為止。調試器對於任何一個真正的黑客而言都是至關重要的工具,因此我毫不吝惜筆墨來對它們進行廣泛而全面的介紹。在之後的第6章和第7章中你將學到一些鉤子和代碼注入的技術,這些技術同樣可以被調試器工具採用,作為控制程式流和操縱記憶體的手段。
本書接下來的焦點放在使用Fuzzer工具來攻破應用程式體系上。在第8章中,你將開始學習基本的Fuzzing技術理論,我們將構建自己的檔案Fuzzing工具。第9章將向你演示如何駕馭強大的Fuzzing框架——Sulley來攻破一個現實世界中的FTP daemon程式。在第10章中,你將學習如何構建一個Fuzzer工具來攻擊Windows驅動。
在第11章中,你將看到如何在IDA Pro中(一款流行的二進制靜態分析工具)實現自動化執行靜態分析任務。在第12章中,我們將介紹一款基於Python的仿真器——PyEmu,來為本書畫上句號。
我試著使出現在本書中的代碼儘量簡潔,並在某些特定的地方加上了詳細的注釋以幫助你理解代碼的本質。學習一門新的程式語言或者掌握一套陌生的函式館的過程少不了你自己的親身實踐,以及不斷的自我糾正。
目錄
第1章 搭建開發環境 1
1.1 作業系統要求 1
1.2 獲取和安裝Python 2.5 2
1.2.1 在Windows下安裝Python 2
1.2.2 在Linux下安裝Python 2
1.3 安裝Eclipse和PyDev4
1.3.1 黑客摯友:ctype庫 5
1.3.2 使用動態程式庫 6
1.3.3 構建C數據類型 8
1.3.4 按引用傳參 9
1.3.5 定義結構體和聯合體 9
第2章 調試器原理和設計 12
2.1 通用暫存器 13
2.2 棧 15
2.3 調試事件 17
2.4 斷點 18
2.4.1 軟斷點 18
2.4.2硬體斷點20
2.4.3 記憶體斷點 22
第3章 構建自己的Windows調試器 24
3.1 Debugee,敢問你在何處 24
3.2 獲取暫存器狀態信息 33
3.2.1 執行緒枚舉 34
3.2.2 功能整合 35
3.3 實現調試事件處理例程 39
3.4 無所不能的斷點 44
3.4.1 軟斷點 44
3.4.2 硬體斷點 49
3.4.3 記憶體斷點 55
3.5 總結 59
第4章 PyDbg——Windows下的純Python調試器 60
4.1 擴展斷點處理例程 60
4.2 非法記憶體操作處理例程 63
4.3 進程快照 66
4.3.1 獲取進程快照 67
4.3.2 匯總與整合 70
第5章 Immunity Debugger——兩極世界的最佳選擇 74
5.1 安裝Immunity Debugger 74
5.2 Immunity Debugger 101 75
5.2.1 PyCommand命令 76
5.2.2 PyHooks 76
5.3 Exploit(漏洞利用程式)開發 78
5.3.1 搜尋exploit友好指令 78
5.3.2 “壞”字元過濾 80
5.3.3 繞過Windows 下的DEP機制82
5.4 破除惡意軟體中的反調試例程 87
5.4.1 IsDebuugerPresent 87
5.4.2 破除進程枚舉例程 88
第6章 鉤子的藝術 90
6.1 使用PyDbg部署軟鉤子 90
6.2 使用Immunity Debugger部署硬鉤子 95
第7章dll注入與代碼注入技術 101
7.1 創建遠程執行緒 101
7.1.1 DLL注入 102
7.1.2 代碼注入 105
7.2遁入黑暗108
7.2.1 檔案隱藏 109
7.2.2 構建後門 110
7.2.3 使用py2exe編譯Python代碼 114
第8章 Fuzzing 117
8.1 幾種常見的bug類型 118
8.1.1 緩衝區溢出 118
8.1.2 整數溢出 119
8.1.3 格式化串攻擊 121
8.2 檔案Fuzzer 122
8.3 後續改進策略 129
8.3.1代碼覆蓋率129
8.3.2 自動化靜態分析 130
第9章 Sulley 131
9.1 安裝Sulley 132
9.2 Sulley中的基本數據類型 132
9.2.1 字元串 133
9.2.2 分隔設定 133
9.2.3 靜態和隨機數據類型 134
9.2.4 二進制數據 134
9.2.5 整數 134
9.2.6 塊與組 135
9.3 行刺WarFTPD 136
9.3.1 FTP 101 137
9.3.2 創建FTP協定描述框架 138
9.3.3 Sulley會話 139
9.3.4 網路和進程監控 140
9.3.5 Fuzzing測試以及Sulley的Web界面 141
第10章 面向Windows驅動的Fuzzing測試技術 145
10.1 驅動通信基礎 146
10.2 使用Immunity Debugger進行驅動級的Fuzzing測試 147
10.3 Driverlib——面向驅動的靜態分析工具 151
10.3.1 尋找設備名稱 152
10.3.2 尋找ioctl分派例程 153
10.3.3 搜尋有效的IOCTL控制碼 155
10.4 構建一個驅動Fuzzer 157
第11章 IDAPython——IDA PRO環境下的Python腳本編程 162
11.1 安裝IDAPython 163
11.2 IDAPython函式 164
11.2.1 兩個工具函式 164
11.2.2 段(Segment) 164
11.2.3 函式 165
11.2.4 交叉引用 166
11.2.5 調試器鉤子 166
11.3 腳本實例 167
11.3.1 搜尋危險函式的交叉代碼 168
11.3.2函式覆蓋檢測 169
11.3.3 檢測棧變數大小 171
第12章 PYEmu——腳本驅動式仿真器 174
12.1 安裝PyEmu 174
12.2 PyEmu概覽 175
12.2.1 PyCPU 175
12.2.2 PyMemory 176
12.2.3 PyEmu 176
12.2.4 指令執行 176
12.2.5 記憶體修改器與暫存器修改器 177
12.2.6 處理例程(Handler) 177
12.3 IDAPyEmu 182
12.3.1 函式仿真 184
12.3.2 PEPyEmu 187
12.3.3 執行檔加殼器 188
12.3.4 UPX加殼器 188
12.3.5 利用PEPyEmu脫UPX殼 189