因為項目要求,需要實作相容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