前言
軟件安全是信息安全領域的重要內容,涉及軟件的逆向分析、加密、解密、漏洞分析、安全編程及病毒分析等。隨著互聯網應用的普及和企業信息化程度的不斷提升,社會和企業對安全技術人纔的需求逐年增加,國內高校對信息安全學科也越來越重視,但在計算機病毒查殺、網絡安全、個人信息安全等方面的人纔缺口仍然很大。習近平總書記指出,“網絡空間的競爭,歸根結底是人纔競爭”。同時,著重發現、培養、輸送信息安全專業人纔,已經成為各國信息安全戰略的重要組成部分。從就業的角度來看,如果能掌握信息安全相關知識和技能,從業者不但可以提高自身的職場競爭力,而且有機會發揮更大的個人潛力、獲得滿意的薪酬;從個人成長方面來說,研究信息安全技術有助於掌握許多繫統底層知識,是從業者提升職業技能的重要途徑。作為一名合格的程序員,在掌握需求分析、設計模式等之外,如果能掌握一些繫統底層知識,熟悉整個繫統的底層結構,必將獲益良多。
本書以軟件逆向為切入點,講述了軟件安全領域相關的基礎知識和技能。讀者閱讀本書後,很容易就能在逆向分析、漏洞分析、安全編程、病毒分析等領域進行擴展。這些知識點的相互關聯,將促使讀者開闊思路,使所學融會貫通,領悟更多的學習方法,提升自身的學習能力。
《加密與解密》從第1版到今天的第4版,能夠一直陪伴讀者,完全基於廣大讀者的熱情和鼓舞,在此深表謝意。
本書的緣起
在信息社會裡,安全技術變得越來越重要,如何普及安全知識是筆者始終關注的一個大問題。正是為了更好地將安全知識普及到社會各個領域的願望,促成了本書的問世。
依托看雪學院的技術背景,由筆者主編和主導的看雪安全繫列書籍,目前已出版發行了《加密與解密——軟件保護技術及完全解決方案》(簡體版,繁體版)、《加密與解密(第二版)》(簡體版,繁體版)、《加密與解密(第三版)》(簡體版,繁體版)、《軟件加密技術內幕》等;基於電子資料的形式,歷年的《看雪論壇精華集》被眾多網站轉載,保守計算,其下載量已達數百萬次,極大地推動了國內安全技術的發展。
這是一本很難寫的書。在2000年時,軟件安全是一個全新的領域,Windows 95面世之後的6年內,市面上沒有一本這方面的書,網上也缺乏相關資料。為了填補國內Windows平臺軟件安全書籍的空白,筆者與看雪論壇的一流好手努力合作,克服種種困難,於2001年9月推出了國內第一本全面介紹Windows平臺軟件安全技術的書籍,這就是本書的第1版《加密與解密——軟件保護技術及完全解決方案》。這本書一經面世,就得到了廣大讀者的喜愛和認可,獲得了2002年全國優秀暢銷書獎(科技類),在全國很多計算機專業書店獲得了極佳的銷售業績。2003年,這本書的繁體版在臺灣地區發行,受到了臺灣讀者的熱烈歡迎。
2003年6月,以第1版為基礎完成了本書的第2版。2008年,完成了本書的第3版。
現在讀者看到的這本厚重的圖書,包含了當今Windows環境下軟件逆向和保護技術的絕大部分內容。從基本的跟蹤調試到深層的虛擬機分析,從淺顯的逆向分析到中高級軟件保護,其跨度之廣、內容之深,國內尚無同類出版物能與之比肩。
第4版的變化
《加密與解密(第4版)》以第3版為基礎,刪除了第3版中的過時內容,補充了大量新的內容,結構更加合理。
1.講解通俗,突出基礎
本書增加了基礎部分的篇幅,繫統講解了軟件逆向的基本流程,主要內容包括動態分析、靜態分析及逆向分析的基礎知識,重點講解了逆向分析必備工具OllyDbg、WinDbg和IDA的用法。初學者通過相關內容的學習,可以輕松入門。
2.案例豐富,覆蓋面廣
學習逆向的最好方式就是動手實踐,在實踐中有針對性地學習。本書提供了大量的案例分析,方便讀者將理論與實踐相結合,通過實際操作提高調試分析能力。
3.新增64位軟件逆向技術的相關內容
為了方便理解,書中大多數實例程序是32位的。32位平臺和64位平臺的差異主要體現在指令集、寄存器長度和調用約定等方面。對有分析基礎的讀者來說,僅需要一個熟悉過程就可以適應這些差異。新增的64位軟件逆向部分繫統講解了64位逆向的基本思路,使讀者可以輕松地從32位逆向過渡到64位逆向。
4.加強繫統內核相關知識的介紹
掌握繫統底層技術是成為技術大牛的必經階段。本書增加了大量關於繫統內核技術的介紹,包括內核基礎知識、注入技術、Hook技術及高深的VT技術。另外,對異常處理中的大部分內容進行了重寫,更新的內容包括Windows 7/8/10等繫統的新特性、x64平臺上SEH的具體實現、編譯器對SEH的增強實現及SEH安全性等。
5.新增漏洞分析技術的相關內容
隨著軟件漏洞出現形式的日趨多樣化,為了區別於XSS、注入等類型的Web漏洞,將傳統的緩衝區溢出、UAF等涉及二進制編碼的漏洞統稱為二進制漏洞。本書討論的軟件漏洞都屬於二進制漏洞。
6.探討軟件保護技術的實施
本書研究了大量極具商業價值的軟件保護技術,包括反跟蹤技術、外殼編寫基礎、加密算法變形引擎、虛擬機的設計等。讀者完全可以將這些技術應用到自己的軟件保護體繫中去。
7.新增電子取證技術
電子取證是指對受侵害的計算機繫統進行掃描和破解,以及對入侵事件進行重建的過程,融合了計算機和刑偵兩個專業領域的知識和經驗。在本書中介紹了當前常用的電子取證技術。
預備知識
在閱讀本書前,讀者應該對x86彙編語言有大致的了解。彙編語言是大學計算機的必修課。這方面的書籍非常多,例如基普·歐文(Kip Irvine)的《彙編語言:基於x86處理器》、王爽的《彙編語言》等。雖然大多數書籍以16位彙編為講解平臺,但對理解彙編指令功能而言依然有益。
熟悉和了解C語言對閱讀本書也是很有幫助的——扎實的編程基礎是學好逆向的關鍵。另外,讀者需要掌握一些常用的算法和數據結構。
針對特定平臺下的軟件逆向,需要了解特定平臺下程序設計的相關知識。本書主要討論Windows逆向,需要讀者掌握一定的Win32編程知識。不論是研究逆向還是編程,都應該了解Win32編程。Win32編程是API方式的Windows程序設計,學習Windows API能使讀者更深入地了解Windows的工作方式。推薦閱讀佩措爾德(Charles Petzold)的經典著作《Windows程序設計》,它以C語言為講解平臺。
到此為止,筆者將假設讀者沒有任何加密與解密方面的經驗,並以此為標準組織本書的內容。
適合的讀者
本書適合以下讀者閱讀。
*安全技術相關工作者:研究軟件安全的一本不錯的技術工具書。
*對逆向調試技術感興趣的讀者:增強逆向調試技能,提高軟件的質量。
*對軟件保護感興趣的軟件開發人員:更好地保護軟件作品。
*相關專業在校學生:掌握相關知識和技能,獲得職場競爭力的秘密武器。
*關注個人信息安全、計算機安全技術並想了解技術內幕的讀者:解決很多技術疑難問題。
內容導讀
大多數人可能認為軟件加密與解密是一門高深的學問。造成這種認識的原因是以前這方面的技術資料匱乏,將加密與解密這一技術“神”化了。在這個領域,初學者一般不知從何下手,花費大量的時間和精力不說,甚至要走不少彎路。本書將給對加密與解密感興趣的讀者指明方向,提供捷徑。
本書的大部分章節,既相互關聯,又彼此獨立。讀者可以根據自己的情況,選擇合適自己的內容來閱讀。由於圖書厚度限制,本書附錄的內容以電子文檔的形式放在隨書文件中供讀者下載。
特別致謝
在本書的編寫過程中,有很多朋友付出了智慧和辛勤的勞動,在此一並表示感謝!
首先,感謝我的父母、妻子、女兒對我的大力支持,使我順利完成本書的編寫。
謹對電子工業出版社博文視點公司所有相關人員致以真誠的謝意。感謝電子工業出版社副總編輯、博文視點公司總經理郭立及編輯潘昕所做的大量工作。
特別感謝看雪論壇的各位版主及技術小組的成員對本書的大力支持。
感謝看雪論壇版主團隊成員linhanshi、netwind、gjden、Claud、仙果、玩命、cnbragon、piaox、BDomne、zmworm、KevinsBobo、LowRebSwrd、海風月影、菩提、xiaohang、非蟲、moonife、pencil、loongzyd、moonife、pencil、莫灰灰、rockinuk、jackozoo、Feisu、humourkyo、hawking、arhat、北極星2003、monkeycz、小蝦、MindMac等。
感謝看雪智能硬件小組的gjden、ggggwwww、xdxdxdxd、Gowabby、topofall、儒者立心、mozha、怪纔、坐北朝南、Wilson、光棍節、憑欄映影、wooy0ung、南極小蝦、阿東、missdiog、猥瑣菜鳥、Yale、Fycrlve、滄海一粟、gd菜雞。
感謝看雪Android安全小組的LowRebSwrd、Claud、darmao、dssljt、DuckyDog、ele7enxxh、FIGHTING安、JoenChen、jltxgcy、jusnic、lody、SANCDAYE、Ov4ns7wp、ThomasKing、萬抽抽、王正飛、GeneBlue、foyjog、不知世事、蔣鐘慶、MindMac。
感謝看雪iOS安全小組的roysue、zhuliang。
感謝看雪Web安全小組的piaox、ermei、govsb、qq-tianqi、anybaby、webappsec、iheartbeat、猥瑣菜鳥。
感謝看雪漏洞分析小組的仙果、wingdbg、BDomne、Keoyo_k0shl、KeenDavid、icepng、TKMoma、君子謬、IronMannn、riusksk、污師、歲月別催。
感謝看雪翻譯小組的哆啦咪、cherrir、daemond、freakish、fyb波、Green奇、ghostway、hanbingxzy、hesir、jasonk龍蓮、lumou、Logdty、rainbow、skeep、SpearMint、StrokMitream、sudozhange、Vancir、wangrin、xycxmz、zplusplus、夢野間、木無聊偶、南極小蝦、敲代碼的貓、銀雁冰、一壺蔥茜、玉林小學生。
感謝CCDebuger對第2章“動態分析技術”和第16章“脫殼技術”的校對。
感謝accessd參與2.3節“MDebug調試器”的編寫。
感謝gzgzlxg對第3章“靜態分析技術”提出的修改和補充意見。
感謝zmworm對IDA使用的補充建議。
感謝WiNrOOt提供的IDA簡易教程。
感謝zwfy為3.3.16節“IDC腳本”提供的Python腳本。
感謝北京建極練科技有限公司CTO段夕華對第4章“逆向分析技術”提出的寶貴修改意見。
感謝LOCKLOSE提供的IDA 7.0中文字符搜索的解決方法。
感謝武漢科銳安全教育的張延清對4.2節“64位軟件逆向技術”的編寫作出的貢獻。
感謝Blowfish對5.1節“序列號保護方式”的編寫作出的貢獻。
感謝riijj為5.6節“網絡驗證”提供的實例。
感謝cnbragon參與第6章“加密算法”的編寫。
感謝麥洛科菲信息安全培訓創始人周揚榮參與第7章“Windows內核基礎”的編寫。
感謝Hume對第8章“Windows下的異常處理”的編寫作出的貢獻。
感謝段治華參與第8章“Windows下的異常處理”、第12章“注入技術”和第13章“Hook技術”的編寫。
感謝Hying對第9章“Win32調試API”和第19章“外殼編寫基礎”的編寫作出的貢獻。
感謝程勛德對第10章“VT技術”和22.2.6節“利用VT技術”的編寫作出的貢獻。
感謝王勇對11.15節“編寫PE分析工具”的編寫作出的貢獻。
感謝snowdbg參與第14章“漏洞分析技術”的編寫。
感謝BDomne對第14章“漏洞分析技術”的校對。
感謝DiKeN對16.10節“靜態脫殼”的編寫作出的貢獻。
感謝afanty對17.1節“防範算法求逆”的編寫作出的貢獻。
感謝李江濤對17.2.2節“SMC技術實現”的編寫作出的貢獻。
感謝forgot參與第18章“反跟蹤技術”的編寫。
感謝15PB信息安全教育的薛亮亮對19.4節“用C++ 編寫外殼部分”的編寫作出的貢獻。
感謝馮典參與第20章“虛擬機的設計”和第21章“VMProtect逆向和還原淺析”的編寫。
感謝羅翼對22.2.1節“跨進程內存存取機制”、22.2.2節“Debug API機制”和22.2.3節“利用調試寄存器機制”的編寫作出的貢獻。
感謝羅巍對22.2.5節“利用Hook技術”的編寫作出的貢獻。
感謝tankaiha參與第24章“.NET平臺加解密”的編寫。
感謝宋成廣對第24章“.NET平臺加解密”的校對。
感謝崔孝晨(hannibal)參與第25章“數據取證技術”的編寫。
感謝linhanshi在工具方面提供的幫助。
感謝老羅《矛與盾的較量——CRC實踐篇》一文所帶來的啟發。
感謝Lenus在內存Dump和內存斷點方面給予的技術支持。
感謝skylly對第16章“脫殼技術”的腳本制作提供的技術支持。
感謝hnhuqiong提供的ODbgScript腳本教學資料。
感謝VolX提供隨書文件中的Aspr2.XX_unpacker.osc腳本。
感謝CoDe_Inject對22.2.4節“利用DLL注入技術”的編寫提供的幫助。
感謝dREAMtHEATER在Win32編程和PE格式上的大力支持。
感謝武漢科銳安全教育的Backer為22.2.4節“利用DLL劫持技術”提供的lpk.cpp。
感謝softworm撰寫的《Themida的SDK分析》一文。文本收錄在隨書文件“16.9加密殼”中。
感謝郭春楊對隨書文件附錄B“在Visual C++ 中使用內聯彙編”的編寫作出的貢獻。
感謝周文雄(小樓)對1.1.2節“軟件逆向工程”的編寫作出的貢獻,以及在Visual Basic 6逆向技術方面提供的支持(相關內容請參考隨書文件附錄C)。
感謝閻文斌(玩命)參與隨書文件附錄D“加密算法變形引擎”的編寫。
感謝cyclotron對偽編譯相關內容的編寫作出的貢獻。
感謝pll621在擴展PE功能方面具有開拓性的研究。
感謝Fisheep對與浮點指令和信息隱藏技術相關內容的編寫作出的貢獻。
感謝Sun Bird、JoJo、kvllz、frozenrain、jero、mocha、NWMonster、petnt、sudami、tankaiha、wynney、XPoy、王清、小蝦等朋友為術語表的整理所做的工作。
感謝胡勇、黃敏、郭倩茹、朱林峰、萬嗣超、高偉超、陳佳林、王強、劉習飛、劉婧、郭澤文、嚴正華、Sun Bird、JoJo、kvllz等對本書的大力支持。
感謝熱心讀者和看雪熱心會員對《加密與解密(第三版)》中的錯誤進行的反饋和指正。他們是:AlexLong、AsmDebuger、a王、cnliuqh、ddstrg、epluguo、Fido、giftedboy、Gruuuuubby、hdy981、isiah、jerrysun、junxiong、kan、kangaroo、keagan、kmlch、konyka、linkto、littlewisp、lizaixue、manbug、obaby、pathletboy、Phonax、playsun、ppdo、rootboy、senhuxi、senhuxi、shoooo、smartsl、ucantseeme、usufu、usufu、Xacs、XLSDG、yangjt、ybhdgggset、zhiyajun、zwfy、家有睡神、青楓、清風、嗜血狂君、未秋葉落、軒轅小聰、雪未來白無垢、雨中的魚等。
同時,要感謝那些參與《加密與解密》前3版及《軟件加密技術內幕》組稿的眾多看雪論壇一流高手,是他們的參與和奉獻讓本書得以順利完成。
在此,還要感謝看雪論壇其他朋友的支持和幫助。是你們提供的幫助,使得筆者能夠完成本書。如果以上未提及對您的謝意,在此我表示由衷的感謝!
關於本書配套文件
請讀者用微信掃描本書封面勒口上的二維碼,按提示獲取《加密與解密(第4版)》的隨書文件。
隨書文件中的軟件和實例,經過多方面的檢查和測試,絕無病毒。但是,一些加解密工具采用了病毒技術,導致部分代碼與某些病毒的特征碼類似,可能造成查毒軟件的誤報,請讀者自行決定是否使用。建議將隨書文件復制到硬盤中,並去除“隻讀”屬性再進行調試,以免出現一些無法解釋的錯誤。
關於看雪學院
看雪學院(www.kanxue.com)是一個專注於PC、移動、智能設備安全研究及逆向工程的開發者社區,創建於2000年,歷經多年的發展,受到了業內的廣泛認同,在行業中樹立了令人尊敬的專業形像。看雪學院始終關注安全技術領域的最新發展,為IT專業人士、技術專家提供了一個氛圍良好的交流與合作平臺。多年來,看雪學院培養了大批安全人纔,使他們從普通的IT愛好者成長為具有一技之長的安全專纔。同時,看雪學院建立了一套行之有效的人纔選撥機制,為IT企業輸送和推薦了眾多優秀人纔,在業內形成了很好的口碑。在多年的發展過程中,看雪學院形成了大量有價值的技術資料,經過看雪團隊的共同努力,出版了多本深受出版社和廣大讀者好評、社會影響深遠的技術專著。
為了更好地發展看雪學院,2015年11月創建了上海看雪科技有限公司,公司以看雪學院為基礎,致力於構建一個PC、移動、智能設備安全研究及逆向工程的開發者社區,為會員提供安全知識在線視頻課程和教學服務,同時為企業提供智能設備安全測試服務和相關產品。
意見反饋
我們非常希望能夠了解讀者對本書的看法。如果您對本書內容有任何問題或有自己的學習心得想要與其他讀者分享,歡迎來看雪論壇交流。
技術支持:http://www.kanxue.com
郵件地址:kanxue@pediy.com
段鋼
2018年8月於上海