分享一種andorid資源載入技術
申明,本著技術交流,不喜勿噴
此技術可於App資源加密,資源動態載入,比如so加密替換,jar包替換,res檔案替換,dex檔案替換。Apk自身許可權內所有檔案都可通過此技術替換(系統訪問部份除外)
App本質是一個zip壓縮包
Android App中資源大概分為 dex,assert目錄,res目錄,values目錄,lib目錄,以及其它自定義目錄,如下圖
程式訪問asserts目錄時通過AssetManager訪問,多數通過java類訪問
Apk本質是一個zip壓縮包,有的程式也會可以通過Fopen/open直接讀取apk(比如某狗music)
這裡以android 4.4.4原始碼分析為例
我們簡單看一看android中resource物件載入資源方式
AssetManger.open呼叫openAsset
開啟4.4.4_r1\frameworks\base\core\jni\android_util_AssetManager.cpp
根據系統原始碼openAsset實現在android_content_AssetManager_openAsset
android-4.4.4_r1\frameworks\base\libs\androidfw\AssetManager.cpp
openAsset呼叫AssetManger->open方法
Assetmanger->open呼叫openNonAssetInPathLocked
openNonAssetInPathLocked呼叫openAssetFromZipLocked
呼叫openNonAssetInPathLocked,主要功能獲取操作apk的pzip物件,通過
得到ZipFileRO,簡單看下ZipFileRo 成員方法open直接呼叫libc中的open
/frameworks/base/libs/androidfw/ZipFileRO.cpp
總結:
這裡簡單的分析了部份Android資源載入過程,既然知道載入過程,就可以在檔案操作上下功夫。例如hook libc中的native相關函式,在其中做加解密過慮操作,就能實現資源加密替換的功能。許多加固廠商會對檔案做加密操作,或者對檔案做保護,也是通過類似原理。
上文中還提到,系統在載入資源的過程中會呼叫很多函式,從java層到native層,整個過程每個環節都能做加解密。
注:此技術可對apk中apk本身所操作所有檔案做加解密,不能加密系統訪問的檔案。