分享一種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本身所操作所有文件做加解密,不能加密系統訪問的文件。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章