最近都太忙了,过完这段时间就好了。。。。。。。。。。。。。
目的:补充下上次二代壳的加壳以及脱壳问题
我们知道了二代壳的加壳是函数抽取型,脱壳就是找到函数地址,然后进行回填。我也是翻了很多篇文章,才发现没有相关很系统的文章。很多都是整体加固的文章,没有几个人是从0-1实现了加二代壳文章。我暂时也没能力完整的写出来这个。。
先看看大佬总结好二代壳的加固以及脱壳过程图片
找到了几篇质量比较高的文章,可以看看。
https://blog.csdn.net/hhh901119/article/details/79526169
https://blog.csdn.net/zhangmiaoping23/article/details/100877907
再分享一个博客:
赵四大佬的博客,虽然已经很久不更新了,但里面仍然有很多是值得我去学习的技术
http://www.520monkey.com/
前提知识:正常二代壳加固过程需要禁用dex2oat
dex2oat有什么作用?
在应用程序运行时,Android系统会通过类加载器(ClassLoader)动态地加载类。.dex文件被转换为.oat文件后,其中的类定义以本地代码的形式存在,这使得类加载器可以更快速地加载并执行这些类。因此,dex2oat的工作直接影响了应用程序的类加载过程,使得应用程序在运行时更加高效。
dex2oat执行的时刻
那么之前讲的Classloader与这个有什么关系?
DexClassLoader是在这里有一个Dex2Oat编译流程用于优化编译效率,但是由于oat优化会有.oat文件落地,通过oat2dex即可获得原Dex,所以大部分壳都会阻断Dex2Oat流程,这里就不跟进分析直接看dex_files.empty()之后的代码。
二代壳的脱壳思路:
这个其实很容易理解,就是加壳已经禁用dex2oat,那么就找其他地方的脱壳点。在不尝试破解dex2oat的情况下,整个类装载的过程,都可以进行脱壳。
类编译解释执行就是interprter编译/解释执行,存在有海量的脱壳点。在这地方只要hook到类加载地址,类加载长度。那么只要遍历所有类地址,就能够把所有的类给还原了。
判断类是否完整还原的方法
1.看md5函数,如果还原完成的话,那么就能看到完整md5函数了
2.找到一个跟login相关的activity,如果还原完成的话,那么就能看到完整的函数,不再是看到一些接口。
从源码中寻找脱壳点:
在安卓4.4下的Dalvik,关键追踪这个loadClass就好了,这个就不想再详细追踪了。。。
在当下ART环境下还是8.1的环境,可以尝试追踪这个函数,loadClasMembers
在知道从DexFile中进行还原方法,很多人写多了hook框架。在下面已经列出来,有心的人可以看看。
https://github.com/asLody/whale
https://github.com/asLody/SandHook
https://github.com/ele7enxxh/Android-Inline-Hook
在写完文章后,又发现了一个github博客,还是非常好的,可以相互印证学习。
https://github.com/JnuSimba/AndroidSecNotes
ps:如果想一块讨论代码审计&APP逆向&渗透可以添加下面的微信号相互交流
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
欢迎关注公众号“呼啦啦安全”,原创技术文章第一时间推送
安卓逆向12
安卓逆向 · 目录
上一篇安卓系列学习(九)--静态函数式抽空
原文始发于微信公众号(呼啦啦安全):安卓逆向系列补充(三)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论