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