本書由淺入深、循序漸進地講解了Android 系統的軟件安全、逆向分析與加密解密技術。包括Android軟件逆向分析和系統安全方面的必備知識及概念、如何靜態分析Android 軟件、如何動態調試Android 軟件、Android 軟件的破解與反破解技術的探討,以及對典型Android 病毒的全面剖析。
本書適合所有Android 應用開發者、Android 系統開發工程師、Android 系統安全工作者閱讀學習。 豐生強(網名非蟲)
Android軟件安全專家。看雪論壇Android安全版版主;安卓巴士開發交流版版主。
對Android軟件與系統安全有狂熱的愛好和獨到的見解,對Android系統的全部源代碼進行過深入地研究和分析。逆向分析實戰經驗豐富。
在國內信息安全雜誌上發表過多篇有價值的軟件安全文章,目前就職於國內某Android開發企業,常年混跡於看雪論壇(ID非蟲)。
作者郵箱:fei_cong@hotmail.com
願與國內安全愛好者***同交流與探討安全技術。 第1章Android程序分析環境搭建 1 1.1Windows分析環境搭建 1 1.1.1安裝JDK 1 1.1.2安裝Android SDK 3 1.1.3安裝Android NDK 5 1.1.4Eclipse集成開發環境 6 1.1.5安裝CDT、ADT插件 6 1.1.6創建Android Virtual Device 8 1.1.7使用到的工具 9 1.2Linux分析環境搭建 9 1.2.1本書的Linux環境 9 1.2.2安裝JDK 9 1.2.3在Ubuntu上安裝Android SDK 10 1.2.4在Ubuntu上安裝Android NDK 11 1.2.5在Ubuntu上安裝Eclipse集成開發環境 12 1.2.6在Ubuntu上安裝CDT、ADT插件 13 1.2.7創建Android Virtual Device 13 1.2.8使用到的工具 15 1.3本章小結 15 第2章如何分析Android程序 16 2.1編寫第壹個Android程序 16 2.1.1使用Eclipse創建Android工程 16 2.1.2編譯生成APK文件 19 2.2破解第壹個程序 20 2.2.1如何動手? 20 2.2.2反編譯APK文件 20 2.2.3分析APK文件 21 2.2.4修改Smali文件代碼 26 2.2.5重新編譯APK文件並簽名 26 2.2.6安裝測試 27 2.3本章小結 28 第3章進入Android Dalvik虛擬機 29 3.1Dalvik虛擬機的特點——掌握Android程序的運行原理 29 3.1.1Dalvik虛擬機概述 29 3.1.2Dalvik虛擬機與Java虛擬機的區別 29 3.1.3Dalvik虛擬機是如何執行程序的 34 3.1.4關於Dalvik虛擬機JIT(即時編譯) 36 3.2Dalvik匯編語言基礎為分析Android程序做準備 37 3.2.1Dalvik指令格式 37 3.2.2DEX文件反匯編工具 39 3.2.3了解Dalvik寄存器 40 3.2.4兩種不同的寄存器表示方法——v命名法與p命名法 42 3.2.5Dalvik字節碼的類型、方法與字段表示方法 43 3.3Dalvik指令集 44 3.3.1指令特點 45 3.3.2空操作指令 45 3.3.3數據操作指令 46 3.3.4返回指令 46 3.3.5數據定義指令 46 3.3.6鎖指令 47 3.3.7實例操作指令 47 3.3.8數組操作指令 48 3.3.9異常指令 48 3.3.10跳轉指令 48 3.3.11比較指令 49 3.3.12字段操作指令 50 3.3.13方法調用指令 50 3.3.14數據轉換指令 51 3.3.15數據運算指令 51 3.4Dalvik指令集練習——寫壹個Dalvik版的Hello World 52 3.4.1編寫smali文件 52 3.4.2編譯smali文件 54 3.4.3測試運行 54 3.5本章小結 55 第4章Android可執行文件 56 4.1Android程序的生成步驟 56 4.2Android程序的安裝流程 59 4.3dex文件格式 66 4.3.1dex文件中的數據結構 66 4.3.2dex文件整體結構 68 4.3.3dex文件結構分析 71 4.4odex文件格式 80 4.4.1如何生成odex文件 80 4.4.2odex文件整體結構 81 4.4.3odex文件結構分析 83 4.5dex文件的驗證與優化工具dexopt的工作過程 88 4.6Android應用程序另類破解方法 91 4.7本章小結 93 第5章靜態分析Android程序 94 5.1什麽是靜態分析 94 5.2快速定位Android程序的關鍵代碼 94 5.2.1反編譯apk程序 94 5.2.2程序的主Activity 95 5.2.3需重點關註的Application類 95 5.2.4如何定位關鍵代碼——六種方法 96 5.3smali文件格式 97 5.4Android程序中的類 100 5.4.1內部類 100 5.4.2監聽器 102 5.4.3註解類 105 5.4.4自動生成的類 108 5.5閱讀反編譯的smali代碼 110 5.5.1循環語句 110 5.5.2switch分支語句 115 5.5.3try/catch語句 121 5.6使用IDA Pro靜態分析Android程序 127 5.6.1IDA Pro對Android的支持 127 5.6.2如何操作 128 5.6.3定位關鍵代碼——使用IDA Pro進行破解的實例 132 5.7惡意軟件分析工具包——Androguard 135 5.7.1Androguard的安裝與配置 135 5.7.2Androguard的使用方法 137 5.7.3使用Androguard配合Gephi進行靜態分析 144 5.7.4使用androlyze.py進行靜態分析 148 5.8其他靜態分析工具 152 5.9閱讀反編譯的Java代碼 152 5.9.1使用dex2jar生成jar文件 152 5.9.2使用jd-gui查看jar文件的源碼 153 5.10集成分析環境——santoku 154 5.11本章小結 156 第6章基於Android的ARM匯編語言基礎——逆向原生! 157 6.1Android與ARM處理器 157 6.1.1ARM處理器架構概述 157 6.1.2ARM處理器家族 158 6.1.3Android支持的處理器架構 159 6.2原生程序與ARM匯編語言——逆向妳的原生Hello ARM 160 6.2.1原生程序逆向初步 160 6.2.2原生程序的生成過程 162 6.2.3必須了解的ARM知識 164 6.3ARM匯編語言程序結構 166 6.3.1完整的ARM匯編程序 166 6.3.2處理器架構定義 167 6.3.3段定義 168 6.3.4註釋與標號 169 6.3.5匯編器指令 169 6.3.6子程序與參數傳遞 170 6.4ARM處理器尋址方式 170 6.4.1立即尋址 170 6.4.2寄存器尋址 171 6.4.3寄存器移位尋址 171 6.4.4寄存器間接尋址 171 6.4.5基址尋址 171 6.4.6多寄存器尋址 171 6.4.7堆棧尋址 172 6.4.8塊拷貝尋址 172 6.4.9相對尋址 172 6.5ARM與Thumb指令集 173 6.5.1指令格式 173 6.5.2跳轉指令 174 6.5.3存儲器訪問指令 175 6.5.4數據處理指令 177 6.5.5其他指令 184 6.6用於多媒體編程與浮點計算的NEON與VFP指令集 185 6.7本章小結 186 第7章Android NDK程序逆向分析 187 7.1Android中的原生程序 187 7.1.1編寫壹個例子程序 187 7.1.2如何編譯原生程序 188 7.2原生程序的啟動流程分析 194 7.2.1原生程序的入口函數 194 7.2.2main函數究竟何時被執行 198 7.3原生文件格式 199 7.4原生C程序逆向分析 200 7.4.1原生程序的分析方法 200 7.4.2for循環語句反匯編代碼的特點 204 7.4.3if...else分支語句反匯編代碼的特點 208 7.4.4while循環語句反匯編代碼的特點 211 7.4.5switch分支語句反匯編代碼的特點 215 7.4.6原生程序的編譯時優化 218 7.5原生C++程序逆向分析 222 7.5.1C++類的逆向 222 7.5.2Android NDK對C++特性的支持 225 7.5.3靜態鏈接STL與動態鏈接STL的代碼區別 227 7.6Android NDK JNI API逆向分析 232 7.6.1Android NDK提供了哪些函數 232 7.6.2如何靜態分析Android NDK程序 233 7.7本章小結 235 第8章動態調試Android程序 236 8.1Android動態調試支持 236 8.2DDMS的使用 237 8.2.1如何啟動DDMS 237 8.2.2使用LogCat查看調試信息 238 8.3定位關鍵代碼 240 8.3.1代碼註入法——讓程序自己吐出註冊碼 240 8.3.2棧跟蹤法 244 8.3.3Method Profiling 247 8.4使用AndBug調試Android程序 250 8.4.1安裝AndBug 251 8.4.2使用AndBug 251 8.5使用IDA Pro調試Android原生程序 254 8.5.1調試Android原生程序 255 8.5.2調試Android原生動態鏈接庫 256 8.6使用gdb調試Android原生程序 260 8.6.1編譯gdb與gdbserver 260 8.6.2如何調試 262 8.7本章小結 264 第9章Android軟件的破解技術 265 9.1試用版軟件 265 9.1.1試用版軟件的種類 265 9.1.2實例破解——針對授權KEY方式的破解 265 9.2序列號保護 271 9.3網絡驗證 272 9.3.1網絡驗證保護思路 272 9.3.2實例破解——針對網絡驗證方式的破解 273 9.4In-app Billing(應用內付費) 277 9.4.1In-app Billing原理 277 9.4.2In-app Billing破解方法 280 9.5Google Play License保護 281 9.5.1Google Play License保護機制 281 9.5.2實例破解——針對Google Play License方式的破解 283 9.6重啟驗證 284 9.6.1重啟驗證保護思路 285 9.6.2實例破解——針對重啟驗證方式的破解 285 9.7如何破解其他類型的Android程序 296 9.7.1Mono for Android開發的程序及其破解方法 296 9.7.2Qt for Android開發的程序及其破解方法 301 9.8本章小結 309 第10章Android程序的反破解技術 310 10.1對抗反編譯 310 10.1.1如何對抗反編譯工具 310 10.1.2對抗dex2jar 311 10.2對抗靜態分析 312 10.2.1代碼混淆技術 312 10.2.2NDK保護 315 10.2.3外殼保護 316 10.3對抗動態調試 316 10.3.1檢測調試器 316 10.3.2檢測模擬器 317 10.4防止重編譯 318 10.4.1檢查簽名 318 10.4.2校驗保護 319 10.5本章小結 320 第11章Android系統攻擊與防範 321 11.1Android系統安全概述 321 11.2手機ROOT帶來的危害 321 11.2.1為什麽要ROOT手機 321 11.2.2手機ROOT後帶來的安全隱患 322 11.2.3Android手機ROOT原理 322 11.3Android權限攻擊 329 11.3.1Android權限檢查機制 329 11.3.2串謀權限攻擊 333 11.3.3權限攻擊檢測 336 11.4Android組件安全 339 11.4.1Activity安全及Activity劫持演示 340 11.4.2Broadcast Receiver 安全 343 11.4.3Service安全 345 11.4.4Content Provider安全 346 11.5數據安全 347 11.5.1外部存儲安全 347 11.5.2內部存儲安全 348 11.5.3數據通信安全 350 11.6ROM安全 351 11.6.1ROM的種類 352 11.6.2ROM的定制過程 352 11.6.3定制ROM的安全隱患 359 11.6.4如何防範 360 11.7本章小結 361 第12章DroidKongFu變種病毒實例分析 362 12.1DroidKongFu病毒介紹 362 12.2配置病毒分析環境 363 12.3病毒執行狀態分析 364 12.3.1使用APIMonitor初步分析 365 12.3.2使用DroidBox動態分析 369 12.3.3其他動態分析工具 373 12.4病毒代碼逆向分析 376 12.4.1Java層啟動代碼分析 376 12.4.2Native層啟動代碼分析 381 12.4.3Native層病毒核心分析 393 12.5DroidKongFu病毒框架總結 404 12.6病毒防治 406 12.7本章小結 406