天天看點

Android 5.0/5.1 HOOK技術探究

    因為項目要求,需要實作相容Android 4.X到5.X平台的HOOK技術。主要相容的ROM廠商為華為、三星、小米等。

    之前已經實作過基于Android 4.X的HOOK技術,共有以下三種方案(都調試成功):                       (1)方案1:使用Xposed架構(Dalvik虛拟機層HOOK),但是弊端是需要安裝版本相容的Xposed(部分國産機ROM很挑Xposed版本,如小米和nubia),且修改系統檔案存在一定風險;                       (2)方案2:使用與Xposed架構實作HOOK原理基本相同的開源架構ddi,但每次使用時需要進行注入操作;                       (3)方案3:使用got HOOK技術(Native層HOOK),每次使用時需要進行注入操作;

    Android 5.X版本遇到的問題是:(1)問題1:Dalvik虛拟機被完全替換為ART,是以上面的方案2不可行;                                                        (2)問題2:Xposed作者在XDA釋出了Xposed 3.0版本,通過替換libart.so來實作對Android 5.X版本的HOOK。但是,安裝Xposed 3.0版本需要刷入首先刷入customed recovery,然後再卡刷Xposed包來實作替換libart.so。這種刷機的方式不适合項目要求,同時對于三星的機型還具有bootloop的可能性,需要安裝非官方的定制版Xposed。是以我也放棄了方案1。                                                        (3)問題3:很多Android 5.X機型的SELinux級别預設為Enforcing,會預設攔截注入行為;

    對于問題1,可以選擇使用ART HOOK技術,但是這種通用的技術還未成熟(如可能導緻虛拟機崩潰[1][2]),是以我選擇了方案3。雖然Dalvik層被替換掉了,但是底層的Linux系統沒有較大變化,仍然可以使用Linux中通用的got/plt elf HOOK技術。該方法較為簡單和穩定,但是同樣需要ptrace注入操作。     我的測試機包括一台HUAWEI 榮耀7(Android 5.0.2)、一台HUAWEI 榮耀4A(Android 5.1.1)、一台Samsung Galaxy on7(Android 5.1.1)。三台手機都隻經過解鎖和root,是原廠ROM。榮耀7的SELinux狀态為Permissive,不攔截注入;另兩台為Enforcing,會攔截注入。具體來說,就是會攔截被HOOK程序調用dlopen()函數打開被注入的so操作,導緻注入失敗。     對于HUAWEI的測試機,其SELinux狀态可以簡單通過"setenforce 0"更改為Permissive。LBE也曾采取關閉SELinux的方式來實作注入[3]。     對于Samsung測試機,其SELinux狀态無法簡單修改。但是通過使用logcat檢視avc資訊,可以找到被禁止的SELinux規則。再通過[4]的方法添加缺失的規則,即可順利注入目标程序。           

參考連結:     [1]http://bbs.pediy.com/showthread.php?t=204183    《Android5.1 Art Hook 技術分享》luciya     [2]http://blog.csdn.net/l173864930/article/details/45035521     《Android Art Hook 技術方案》低端碼農     [3]http://bbs.pediy.com/showthread.php?t=182495      《LBE安全大師支援Android 4.4注入分析》 ImaxAndroi     [4]http://forum.xda-developers.com/android/software/setools-android-sepolicy-inject-t2977563   《 Announcement from Mikos: Sepolicy-inject - opensource tool for changing SELinux policy at runtime (alternative to supolicy)》 XDA                                                       

繼續閱讀