C++反匯編與逆向分析技術(shù)揭秘(第2版)
定 價(jià):139 元
- 作者:錢林松,張延清
- 出版時(shí)間:2021/9/1
- ISBN:9787111689911
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP312.8C
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
內(nèi)容簡介
這是一部系統(tǒng)講解反匯編與逆向分析技術(shù)原理、流程、方法和實(shí)用技巧的著作。
本書第1版出版于2011年,10年來暢銷不衰,成為反匯編與逆向工程領(lǐng)域的標(biāo)志性著作,被數(shù)十萬安全工程師和C++工程師奉為瑰寶。在全球?qū)W術(shù)界和企業(yè)界都享有盛譽(yù),故第2版得到了全球15位安全技術(shù)專家的傾力推薦。第2版在技術(shù)、工具和案例等方面做了大量的更新和補(bǔ)充。
通過本書,你將掌握以下知識(shí)或技能:
?逆向分析技術(shù)的工具和原理;
?逆向分析技術(shù)的流程和方法;
?逆向分析技術(shù)的精髓和實(shí)用技巧;
?軟件調(diào)試的技術(shù)原理,以及代碼運(yùn)行時(shí)的內(nèi)存表現(xiàn);
?C++語法的實(shí)現(xiàn)機(jī)制和反匯編表現(xiàn)形式;
全書共18章,分為三個(gè)部分:
第1部分 準(zhǔn)備工作 (第1章)
簡單地介紹了編譯器、調(diào)試器和反匯編靜態(tài)分析工具的使用方法以及反匯編引擎的工作原理;
第二部分C++反匯編揭秘(第2~13章)
以多種編譯器為例解析了每個(gè)C/C++知識(shí)點(diǎn)的匯編表現(xiàn)形式,通過整理反匯編代碼梳理流程和脈絡(luò),講解了調(diào)試和識(shí)別各種C/C++語句的方法,并且深入剖析各知識(shí)點(diǎn)的底層機(jī)制;
第三部分 逆向分析技術(shù)應(yīng)用(第14~18章)
通過對(duì)PEiD、調(diào)試器 OllyDbg、木馬、勒索病毒等實(shí)際應(yīng)用的逆向分析,帶領(lǐng)讀者領(lǐng)路逆向分析技術(shù)的魔力,并加深對(duì)所學(xué)理論知識(shí)的理解。
(1)第1版影響深遠(yuǎn):第1版10年暢銷不衰,成為逆向工程領(lǐng)域標(biāo)志性著作,口碑爆棚,影響數(shù)十萬安全工程師和C++工程師。(2)作者資歷深厚:作者是IT技術(shù)領(lǐng)域自學(xué)成才典范,有近20年安全技術(shù)研發(fā)和教育經(jīng)驗(yàn),深耕逆向分析技術(shù)、C++和系統(tǒng)編程。(3)本書5大用途:逆向分析技術(shù)工具和原理、逆向分析技術(shù)流程和方法、逆向分析技術(shù)精髓和實(shí)用技巧、軟件調(diào)試技術(shù)原理及代碼運(yùn)行時(shí)內(nèi)存表現(xiàn)、C++語法的實(shí)現(xiàn)機(jī)制和反匯編表現(xiàn)形式。(4)全球?qū)<伊λ]:武漢大學(xué)、華中科技大學(xué)、南京郵電大學(xué)的學(xué)術(shù)界專家力薦;騰訊、360、金山毒霸、桑坦德集團(tuán)、中國電信、深信服的企業(yè)屆專家力薦;臺(tái)灣知名IT技術(shù)專家和教育家侯捷、看雪學(xué)院創(chuàng)始人段鋼力薦。
為什么要寫這本書
“時(shí)下的IDE很多都是極其優(yōu)秀的,拜其所賜,職場上的程序員多出十幾倍,但是又有多少人能理解程序內(nèi)部的機(jī)制呢?”
—侯捷
隨著軟件技術(shù)的發(fā)展及其在各個(gè)領(lǐng)域的廣泛應(yīng)用,對(duì)軟件進(jìn)行逆向分析,通過閱讀其反匯編代碼推斷數(shù)據(jù)結(jié)構(gòu)、體系結(jié)構(gòu)和程序設(shè)計(jì)思路的需求越來越多。逆向分析技術(shù)能幫助我們更好地研究和學(xué)習(xí)先進(jìn)的軟件技術(shù),特別是當(dāng)我們非常想知道某個(gè)軟件的某些功能是如何實(shí)現(xiàn)的而手頭又沒有合適的資料時(shí)。
如果能夠利用逆向技術(shù)去研究一些一流軟件的設(shè)計(jì)思想和實(shí)現(xiàn)方法,那么我們的軟件技術(shù)水平將會(huì)得到極大的提升。目前,國內(nèi)關(guān)于逆向分析技術(shù)的資料實(shí)在不多,大中專院校的計(jì)算機(jī)相關(guān)專業(yè)對(duì)此技術(shù)也沒有足夠的重視。
有很多人認(rèn)為研究程序的內(nèi)部原理會(huì)破壞“黑盒子”的封裝性,但是如果我們只是在別人搭建好的平臺(tái)上做開發(fā),那么始終只能使用別人提供的未開源的SDK,會(huì)一直受牽制。如果我們能夠充分掌握逆向分析方法,就可以洞悉各種SDK的實(shí)現(xiàn)原理,學(xué)習(xí)各種一流軟件采用的先進(jìn)技術(shù),取長補(bǔ)短,為我所用。若能如此,實(shí)為我國軟件產(chǎn)業(yè)之幸。
我當(dāng)初學(xué)習(xí)逆向技術(shù)時(shí)完全靠自學(xué),且不說這方面的書籍,就連相關(guān)的文檔和資料也極度匱乏。在這種條件下,雖然很努力地鉆研,但學(xué)習(xí)進(jìn)度非常緩慢,花費(fèi)幾天幾夜分析一個(gè)軟件的關(guān)鍵算法是常有的事。如果當(dāng)初能有一本全面講解反匯編與逆向分析技術(shù)的書,我不僅能節(jié)省很多時(shí)間和精力,還能少走很多彎路。因?yàn)橛辛诉@段經(jīng)歷,我斗膽爭先,決定將自己多年來在反匯編與逆向分析技術(shù)領(lǐng)域的經(jīng)驗(yàn)和心得整理出來與大家分享,希望更多的開發(fā)人員在掌握這項(xiàng)技術(shù)后能更好地將其應(yīng)用到軟件開發(fā)實(shí)踐中,從而提高我國軟件行業(yè)的整體水平。
讀者對(duì)象
無論大家從事哪個(gè)行業(yè),在開始閱讀本書之前,都需要具備以下幾個(gè)方面的基礎(chǔ)知識(shí)。
數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)知識(shí),如棧結(jié)構(gòu)存取元素的特點(diǎn)等。
匯編的基礎(chǔ)知識(shí),如尋址方式和指令的使用等。
C/C++語言的基礎(chǔ)知識(shí),如指針、虛函數(shù)和繼承的概念等。
熟悉Visual Studio 2019的常用功能,如觀察某變量的地址、單步跟蹤等。
具備了上面這些基礎(chǔ)知識(shí),就可以根據(jù)自己的實(shí)際需求學(xué)習(xí)本書的內(nèi)容。
如果你是一位軟件研發(fā)人員,你將通過本書更深入地了解C++語法的實(shí)現(xiàn)機(jī)制,對(duì)產(chǎn)品知其然更知其所以然。在精讀反匯編代碼后,你的調(diào)試水平也會(huì)得到質(zhì)的提升。
如果你是一位反病毒分析人員或者電子證據(jù)司法取證分析人員,通過逆向分析惡意軟件樣本,你可以進(jìn)行取證分析處理,例如,分析開發(fā)者的編寫習(xí)慣、推斷開發(fā)者的編程水平,甚至可以進(jìn)一步判定某病毒樣本是否與其他病毒出自同一人之手。
如果你是一位高等院校計(jì)算機(jī)相關(guān)專業(yè)的學(xué)生(本科或本科以上),你可以通過學(xué)習(xí)書中的軟件逆向分析技術(shù)來拓展思路,為未來進(jìn)軍軟件研發(fā)行業(yè)打下基礎(chǔ)。
第2版的更新內(nèi)容
重新設(shè)計(jì)了所有的示例。
所有的反匯編代碼均使用的Visual Studio 2019編譯器編譯。
增加的Clang編譯器反匯編代碼講解。
增加的GCC編譯器反匯編代碼講解。
增加所有主流編譯器64位程序反匯編代碼講解。
隨書文件增加所有示例單獨(dú)的源碼和所有編譯器編譯后的可執(zhí)行程序。
根據(jù)編譯器刪除了一些過時(shí)的內(nèi)容,增加了一些新的內(nèi)容。
增加和更新了病毒分析示例。
本書特色
我結(jié)合自己的學(xué)習(xí)經(jīng)歷和對(duì)C++反匯編與逆向分析技術(shù)的了解將全書劃分為三個(gè)部分。
部分 準(zhǔn)備工作(第1章)
在軟件開發(fā)過程中,程序員會(huì)使用一些調(diào)試工具,以便高效地找出軟件中存在的錯(cuò)誤。在逆向分析領(lǐng)域,分析者也要利用相關(guān)工具分析軟件行為,驗(yàn)證分析結(jié)果。本書部分簡單介紹了幾款常用的逆向分析輔助工具和軟件。
第二部分 C++反匯編揭秘(第2~13章)
評(píng)估一位軟件開發(fā)者的能力,一是看設(shè)計(jì)能力,二是看調(diào)試水平。一般來說,大師級(jí)的程序員對(duì)軟件逆向分析技術(shù)都有深入的理解,他們?cè)诰帉懜呒?jí)語言代碼的同時(shí),心里還會(huì)浮現(xiàn)對(duì)應(yīng)的匯編代碼,在寫程序的時(shí)候就已經(jīng)非常了解終產(chǎn)品的模樣,達(dá)到了人機(jī)合一的境界,所以在調(diào)試Bug的時(shí)候游刃有余。逆向分析技術(shù)重在代碼的調(diào)試和分析,如果你本來就是一位技術(shù)不錯(cuò)的程序員,學(xué)習(xí)這部分內(nèi)容就是對(duì)你“內(nèi)功”的鍛煉,這部分內(nèi)容可以幫助你徹底掌握C/C++各種特性的底層機(jī)制,不僅能做到知其然,還能知其所以然。這部分以C/C++語法為導(dǎo)向,以各編譯器為例,解析每個(gè)C/C++知識(shí)點(diǎn)的匯編表現(xiàn)形式,通過整理其反匯編代碼梳理流程和脈絡(luò)。這部分內(nèi)容重在講方法,授人以漁,不重劍招,但重劍意。
第三部分 逆向分析技術(shù)應(yīng)用(第14~18章)
這是本書的后一部分,以理論與實(shí)踐相結(jié)合的方式,通過對(duì)具體程序的分析來加深大家對(duì)前面所學(xué)理論知識(shí)的理解,從而快速積累實(shí)戰(zhàn)經(jīng)驗(yàn)。第14章分析了PE文件分析工具PEiD的工作原理,第15章分析了調(diào)試器OllyDbg的工作原理,第16章對(duì)大灰狼遠(yuǎn)控木馬進(jìn)行了逆向分析,第17章對(duì)WannaCry勒索病毒進(jìn)行了逆向分析,第18章講解了反匯編代碼的重建與編譯。通過這部分內(nèi)容
作者簡介
錢林松
資深安全技術(shù)專家、軟件開發(fā)工程師和架構(gòu)師。從事計(jì)算機(jī)安全和軟件開發(fā)工作近20年,實(shí)踐經(jīng)驗(yàn)豐富,尤其精通軟件逆向分析技術(shù),對(duì)C/C++技術(shù)和Windows的底層機(jī)制也有非常深入的研究。
武漢科銳軟件技術(shù)有限公司(國內(nèi)知名的安全教育機(jī)構(gòu))創(chuàng)始人,教學(xué)經(jīng)驗(yàn)豐富,多年來,為國內(nèi)計(jì)算機(jī)安全領(lǐng)域培養(yǎng)和輸送了大量的人才。活躍于看雪論壇,有較高的知名度和影響力。
張延清
軟件逆向教育專家,看雪論壇技術(shù)專家。2004年從事數(shù)控機(jī)床加工編程,2006年進(jìn)入游戲編程及C/C++開發(fā)與逆向分析領(lǐng)域,2011年就職于武漢科銳軟件技術(shù)有限公司,任技術(shù)總監(jiān)兼授課老師。創(chuàng)立國內(nèi)首家Android軟件逆向分析教育課程體系,該課程體系被多家培訓(xùn)教育機(jī)構(gòu)采用。
科銳·安全實(shí)訓(xùn)領(lǐng)軍者
科銳(www.51asm.com)創(chuàng)辦自2007年,一直專注于逆向分析人才培養(yǎng),畢業(yè)學(xué)員逾千人,廣泛就業(yè)于各安全企業(yè),從事技術(shù)與技術(shù)管理工作?其J通過一套嚴(yán)格的科學(xué)考核體系,確保學(xué)員對(duì)每一個(gè)知識(shí)點(diǎn)的掌握,從而保證教學(xué)質(zhì)量,使每一個(gè)畢業(yè)學(xué)員都能符合企業(yè)的用人需求。真正實(shí)現(xiàn)以實(shí)踐為主的實(shí)訓(xùn)理念,是我們終的實(shí)訓(xùn)目標(biāo)。
贊譽(yù)
序一
序二
序三
前言
部分 準(zhǔn)備工作
第1章 熟悉工作環(huán)境和相關(guān)工具2
1.1 安裝Visual Studio 20192
1.2 安裝GCC6
1.3 調(diào)試工具OllyDbg12
1.4 調(diào)試工具x64dbg14
1.5 調(diào)試工具WinDbg15
1.6 反匯編靜態(tài)分析工具IDA17
1.7 反匯編引擎的工作原理22
1.8 本章小結(jié)27
第二部分 C++反匯編揭秘
第2章 基本數(shù)據(jù)類型的表現(xiàn)形式30
2.1 整數(shù)類型30
2.1.1 無符號(hào)整數(shù)30
2.1.2 有符號(hào)整數(shù)31
2.2 浮點(diǎn)數(shù)類型32
2.2.1 浮點(diǎn)數(shù)的編碼方式33
2.2.2 基本的浮點(diǎn)數(shù)指令35
2.3 字符和字符串43
2.3.1 字符的編碼43
2.3.2 字符串的存儲(chǔ)方式44
2.4 布爾類型45
2.5 地址、指針和引用46
2.5.1 指針和地址的區(qū)別46
2.5.2 各類型指針的工作方式47
2.5.3 引用56
2.6 常量60
2.6.1 常量的定義60
2.6.2 #define和const的區(qū)別62
2.7 本章小結(jié)65
第3章 認(rèn)識(shí)啟動(dòng)函數(shù),找到用戶入口66
3.1 程序的真正入口66
3.2 了解VS2019的啟動(dòng)函數(shù)66
3.3 main函數(shù)的識(shí)別70
3.4 本章小結(jié)71
第4章 觀察各種表達(dá)式的求值過程72
4.1 算術(shù)運(yùn)算和賦值72
4.1.1 各種算術(shù)運(yùn)算的工作形式72
4.1.2 算術(shù)結(jié)果溢出130
4.1.3 自增和自減131
4.2 關(guān)系運(yùn)算和邏輯運(yùn)算136
4.2.1 關(guān)系運(yùn)算和條件跳轉(zhuǎn)的對(duì)應(yīng)136
4.2.2 表達(dá)式短路137
4.2.3 條件表達(dá)式141
4.3 位運(yùn)算149
4.4 編譯器使用的優(yōu)化技巧152
4.4.1 流水線優(yōu)化規(guī)則155
4.4.2 分支優(yōu)化規(guī)則158
4.4.3 高速緩存優(yōu)化規(guī)則159
4.5 一次算法逆向之旅159
4.6 本章小結(jié)164
第5章 流程控制語句的識(shí)別165
5.1 if語句165
5.2 if…else…語句168
5.3 用if構(gòu)成的多分支流程174
5.4 switch的真相180
5.5 難以構(gòu)成跳轉(zhuǎn)表的switch196
5.6 降低判定樹的高度201
5.7 do、while、for的比較206
5.8 編譯器對(duì)循環(huán)結(jié)構(gòu)的優(yōu)化214
5.9 本章小結(jié)220
第6章 函數(shù)的工作原理221
6.1 棧幀的形成和關(guān)閉221
6.2 各種調(diào)用方式的考察222
6.3 使用ebp或esp尋址226
6.4 函數(shù)的參數(shù)230
6.5 函數(shù)的返回值232
6.6 x64調(diào)用約定235
6.7 本章小結(jié)238
第7章 變量在內(nèi)存中的位置和訪問方式239
7.1 全局變量和局部變量的區(qū)別239
7.2 局部靜態(tài)變量的工作方式247
7.3 堆變量252
7.4 本章小結(jié)256
第8章 數(shù)組和指針的尋址257
8.1 數(shù)組在函數(shù)內(nèi)257
8.2 數(shù)組作為參數(shù)266
8.3 數(shù)組作為返回值270
8.4 下標(biāo)尋址和指針尋址276
8.5 多維數(shù)組282
8.6 存放指針類型數(shù)據(jù)的數(shù)組288
8.7 指向數(shù)組的指針變量290
8.8 函數(shù)指針296
8.9 本章小結(jié)299
第9章 結(jié)構(gòu)體和類300
9.1 對(duì)象的內(nèi)存布局300
9.2 this指針305
9.3 靜態(tài)數(shù)據(jù)成員311
9.4 對(duì)象作為函數(shù)參數(shù)314
9.5 對(duì)象作為返回值322
9.6 本章小結(jié)329
第10章 構(gòu)造函數(shù)和析構(gòu)函數(shù)331
10.1 構(gòu)造函數(shù)的出現(xiàn)時(shí)機(jī)331
10.2 每個(gè)對(duì)象是否都有默認(rèn)的構(gòu)造函數(shù)353
10.3 析構(gòu)函數(shù)的出現(xiàn)時(shí)機(jī)355
10.4 本章小結(jié)375
第11章 虛函數(shù)377
11.1 虛函數(shù)的機(jī)制377
11.2 虛函數(shù)的識(shí)別383
11.3 本章小結(jié)389
第12章 從內(nèi)存角度看繼承和多重繼承391
12.1 識(shí)別類和類之間的關(guān)系392
12.2 多重繼承418
12.3 抽象類426
12.4 虛繼承428
12.5 本章小結(jié)443
第13章 異常處理445
13.1 異常處理的相關(guān)知識(shí)445
13.2 異常類型為基本數(shù)據(jù)類型的處理流程451
13.3 異常類型為對(duì)象的處理流程459
13.4 識(shí)別異常處理464
13.5 x64異常處理475
13.5.1 RUNTIME_FUNCTION結(jié)構(gòu)476
13.5.2 UNWIND_INFO結(jié)構(gòu)476
13.5.3 UNWIND_CODE結(jié)構(gòu)478
13.5.4 特定于語言的處理程序478
13.5.5 x64 FuncInfo的變化479
13.5.6 還原x64的try…catch481
13.6 本章小結(jié)484
第三部分 逆向分析技術(shù)應(yīng)用
第14章 PEiD的工作原理分析486
14.1 開發(fā)環(huán)境的識(shí)別486
14.2 開發(fā)環(huán)境的偽造494
14.3 本章小結(jié)497
第15章 調(diào)試器OllyDbg的工作原理分析498
15.1 INT3斷點(diǎn)498
15.2 內(nèi)存斷點(diǎn)503
15.3 硬件斷點(diǎn)507
15.4 異常處理機(jī)制513
15.5 加載調(diào)試程序519
15.6 本章小結(jié)522
第16章 大灰狼遠(yuǎn)控木馬逆向分析523
16.1 調(diào)試環(huán)境配置523
16.2 病毒程序初步分析524
16.3 啟動(dòng)過程分析525
16.4 通信協(xié)議分析532
16.5 遠(yuǎn)控功能分析536
16.6 本章小結(jié)551
第17章 WannaCry勒索病毒逆向分析552
17.1 tasksche.exe勒索程序逆向分析552
17.1.1 病毒初始化552
17.1.2 加載病毒核心代碼558
17.1.3 病毒核心代碼562
17.2 mssecsvc.exe蠕蟲程序逆向分析569
17.2.1 蠕蟲病毒代碼初始化569
17.2.2 發(fā)送漏洞攻擊代碼573
17.3 永恒之藍(lán)MS17-010漏洞原理分析577
17.3.1 漏洞1利用分析577
17.3.2 漏洞2利用分析583
17.3.3 漏洞3利用分析584
17.4 本章小結(jié)586
第18章 反匯編代碼的重建與編譯587
18.1 重建反匯編代碼587
18.2 編譯重建后的反匯編代碼590
18.3 本章小結(jié)591
參考文獻(xiàn)592