从刚开始的我们有了一定基础后,了解APP都有哪些攻击手段以及防御手段后。我们就开始尝试学习APP的classloader加载过程。目标:根据壳的特征,区分出几代壳。
classloader讲解
java代码都是写在Class里面的,程序运行在虚拟机上时,虚拟机需要把需要的Class加载进来才能创建实例对象并工作,而完成这一个加载工作的角色就是ClassLoader
而APP是和java不一样的,java最终是编译成.class文件,而APP最终是编译成.dex文件。所以之前在写加壳历史的时候,第一代壳是会对dex进行整体加固。
如果自己手动写classloader这个过程,很慢,而且不会太准,不能满足我想要快速学习安卓app的目标,就找了找文章,看看,主要知道classloader的继承关系就好了。
https://gityuan.com/2017/03/19/android-classloader/
顺便了解下so相关文件
https://www.imooc.com/article/72564
APP的启动过程
认识完classloader的加载过程后,我们就可以了解APP的启动过程了。图为看雪论坛作者的文章
https://bbs.kanxue.com/thread-252630.htm#msg_header_h2_0
https://juejin.cn/post/6844904116561379341
了解下acivity的生命周期:
https://juejin.cn/post/6963543808348782628
看完那篇文章理解完APP的启动过程,再从APP的启动过程延伸到加壳的启动过程。
加壳特征
根据随风而行大佬对一代壳分析,可以了解到一个是APP的dex,一个是加壳的dex,两个组成到一块就是一个加壳过的APP。
详细的加壳过程,可以详细看看这篇文章。非常详细,了解到了APP加壳实际上就是对
Application.attachBaseContext
以及
oncreate()
进行修改。
https://bbs.kanxue.com/thread-273293.htm
找个APP分析国内某个厂商的加固过程
查看到AndroidManifest.xml,发现确实不太一样,application不是一个正常的包名,应该是存在加固
<application android:theme="@style/wmzxAppTheme" android:label="@string/wm_app_name" android:icon="@mipmap/ic_launcher" android:name="com.stub.StubApp" android:screenOrientation="portrait" android:allowBackup="false" android:hardwareAccelerated="true" android:largeHeap="true" android:supportsRtl="true" android:usesCleartextTraffic="true" android:networkSecurityConfig="@xml/network_config" android:roundIcon="@mipmap/ic_launcher_round" android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:requestLegacyExternalStorage="true">
使用jadx打开APP,分析发现存在onCreate()
onCreate() void方法,点进去,还发现了attchBaseContext方法
点进去看attachBaseContext,里面也有”jiagu”的字样
分析完这个加固以后,发现对Context不太认识。认识Context下
总Context个数 = Activity个数 + Service个数 + 1(Application Context)
https://juejin.cn/post/6844903821164953608
查看加固的时候,在前面也看到了Native,可以看看下面这个文章,对Native有个印象就好了。
https://blog.csdn.net/jiucongtian/article/details/71427224
因为前面文章也讲过了加壳的历史,所以就可以详细的去看看一代壳、二代壳、三代壳都有什么特征:
一代壳:
dex整体加固:文件加载和内存加载(对整个dex进行加固)
二代壳:
函数抽取:在函数粒度完成代码的保护(在对dex加固的基础上,对函数进行了加固)
三代壳:
VMP和Dex2C:JAVA函数Native化点
上面随风而行大佬中说明了,一代壳就是对dexclassloader进行重新修改
https://bbs.kanxue.com/thread-273293.htm
二代壳的特征,暂时还不清楚。
关于VMP三代壳的特征,可以看看这篇文章,写的非常详细:
https://geneblue.github.io/2019/09/13/android/sec–android-dex-vmp/
综合下来可以额外参考看看这篇文章:
https://onejane.github.io/2021/02/21/%E5%8A%A0%E5%A3%B3%E4%B8%8E%E8%84%B1%E5%A3%B3%E4%B9%8B%E5%88%86%E7%B1%BB%E6%8A%80%E6%9C%AF/#%E5%87%BD%E6%95%B0%E6%8A%BD%E5%8F%96
额外补充:加固技术识别or特征可以看下面这个文章:
https://blog.csdn.net/Qiled/article/details/110453098
理解fart的产生过程:
https://www.anquanke.com/post/id/219094
使用fart脱一代、二代壳可以详细的看看过程
https://www.anquanke.com/post/id/199898
https://mp.weixin.qq.com/s/3tjY_03aLeluwXZGgl3ftw
参考加壳项目:
https://github.com/chago/ADVMP
ps:这两天学习的时候,回过头再重新看activity 越权,一下就看懂了。因为之前感觉activity越权是个很复杂的事情,一直就只知道acitity以及service本地端拒绝服务攻击。后来也没想着仔细看,昨天晚上再看的时候就懂了,其实也是利用drozer的延申。关于drozer这个工具,有想法的可以去试试。
https://bbs.kanxue.com/thread-269211.htm
以往系列文章
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
欢迎关注公众号“呼啦啦安全”,原创技术文章第一时间推送。
原文始发于微信公众号(呼啦啦安全):APP逆向系列(四)