申明,本著技術交流,不喜勿噴
此技術可用于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本身所操作所有文件做加解密,不能加密系統訪問的文件。