定 價:129 元
叢書名:網(wǎng)絡(luò)空間安全技術(shù)叢書
- 作者:陳佳林著
- 出版時間:2024/1/1
- ISBN:9787111741824
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP393.08
- 頁碼:12555
- 紙張:
- 版次:1
- 開本:24cm
本書共31章,分為四個部分。第一部分主要介紹了unidbg的基本使用和操作,包括工作環(huán)境的準(zhǔn)備、簡單補(bǔ)環(huán)境、Hook和Patch的方法等。第二部分對unidbg的原理與實(shí)現(xiàn)進(jìn)行了詳細(xì)的剖析。第三部分通過實(shí)戰(zhàn)案例講解了unidbg在生產(chǎn)環(huán)境中的使用,包括如I/O重定向、Debugger自吐等。第四部分介紹了環(huán)境變量檢測、JNI層常見函數(shù)處理等,對常規(guī)檢測進(jìn)行了總結(jié)。
(1)作者經(jīng)驗(yàn)豐富:從事安全工作多年,看雪論壇版主,在逆向工程和移動安全領(lǐng)域積累了豐富的經(jīng)驗(yàn)。(2)原理講解深入:通過深入解析unidbg主要功能和模塊的源代碼來講解unidbg的工作原理和實(shí)現(xiàn)細(xì)節(jié),授人予漁。(3)包含大量案例:通過大量案例講解和演示了如何利用unidbg來解決各種逆向工程的難題,手把手教。(4)注重生產(chǎn)實(shí)踐:無論是理論講解,還是實(shí)戰(zhàn)案例,都直接瞄準(zhǔn)生產(chǎn)環(huán)境,帶領(lǐng)讀者解決工程環(huán)境中的真實(shí)問題。
Preface?前 言
寫作背景
現(xiàn)在的App,只要是稍微對安全有一些要求的,都會把核心邏輯、加解密算法或者保護(hù)機(jī)制,比如一些反調(diào)試手段,使用NDK開發(fā)的方式寫到Native庫中,最終生成so文件。
so文件的逆向比Java層的DEX要困難很多,如果文件中還有比較嚴(yán)重的混淆或者花指令的話,可能連正常的反編譯都成問題,更不用說查看它采用的是什么算法了。不僅如此,現(xiàn)在ARM平臺上還出現(xiàn)了讓算法完全消失的虛擬機(jī)保護(hù)(Virtual Machine Protect)技術(shù),該技術(shù)通過自定義字節(jié)碼的方式實(shí)現(xiàn)一套自己的CPU。如果不能理解這套虛擬機(jī)的運(yùn)行流程,逆向算法便無從談起。
下圖為一個經(jīng)過OLLVM強(qiáng)混淆的簡單RC4算法,僅僅幾行代碼就能混淆出千頭萬緒、雜亂無章、面目全非的數(shù)萬行偽代碼。如果再嵌套幾個手寫的非標(biāo)準(zhǔn)算法,還原難度可以達(dá)到“地獄級”。
“兵來將擋,水來土掩!毙疫\(yùn)的是,隨著技術(shù)的發(fā)展,可以應(yīng)對這樣場景的對抗方案出現(xiàn)了。正如AlphaGo在大戰(zhàn)李世石時依賴暴力下棋法一樣,我們也可以不還原某段算法,而是憑借現(xiàn)代計算機(jī)的超高算力,直接暴力執(zhí)行這段算法。
在模擬執(zhí)行的過程中,算法是黑盒,我們并不直接分析這個黑盒,而是直接讓它運(yùn)行,它需要什么我們就給它補(bǔ)充什么,以確保它能順利地執(zhí)行完算法,生成我們需要的結(jié)果。
這個模擬執(zhí)行的框架就是unidbg。
本書特點(diǎn)
1)由淺至深。我們先讓unidbg框架運(yùn)行起來,比如能夠加載so文件,完成基礎(chǔ)的補(bǔ)環(huán)境,排除基本報錯,支持Hook功能,執(zhí)行so文件中的算法。待基本的使用沒有問題之后,再進(jìn)階到原理部分,詳解so文件是如何加載和運(yùn)行的,以及內(nèi)存、信號、虛擬機(jī)、系統(tǒng)調(diào)用等是如何模擬真實(shí)的Android系統(tǒng)環(huán)境的,帶領(lǐng)大家實(shí)現(xiàn)一個類似框架。
2)授人以魚,同時授人以漁。在使用unidbg框架的時候,各種報錯千奇百怪,尤其是難以定位的內(nèi)存問題。很多時候,在A處沒有進(jìn)行處理或者初始化,卻在B處報錯。此時如果不能進(jìn)行全局綜合分析,或者缺乏對so的初始化和函數(shù)調(diào)用流程的完整把握與清晰認(rèn)知,那么我們將無從下手。因此在學(xué)習(xí)本書的過程中,更重要的是知識深度與廣度的積累,只有真正理解并掌握unidbg的原理,高屋建瓴、把握全局,最終才能做到游刃有余。
3)內(nèi)容翔實(shí)、豐富,實(shí)用性強(qiáng)。本書介紹unidbg的方方面面,從應(yīng)用到原理,從案例到檢測,不僅可以運(yùn)行算法,還可以輔助算法還原,因此可以作為unidbg的操作寶典來學(xué)習(xí)、參考。
閱讀對象
本書是一本理論與實(shí)戰(zhàn)并舉,全方位介紹unidbg的使用、原理及實(shí)現(xiàn)細(xì)節(jié)的著作,適合以下幾類讀者閱讀:
移動應(yīng)用安全方向的安全工程師。
計算機(jī)組成原理和軟件模擬方向的應(yīng)用開發(fā)者。
自動化領(lǐng)域的爬蟲工程師。
反欺詐/風(fēng)控領(lǐng)域的安全工程師。
如何閱讀本書
本書共31章,分為4部分。
第一部分(第1~3章) 進(jìn)入unidbg的世界。通過閱讀該部分,讀者可以簡單了解unidbg的基礎(chǔ)知識,通過unidbg執(zhí)行一些基本的操作,包括環(huán)境準(zhǔn)備、so文件加載、簡單補(bǔ)環(huán)境、Hook和Patch的方法等。
第二部分(第4~15章) unidbg原理。由于unidbg主要是用Java寫的,代碼比較通俗易懂,且核心原理參照的是Android系統(tǒng),可以說是一個縮小版AndroidLite,因此如果有哪部分看不懂,可以直接參考Android源碼。讀完該部分,讀者會對unidbg核心原理有比較完整的認(rèn)識。
第三部分(第16~26章) 模擬執(zhí)行與補(bǔ)環(huán)境實(shí)戰(zhàn)。該部分主要介紹unidbg實(shí)戰(zhàn)中的各種具體技術(shù)案例,如I/O重定向、Debugger自吐、指針參數(shù)與Debugger、魔改Base64還原、使用unidbg動態(tài)分析內(nèi)存中的數(shù)據(jù)、使用unidbg主動調(diào)用fork進(jìn)程,并對補(bǔ)環(huán)境中的補(bǔ)環(huán)境入門、標(biāo)識記錄、設(shè)備風(fēng)控、補(bǔ)環(huán)境加強(qiáng)等進(jìn)行分析,指導(dǎo)讀者編寫實(shí)際的補(bǔ)環(huán)境代碼,更好地將理論知識運(yùn)用于實(shí)踐。
第四部分(第27~31章) 反制與生產(chǎn)環(huán)境部署。該部分介紹環(huán)境變量檢測、xHook框架檢測、JNI層常見函數(shù)處理等,并對常規(guī)檢測進(jìn)行總結(jié),還介紹通過檢測之后如何把so部署到x86服務(wù)器上運(yùn)行。該部分是大家最關(guān)心的批量生產(chǎn)與對抗的內(nèi)容,也是最敏感的支持風(fēng)控數(shù)據(jù)與決策的內(nèi)容,對于打擊黑灰產(chǎn)、遏制網(wǎng)絡(luò)犯罪有著非常積極的意義。
資源與勘誤
由于知識的動態(tài)發(fā)展和不斷更新,加之筆者水平有限,書中難免有考慮不周之處,還望讀者海涵。讀者可以在GitHub上提issue,與筆者一起討論,地址為https://github.com/r0ysue/UnidbgBook。本書相關(guān)資源也會上傳到該地址,讀者可自行下載、查閱。
致謝
感謝我的父母。感謝凱R開源unidbg這個功能如此強(qiáng)大的框架。感謝bxl、凍魚戰(zhàn)神、Forgo7ten,感謝看雪學(xué)院和段鋼先生,感謝寒冰冷月、imyang、灰翔的貓,感謝白龍、寄予藍(lán),感謝葫蘆娃、非蟲,感謝52pojie、國防科技大學(xué),是你們的支持和幫助讓這本書順利
面市!
陳佳林 (ID:r0ysue)
資深安全技術(shù)專家,在逆向工程、移動安全領(lǐng)域積累了豐富的經(jīng)驗(yàn)。曾為政府機(jī)關(guān)單位提供涉密項(xiàng)目研究開發(fā),多次為銀行和電信行業(yè)以及政府部門提供安全方面的培訓(xùn)服務(wù)?囱┱搲陌嬷骱唾Y深講師,看雪“安卓高級研修班”負(fù)責(zé)人,在看雪安全開發(fā)者峰會、GeekPwn 發(fā)表主題演講,在看雪論壇、安全客、Freebuf 等平臺發(fā)表大量技術(shù)文章。著有《安卓 Frida 逆向與抓包實(shí)戰(zhàn)》《安卓Frida 逆向與協(xié)議分析》《Frida 安卓 SO 逆向深入實(shí)踐》等書籍。開源項(xiàng)目r0capture 在 Github 的 star 數(shù)量超過 5000 個。
目 錄?Contents
前 言
第一部分 進(jìn)入unidbg的世界
第1章 unidbg環(huán)境準(zhǔn)備與快速
上手 2
1.1 r0env環(huán)境介紹與集成 2
1.1.1 r0env各組件介紹 2
1.1.2 r0env下載及安裝 5
1.2 IDEA安裝及配置 6
1.3 第一個unidbg項(xiàng)目 7
1.3.1 unidbg介紹 7
1.3.2 unidbg下載與運(yùn)行示例 8
1.3.3 unidbg示例講解 9
1.4 本章小結(jié) 13
第2章 unidbg模擬執(zhí)行初探 14
2.1 第一個NDK項(xiàng)目 14
2.1.1 使用Android Studio創(chuàng)建NDK項(xiàng)目 14
2.1.2 編寫自己的so業(yè)務(wù)代碼 16
2.2 unidbg的符號調(diào)用與地址調(diào)用 18
2.2.1 unidbg主動調(diào)用前置準(zhǔn)備 18
2.2.2 unidbg主動調(diào)用so函數(shù) 19
2.2.3 unidbg部分API簡單講解 22
2.3 本章小結(jié) 24
第3章 unidbg補(bǔ)環(huán)境、Hook與
Patch 25
3.1 為so添加交互:使用JNI接口
編寫md5方法 25
3.2 使用unidbg修補(bǔ)執(zhí)行環(huán)境并
模擬執(zhí)行 27
3.3 脫離編譯器,使用命令行
編譯so 34
3.4 unidbg的Hook 36
3.5 unidbg的Patch 39
3.6 本章小結(jié) 42
第二部分 unidbg原理
第4章 ELF文件執(zhí)行視圖解析 44
4.1 ELF文件結(jié)構(gòu) 44
4.1.1 ELF頭部結(jié)構(gòu) 45
4.1.2 程序頭部表 47
4.1.3 動態(tài)節(jié)區(qū)_DYNAMIC段 51
4.2 深入jelf代碼細(xì)節(jié),探究ELF
解析 54
4.2.1 分析原版jelf代碼 54
4.2.2 分析unidbg版jelf代碼 56
4.3 本章小結(jié) 60
第5章 Unicorn的初級使用與初探Linker 61
5.1 Unicorn的初級使用:模擬執(zhí)行與Hook 61
5.1.1 使用Unicorn進(jìn)行模擬
執(zhí)行 61
5.1.2 Unicorn的Hook 64
5.1.3 Keystone與Capstone 70
5.2 初探Android系統(tǒng)源碼 71
5.2.1 Java層代碼追蹤 73
5.2.2 Native層代碼追蹤 75
5.3 本章小結(jié) 78
第6章 深入Linker:so的加載、
鏈接、初始化 79
6.1 so的加載過程 79
6.2 so的鏈接過程 90
6.3 so的初始化操作 100
6.4 本章小結(jié) 102
第7章 使用Unicorn模擬Linker:so的加載過程 103
7.1 模擬Linker?:環(huán)境準(zhǔn)備 103
7.2 模擬Linker?:so的加載 109
7.3 動態(tài)調(diào)試Linker,探究so的內(nèi)存
布局圖 118
7.4 本章小結(jié) 122
第8章 使用Unicorn模擬Linker:
so的鏈接過程 123
8.1 so的依賴庫加載過程 123
8.2 so的動態(tài)鏈接 127
8.3 初嘗試:使用unidbg模擬執(zhí)行
簡單so文件 131
8.4 探究unidbg的Linker代碼
細(xì)節(jié) 133
8.4.1 unidbg加載so文件代碼
入口 134
8.4.2 處理so信息并載入內(nèi)存 135
8.4.3 對so的依賴庫進(jìn)行處理 137
8.4.4 重定位操作 138
8.4.5 處理so的初始化信息與生成module對象 140
8.4.6 執(zhí)行初始化 141
8.5 本章小結(jié) 142
第9章 R0dbg實(shí)戰(zhàn)與Unidbg_FindKey 143
9.1 模擬Linker?:so的初始化過程 143
9.2 指令追蹤與排錯 147
9.2.1 TLS線程局部存儲環(huán)境
初始化 148
9.2.2 R0dbg對系統(tǒng)調(diào)用進(jìn)行
處理 150
9.3 使用R0dbg模擬執(zhí)行so 152
9.4 Unidbg_FindKey牛刀小試 154
9.5 本章小結(jié) 157
第10章 unidbg源碼解析:AndroidEmulator 158
10.1 創(chuàng)建AndroidEmulator 158
10.2 創(chuàng)建FileSystem 165
10.3 創(chuàng)建Backend 168
10.4 創(chuàng)建SvcMemory 169
10.5 本章小結(jié) 172
第11章 unidbg源碼解析:
DalvikVM 173
11.1 分析createDalvikVM() 173
11.2 Dvm相關(guān)類介紹 178
11.2.1 BaseVM解析 179
11.2.2 DalvikVM解析 184
11.2.3 DvmObject解析 185
11.2.4 DvmClass解析 187
11.3 本章小結(jié) 188
第12章 unidbg源碼解析:模擬
執(zhí)行流程追蹤 189
12.1 編寫含JNI交互的MD5算法并
模擬執(zhí)行 189
12.1.1 編寫含JNI交互的so 189
12.1.2 使用unidbg進(jìn)行模擬
執(zhí)行 190
12.2 模擬執(zhí)行流程追蹤:尋找
函數(shù) 192
12.3 模擬執(zhí)行流程追蹤:處理參數(shù)
并模擬執(zhí)行 195
12.4 本章小結(jié) 202
第13章 unidbg源碼解析:JNI
交互流程追蹤 203
13.1 JNI注冊 203
13.2 JNI指令執(zhí)行 208
13.3 本章小結(jié) 217
第14章 unidbg源碼解析:
Memory 218
14.1 Memory模塊的創(chuàng)建 218
14.2 AndroidElfLoader的方法實(shí)現(xiàn) 219
14.2.1 內(nèi)存相關(guān)方法實(shí)現(xiàn) 219
14.2.2 ?臻g相關(guān)方法實(shí)現(xiàn) 226
14.2.3 用戶常用方法解析 227
14.2.4 虛擬模塊 230
14.3 加載so的loader功能 231
14.4 本章小結(jié) 237
第15章 unidbg源碼解析:
Hook 238
1