分享一种Andorid资源加载技术

本文探讨了Android资源的加载方式,特别是在Android 4.4.4系统中的实现,涉及AssetManager和ZipFileRO的使用。通过理解资源加载过程,可以实现资源的加密和动态替换,如so、jar、res、dex文件。资源加密通常通过hook libc函数来实现,以增强App的安全性。但需要注意,该技术无法加密系统直接访问的文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

申明,本着技术交流,不喜勿喷

此技术可用于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本身所操作所有文件做加解密,不能加密系统访问的文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值