1. 程式人生 > >分享一種andorid資源載入技術

分享一種andorid資源載入技術

申明,本著技術交流,不喜勿噴

 

此技術可於App資源加密,資源動態載入,比如so加密替換,jar包替換,res檔案替換,dex檔案替換。Apk自身許可權內所有檔案都可通過此技術替換(系統訪問部份除外)

 

 App本質是一個zip壓縮包

 

Android App中資源大概分為 dex,assert目錄,res目錄,values目錄,lib目錄,以及其它自定義目錄,如下圖

 

1.jpg

 

程式訪問asserts目錄時通過AssetManager訪問,多數通過java類訪問

Apk本質是一個zip壓縮包,有的程式也會可以通過Fopen/open直接讀取apk(比如某狗music)

 

這裡以android 4.4.4原始碼分析為例

我們簡單看一看android中resource物件載入資源方式

 

2.jpg

 

AssetManger.open呼叫openAsset

3.jpg

 

 

開啟4.4.4_r1\frameworks\base\core\jni\android_util_AssetManager.cpp

根據系統原始碼openAsset實現在android_content_AssetManager_openAsset

 4.jpg

android-4.4.4_r1\frameworks\base\libs\androidfw\AssetManager.cpp

openAsset呼叫AssetManger->open方法

 

5.jpg

 

 

Assetmanger->open呼叫openNonAssetInPathLocked

openNonAssetInPathLocked呼叫openAssetFromZipLocked

 

呼叫openNonAssetInPathLocked,主要功能獲取操作apk的pzip物件,通過

 

6.jpg

7.jpg

8.jpg 

 

得到ZipFileRO,簡單看下ZipFileRo 成員方法open直接呼叫libc中的open

/frameworks/base/libs/androidfw/ZipFileRO.cpp

9.jpg

 

 

總結:

這裡簡單的分析了部份Android資源載入過程,既然知道載入過程,就可以在檔案操作上下功夫。例如hook libc中的native相關函式,在其中做加解密過慮操作,就能實現資源加密替換的功能。許多加固廠商會對檔案做加密操作,或者對檔案做保護,也是通過類似原理。

 

上文中還提到,系統在載入資源的過程中會呼叫很多函式,從java層到native層,整個過程每個環節都能做加解密。

 

注:此技術可對apk中apk本身所操作所有檔案做加解密,不能加密系統訪問的檔案。