APP逆向系列(四)


从刚开始的我们有了一定基础后,了解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的启动过程了。图为看雪论坛作者的文章

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逆向系列(四)

详细的加壳过程,可以详细看看这篇文章。非常详细,了解到了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()

APP逆向系列(四)

onCreate() void方法,点进去,还发现了attchBaseContext方法

APP逆向系列(四)

点进去看attachBaseContext,里面也有”jiagu”的字样

APP逆向系列(四)


分析完这个加固以后,发现对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逆向系列学习(三)

APP逆向系列学习(二)

APP逆向系列(一)


本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任

欢迎关注公众号“呼啦啦安全”,原创技术文章第一时间推送。



原文始发于微信公众号(呼啦啦安全):APP逆向系列(四)

版权声明:admin 发表于 2024年4月24日 上午11:07。
转载请注明:APP逆向系列(四) | CTF导航

相关文章