《反編譯技術(shù)與軟件逆向分析》共分10章。第1章到第3章簡(jiǎn)要介紹了軟件逆向分析技術(shù)的相關(guān)基礎(chǔ)知識(shí);第4章和第5章從反匯編和中間表示兩個(gè)方面為反編譯奠定基礎(chǔ);第6章到第9章針對(duì)反編譯的若干關(guān)鍵技術(shù)展開(kāi)詳細(xì)介紹;第10章則為反編譯測(cè)試相關(guān)的一些可用資源。全書(shū)以IA-64可執(zhí)行代碼為例進(jìn)行講解,但相關(guān)技術(shù)可以向其他平臺(tái)推廣。
《反編譯技術(shù)與軟件逆向分析》可作為計(jì)算機(jī)軟件專業(yè)本科高年級(jí)學(xué)生、碩士研究生的相關(guān)課程教科書(shū)或教學(xué)參考書(shū),也可供從事軟件逆向分析工作的工程技術(shù)人員參考。
隨著計(jì)算機(jī)科學(xué)和相關(guān)技術(shù)的不斷發(fā)展,尤其是各種編程語(yǔ)言的不斷豐富與壯大,相關(guān)人員對(duì)貼近于硬件層的低級(jí)形式編碼越來(lái)越陌生。但是,事實(shí)表明計(jì)算機(jī)軟件領(lǐng)域從來(lái)沒(méi)有過(guò),也不可能真正脫離對(duì)繁瑣的低級(jí)代碼進(jìn)行分析的需求,而軟件逆向分析技術(shù)在近年來(lái)重新成為計(jì)算機(jī)科學(xué)領(lǐng)域的研究熱點(diǎn)。在眾多逆向分析技術(shù)中,反編譯是對(duì)目標(biāo)程序分析最為徹底,但也是最為困難的技術(shù)領(lǐng)域。從名稱上可以看出,反編譯技術(shù)是編譯技術(shù)的逆過(guò)程,即將低級(jí)目標(biāo)可執(zhí)行代碼翻譯為語(yǔ)義等價(jià)的高級(jí)語(yǔ)言表示形式。
本書(shū)希望能夠?yàn)閺氖萝浖嫦蚍治龅目蒲腥藛T和工作者提供有效的幫助。與其他相關(guān)的逆向分析書(shū)籍不同的是,編者沒(méi)有局限于對(duì)二進(jìn)制代碼的反匯編分析,或者局限于對(duì)不同逆向分析輔助工具的使用指導(dǎo),而是希望能夠在反匯編層面分析的基礎(chǔ)上對(duì)目標(biāo)低級(jí)程序進(jìn)行進(jìn)一步挖掘,從而獲取更多的有效信息。畢竟現(xiàn)有的各種逆向分析工具的功能不一,不能完全滿足業(yè)界復(fù)雜多變的需求!笆谌艘贼~(yú),不如授之以漁”,本書(shū)希望能夠幫助讀者深入了解并掌握一個(gè)完整反編譯工具的各個(gè)部分,從而編寫真正滿足自己需求的逆向分析工具。
全書(shū)分為三大部分,共10章。第一部分,包括第1章至第3章。簡(jiǎn)要介紹了軟件逆向分析技術(shù)的相關(guān)基礎(chǔ)知識(shí),為讀者的進(jìn)一步閱讀奠定良好的基礎(chǔ)。包括軟件逆向分析的背景知識(shí)、不同體系結(jié)構(gòu)指令系統(tǒng)的相關(guān)背景,以及針對(duì)可執(zhí)行文件格式的介紹。在指令系統(tǒng)一章中介紹了兩種完全不同的體系結(jié)構(gòu),即CISC體系結(jié)構(gòu)和EPIC體系結(jié)構(gòu),并且著重針對(duì)Intel公司的64位安騰處理器的IA-64體系結(jié)構(gòu)指令系統(tǒng)進(jìn)行分析。在可執(zhí)行文件格式一章,則著重解析了在Linux操作系統(tǒng)中流行的ELF可執(zhí)行文件格式。第二部分,包括第4章、第5章。
第1章 緒論
1.1 軟件逆向分析
1.1.1 與安全相關(guān)的逆向分析
1.1.2 針對(duì)軟件開(kāi)發(fā)的逆向分析
1.1.3 本書(shū)的主要內(nèi)容
1.2 軟件逆向分析的歷史
1.3 軟件逆向分析的各個(gè)階段
1.3.1 文件裝載
1.3.2 指令解碼
1.3.3 語(yǔ)義映射
1.3.4 相關(guān)圖構(gòu)造
1.3.5 過(guò)程分析
1.3.6 類型分析
1.3.7 結(jié)果輸出
1.4 逆向分析框架
1.4.1 靜態(tài)分析框架
1.4.2 動(dòng)態(tài)分析框架
1.4.3 動(dòng)靜結(jié)合的分析框架
第2章 指令系統(tǒng)
2.1 指令系統(tǒng)概述
2.2 機(jī)器指令與匯編指令
2.2.1 機(jī)器指令
2.2.2 匯編指令
2.3 LA.6 4體系結(jié)構(gòu)的特點(diǎn)
2.3.1 顯式并行機(jī)制_
2.3.2 IA.64微處理器體系結(jié)構(gòu)
2.4 指令格式
本章 小結(jié)
第3章 可執(zhí)行文件
3.1 可執(zhí)行文件概述
3.2 可執(zhí)行文件格式
3.2.1 ELF文件的3種主要類型
3.2.2 文件格式
3.2.3 數(shù)據(jù)表示
3.2.4 文件頭
3.2.5 節(jié)
3.2.6 字符串表
3.2.7 符號(hào)表
3.3 一個(gè)簡(jiǎn)單的ELF文件分析
3.3.1 文件頭分析
3.3.2 section信息分析
本章 小結(jié)
第4章 反匯編技術(shù)
4.1 反匯編技術(shù)簡(jiǎn)介
4.2 反匯編算法流程
4.2.1 線性掃描算法
4.2.2 遞歸掃描算法
4.3 反匯編工具的自動(dòng)構(gòu)造方法
4.3.1 自動(dòng)構(gòu)造工具
4.3.2 利用自動(dòng)構(gòu)造方法構(gòu)建IA-64反匯編器
4.4 常用反匯編工具介紹
4.4.1 IDAPro介紹
4.4.2 ILDasm介紹
本章 小結(jié)
第5章 指令的語(yǔ)義抽象
5.1 語(yǔ)義描述語(yǔ)言
5.1.1 SSL簡(jiǎn)介
5.1.2 SSL文法的設(shè)計(jì)
5.1.3 SSL文法的擴(kuò)展
5.2 中間表示
5.2.1 低級(jí)中間表示(RTL)
5.2.2 高級(jí)中間表示(HRTL)
5.3 指令的語(yǔ)義抽象技術(shù)
5.3.1 語(yǔ)義抽象技術(shù)簡(jiǎn)介
5.3.2 指令語(yǔ)義的SSL描述
5.3.3 指令語(yǔ)義的高級(jí)模擬
5.4 基于SSL的IA.64指令語(yǔ)義抽象技術(shù)
5.4.1 IA.64的體系結(jié)構(gòu)特征描述
5.4.2 整數(shù)指令的語(yǔ)義描述
5.5 基于模擬的IA.64指令語(yǔ)義抽象技術(shù)
5.5.1 IA.64浮點(diǎn)特性
5.5.2 浮點(diǎn)指令的語(yǔ)義模擬
5.5.3 浮點(diǎn)并行指令的語(yǔ)義模擬
本章 小結(jié)
第6章 基本數(shù)據(jù)類型分析
6.1 數(shù)據(jù)類型分析的相關(guān)概念
6.1.1 ITA系統(tǒng)中數(shù)據(jù)類型分析的依據(jù)
6.1.2 ITA系統(tǒng)中基本數(shù)據(jù)類型分析的重要性
6.1.3 ITA系統(tǒng)中基本數(shù)據(jù)類型和高級(jí)C語(yǔ)言數(shù)據(jù)類型
6.2 基于指令語(yǔ)義的基本數(shù)據(jù)類型分析
6.2.1 &和*運(yùn)算符
6.2.2 普通算術(shù)指令的描述
6.2.3 內(nèi)存讀寫指令
6.2.4 轉(zhuǎn)移指令
6.3 基于過(guò)程的數(shù)據(jù)類型分析技術(shù)
6.3.1 變量重命名技術(shù)
6.3.2 變量類型推導(dǎo)的規(guī)則
6.3.3 格理論在變量類型推導(dǎo)中的應(yīng)用
本章 小結(jié)
第7章 高級(jí)控制流恢復(fù)
7.1 控制流恢復(fù)概述
7.1.1 控制語(yǔ)句在中間代碼中的組織特點(diǎn)
7.1.2 基本塊的劃分及控制流圖的構(gòu)建
7.1.3 控制流恢復(fù)術(shù)語(yǔ)
7.2 高級(jí)控制流恢復(fù)分析
7.2.1 可結(jié)構(gòu)化和不可結(jié)構(gòu)化循環(huán)子圖
7.2.2 可結(jié)構(gòu)化和不可結(jié)構(gòu)化two-way條件子圖
7.2.3 可結(jié)構(gòu)化和不可結(jié)構(gòu)化n-way條件子圖
7.2.4 多重結(jié)構(gòu)頭節(jié)點(diǎn)子圖
7.3 結(jié)構(gòu)化算法介紹
7.3.1 對(duì)流圖各節(jié)點(diǎn)進(jìn)行正向后序遍歷
7.3.2 對(duì)流圖各節(jié)點(diǎn)進(jìn)行反向后序遍歷
7.3.3 直接后必經(jīng)節(jié)點(diǎn)的確定
7.3.4 結(jié)構(gòu)化含有條件判斷的子圖
7.3.5 使用Pr定理構(gòu)建循環(huán)子圖結(jié)構(gòu)
7.4 可能出現(xiàn)的問(wèn)題與解決辦法
本章 小結(jié)
第8章 過(guò)程恢復(fù)技術(shù)
8.1 相關(guān)知識(shí)簡(jiǎn)介
8.1.1 調(diào)用約定
8.1.2 控制流分析及數(shù)據(jù)流分析
8.1.3 過(guò)程抽象
8.1.4 過(guò)程分析的目標(biāo)
8.2 庫(kù)函數(shù)恢復(fù)
8.2.1 內(nèi)嵌庫(kù)函數(shù)的恢復(fù)
8.2.2 動(dòng)態(tài)鏈接庫(kù)函數(shù)的恢復(fù)
8.3 用戶自定義函數(shù)分析
8.3.1 函數(shù)名識(shí)別
8.3.2 用戶自定義函數(shù)的參數(shù)分析
8.3.3 用戶自定義函數(shù)的返回值分析
本章 小結(jié)
第9章 部分編譯優(yōu)化效果的消除
9.1 謂詞執(zhí)行效果的消除
9.1.1 謂詞執(zhí)行和IF轉(zhuǎn)換
9.1.2 簡(jiǎn)單謂詞消除策略
9.1.3 謂詞分析
9.1.4 謂詞消除
9.2 投機(jī)優(yōu)化的消除
9.2.1 IA.64中投機(jī)的方式及實(shí)現(xiàn)方法
9.2.2 反投機(jī)的目的和算法設(shè)計(jì)
9.3 軟件流水優(yōu)化的消除
9.3.1 軟件流水機(jī)制
9.3.2 IA.64軟件流水循環(huán)
9.3.3 軟件流水消除技術(shù)
9.3.4 ITA系統(tǒng)中軟件流水消除技術(shù)的實(shí)現(xiàn)
本章 小結(jié)
第10章 程序的調(diào)試與測(cè)試
10.1 常用程序調(diào)試工具
10.2 幾種常用測(cè)試集
參考文獻(xiàn)
2.逆向分析加密算法
加密系統(tǒng)往往與隱私有關(guān):一個(gè)人傳遞給另一個(gè)人的信息可能并不想讓其他人知道?梢源致缘貙⒓用芩惴ǚ譃閮山M:有限加密算法和基于密鑰的算法。有限加密算法好比一些孩子們玩的游戲:寫給一個(gè)朋友一封信,信中的每個(gè)字母都經(jīng)過(guò)向上或向下的若干次移動(dòng)。有限加密算法的秘密在于算法本身,一旦算法被揭露,也就毫無(wú)秘密可言。由于逆向分析可以分析出加密或解密算法,因此有限加密算法只能提供非常脆弱的安全性。由于其算法也是保密的,因此逆向分析可以被看作是對(duì)算法的破解過(guò)程。
另一方面,基于密鑰的算法的秘密是密鑰,即一些類似于數(shù)字的值,它們可以由某些算法來(lái)對(duì)信息進(jìn)行加密和解密。在基于密鑰的算法中,用戶使用密鑰對(duì)信息進(jìn)行加密,并保證密鑰的隱蔽性。這種算法通常是公開(kāi)的,而僅需要保護(hù)密鑰即可。由于算法是已知的,因此逆向分析變得毫無(wú)意義。為了對(duì)一條經(jīng)過(guò)基于密鑰算法加密的信息進(jìn)行解密,可能需要以下3種途徑:①獲取密鑰;②嘗試所有可能的組合;③尋找算法中的缺陷,從而解析出密鑰或最初的信息。
盡管如此,對(duì)于基于密鑰加密方法的逆向分析在某些方面卻意義非凡。即便加密算法廣為人知,特定的實(shí)現(xiàn)細(xì)節(jié)也會(huì)對(duì)程序提供的所有安全級(jí)別造成意想不到的影響。無(wú)論加密算法如何精巧,很小的實(shí)現(xiàn)錯(cuò)誤也有可能使該算法提供的安全級(jí)別失效。而確認(rèn)一個(gè)安全產(chǎn)品是否真正地實(shí)現(xiàn)一個(gè)加密算法只有兩種途徑:要么分析它的源代碼(假定是可行的),要么進(jìn)行逆向分析。
3.?dāng)?shù)字版權(quán)管理
現(xiàn)代計(jì)算機(jī)系統(tǒng)已經(jīng)將大多數(shù)類型的具有版權(quán)的材料轉(zhuǎn)變?yōu)閿?shù)字信息,包括音樂(lè)、影視,甚至?xí)。這些信息以前只能夠通過(guò)具體的媒介獲取,而現(xiàn)在可以通過(guò)數(shù)字化信息得到。這種趨勢(shì)為用戶提供了巨大的好處,也為版權(quán)擁有者和內(nèi)容提供商帶來(lái)了一些問(wèn)題。對(duì)于用戶來(lái)說(shuō),這意味著資料質(zhì)量的提高,并且易于獲取和管理。對(duì)于提供商來(lái)說(shuō),這使得他們能夠以很低的費(fèi)用提供高質(zhì)量的內(nèi)容,但更為重要的是,這種方式使得對(duì)內(nèi)容流向的控制無(wú)法完成。
數(shù)字化信息以難以想象的速度在流動(dòng),并且易于復(fù)制。這種流動(dòng)性意味著一旦帶有版權(quán)的資料到達(dá)用戶手中,用戶能夠很容易地對(duì)其進(jìn)行移動(dòng)和復(fù)制,因此盜版也變得相當(dāng)容易。通常軟件公司通過(guò)在軟件產(chǎn)品中嵌入復(fù)制保護(hù)技術(shù)防止被盜版,即通過(guò)在軟件產(chǎn)品中嵌入代碼片段來(lái)防止或限制用戶對(duì)程序進(jìn)行復(fù)制。