#### **Root的危害**
* Android通過用戶隔離來保障每個應用的安全
* 每個App都可以申請Root權限
* Root后,你的App就可以被其他App訪問
* 內存被篡改
* 行為被監控
* ……
:-: 
圖1
:-: 
圖2 被注入后的Chrome進程
#### **App劫持**
**什么是App劫持?**
* App劫持:App的執行流程被重定向
* 通常通過“注入+Hook”來實現
:-: 
圖3:APP劫持示例
**App劫持過程**
* Step1: 逆向分析App的邏輯
* Step2: 注入模塊到App進程中
* Ptrace
* Dlopen
* Step3: Hook
* Java Hook
* Native(so) Hook
:-: 
圖4:注入Hook過程
#### **Hook詳解**
**具有Hook行為的App**
* 病毒
* 數量較少
* 開發hook模塊成本較高
* 需要root
* 安全軟件
* 主動防御
#### **Hook類病毒**
Wind Seeker

代碼示例:


#### **Hook類型**
* Java Hook
* Static Field Hook:靜態成員hook
* Method Hook:函數hook
* Native So Hook
* GOT Hook:全局偏移表hook
* SYM Hook:符號表hook
* Inline Hook:函數內聯hook
#### **Java靜態成員Hook**
* 修改Java Class的靜態成員的值
* 通過反射
~~~
Class<?> cls = Class.ForName(“”)
Field fld = cls.getDeclaredField(“”)
~~~
* 為什么是靜態成員static field?
* 反射只能得到Class,不能得到object
**Java static field hook示例**
:-: 
圖5 Java static field hook示例
#### **Java函數hook**
* 修改Java類的某函數指向自定義函數
* Dalvik:Java Method -> Native Method
* ART:Method Inline Hook
**Dalvik:**
* Java函數在內存中指向的是字節碼:Method->insns
* 字節碼inline hook?復雜!
* 將Java函數轉為Native函數
* Method->nativeFunc 指向So中的函數
:-: 
圖6 Java函數hook之Dalvik
#### **So GOT Hook**
* 修改App加載的so中Got表里函數的絕對地址
* GOT
* Global Offset Table:全局偏移表
* 存儲了依賴庫so的函數的絕對地址
* PLT
* Procedure Linkage Table:過程鏈接表
* 將當前so內對依賴庫函數的相對調用轉移到Got中的絕對地址
**正常執行流程**

**Hook后執行流程**

#### **So SYM Hook**
* 修改App加載的So的符號表里的函數地址
* 缺點:
* 必須在so加載前hook
**So SYM hook流程**

#### **So Inline Hook**
* 修改App加載的So的函數里的代碼
* 跳轉有范圍限制,需要跳板
* 需要兼容arm和thumb指令
* 優點:覆蓋面廣
* 缺點:難度高,不穩定
**So inline Hook流程**

#### **Hook Zygote**
* 全局hook的方法:
* Hook當前已運行的所有App進程,監聽新進程
* Hook Zygote進程
* App進程是有Zygote孵化出來的
* 如果Zygote被注入/hook,其他App都將被注入/hook
**Hook前**
:-: 
圖7 HookZygote前
**Hook后**
:-: 
圖8 HookZygote前
#### **流行的Hook框架**
* Xposed
* http://repo.xposed.info/
* Cydia Substrate
* http://www.cydiasubstrate.com/
* ADBI/DDI
* https://github.com/crmulliner/adbi
* https://github.com/crmulliner/ddi
* frida Hook框架
* https://www.frida.re/
Frida是一款基于python + javascript 的hook框架,通殺android\ios\linux\win\osx等各平臺。由于是基于腳本的交互,因此相比xposed和substrace cydia更加便捷
**流行的Hook框架:Xposed**
* 目前使用最廣的Android平臺開源hook框架
* 替換App_Process
* Java函數轉為Native函數
* 在被hook函數執行時,調用BeforeHook/AfterHook接口
* 添加/刪除hook需要重啟zygote
**流行的Hook框架:Cydia Substrate**
* 兼容iOS和Android
* 在iOS平臺使用廣泛
* 需要重啟Zygote
**流行的Hook框架對比**

### **App劫持檢測/修復**
#### **Hook檢測/修復:Java Hook**
* 靜態成員hook
* 檢測:根據變量的class判定是否屬于當前App的classes.dex
* 修復:無法修復:無法獲得原始值
:-: 
圖9 Hook檢測或修復:Java靜態成員Hook
* 函數hook
* Dalvik:Java->Native
* 檢測:
* 根據nativFunc找到對應的BridgeFunction,判定其是否在libdvm.so內存區間;
* 判斷insns指向的so內存區間
* 修復:無法修復,Native->Java不可逆
:-: 
圖10 Hook檢測/修復:Java 函數Hook
#### **注入修復**
* 為什么要修復注入?
* 有可能只注入、不hook:監聽線程
* Hook:摘除鉤子
* 修復注入的方法
* munmap
* 必須先將hook修復
* 不穩定,容易crash
#### **修復Zygote**
* 如何保證Zygote進程不被hook?
* Init啟動Zygote進程
* 在hook之前就將Zygote保護起來
* 怎么保證在其他App之前啟動?
* 學習Xposed,替換app_process?
* 需要重啟
* 不夠穩定,兼容性
* 對所有App有效,可配性不高
#### **App劫持修復:結論**
* Hook摘除不穩定,容易crash
* 三個“基本”結論:
* Hook基本無法修復
* 注入基本無法剔除
* Zygote基本無法保護
#### **離我的App遠點!——創建可信App運行環境**
**創建App可信運行環境**
* 創建可信的Zygote進程
* 保護可信的Zygote
* 讓App從干凈的Zygote進程fork
**一、創建可信Zygote進程**
* Step1:啟動一個新的Zygote進程
* 編譯自定義app_process
* 無需重啟
:-: 
圖11 啟動一個新的Zygote進程
**二、保護可信Zygote進程**
* Step2: 保護可信Zygote
* 反調試/反注入
* Ptrace_me
* 雙進程保護
* 其他保護
:-: 
圖12 保護可信Zygote進程
**三、控制可信Zygote出口**
* 通過可信Zygote fork自定義App
* 重定向ActivityManagerService發送的socket client
* 控制進程
* 需要保護的App:發送給可信Zygote
* 無需保護的App:發送給舊Zygote
:-: 
圖13 控制可信Zygote出口
示例:整體流程

#### **參考文章**
[插件化知識詳細分解及原理 之代理,hook,反射](http://blog.csdn.net/yulong0809/article/details/56842027)
[知識總結之 插件化學習 Hook系統方法分析](http://blog.csdn.net/cankingapp/article/details/73292035)
[Android插件化原理解析——Hook機制之動態代理](https://www.jianshu.com/p/b30ea19c444b)
[在Android中實現Hook機制的實驗](http://blog.csdn.net/zoudifei/article/details/49871065)
[淺談android hook技術](https://sec.xiaomi.com/article/23)
[Android安全技術揭秘與防范](http://www.java1234.com/a/javabook/andriod/2017/0920/8971.html)
[Android應用劫持攻與防](http://www.java1234.com/a/javabook/andriod/2017/0908/8865.html)
[《Android安全技術揭秘與防范》目錄—導讀 ](https://yq.aliyun.com/articles/99909?spm=5176.11065265.1996646101.searchclickresult.aa2a61pRyf47)
- 前言
- Android系統的體系結構
- Dalvik VM 和 JVM 的比較
- Android 打包應用程序并安裝的過程
- Android ADB工具
- Android應用開發
- Android UI相關知識總結
- Android 中window 、view、 Activity的關系
- Android應用界面
- Android中的drawable和bitmap
- AndroidUI組件adapterView及其子類和Adapter的關系
- Android四大組件
- Android 數據存儲
- SharedPreference
- Android應用的資源
- 數組資源
- 使用Drawable資源
- Material Design
- Android 進程和線程
- 進程
- 線程
- Android Application類的介紹
- 意圖(Intent)
- Intent 和 Intent 過濾器(Google官網介紹)
- Android中關于任務棧的總結
- 任務和返回棧(官網譯文)
- 總結
- Android應用安全現狀與解決方案
- Android 安全開發
- HTTPS
- 安卓 代碼混淆與打包
- 動態注入技術(hook技術)
- 一、什么是hook技術
- 二、常用的Hook 工具
- Xposed源碼剖析——概述
- Xposed源碼剖析——app_process作用詳解
- Xposed源碼剖析——Xposed初始化
- Xposed源碼剖析——hook具體實現
- 無需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid應用
- 四、Hook原生應用程序
- 五、Hook 檢測/修復
- Android 應用的逆向與加固保護技術
- OpenCV在Android中的開發
- Android高級開發進階
- 高級UI
- UI繪制流程及原理
- Android新布局ConstraintLayout約束布局
- 關鍵幀動畫
- 幀動畫共享元素變換
- Android異步消息處理機制完全解析,帶你從源碼的角度徹底理解
- Android中為什么主線程不會因為Looper.loop()里的死循環卡死?
- 為什么 Android 要采用 Binder 作為 IPC 機制?
- JVM 中一個線程的 Java 棧和寄存器中分別放的是什么?
- Android源碼的Binder權限是如何控制?
- 如何詳解 Activity 的生命周期?
- 為什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了嗎?
- Android屏幕刷新機制