开始写文章: 最近都太忙了,过完这段时间就好了。。。。。。。。。。。。。
补充下上次二代壳的加壳以及脱壳问题。
我们知道了二代壳的加壳是函数抽取型,脱壳就是找到会函数地址,然后进行回填。我也是翻了很多篇文章,才发现没有相关很系统的文章。很多都是整体加固的文章,没有几个人是从0-1实现了加二代壳、脱二代壳文章。
运用下大佬总结好的图片
找到了几篇质量比较高的文章
Android免Root权限通过Hook系统函数修改程序运行时内存指令逻辑_手机没有root可以hook吗-CSDN博客
Android中实现「类方法指令抽取方式」加固方案原理解析_android中实现类方法指令抽取方式-CSDN博客
再分享一个博客:
赵四大佬的博客,虽然已经很久不更新了,但里面仍然有很多是值得我去学习的技术
正常二代壳:
禁用dex2oat:
为什么要禁用这个dex2oat?
在应用程序运行时,Android系统会通过类加载器(ClassLoader)动态地加载类。.dex文件被转换为.oat文件后,其中的类定义以本地代码的形式存在,这使得类加载器可以更快速地加载并执行这些类。因此,dex2oat的工作直接影响了应用程序的类加载过程,使得应用程序在运行时更加高效。
那么之前讲的Classloader与这个有什么关系?
DexClassLoader是在这里有一个Dex2Oat编译流程用于优化编译效率,但是由于oat优化会有.oat文件落地,通过oat2dex即可获得原Dex,所以大部分壳都会阻断Dex2Oat流程,这里就不跟进分析直接看dex_files.empty()之后的代码。
dex2oat执行的时刻
二代壳的脱壳思路:
这个其实很容易理解,就是禁用dex2oat,那么就找其他地方的脱壳点。
在整个类装载的过程,都可以进行脱壳
禁用Dex2oat
如果禁用了dex2oat,类编译解释执行的地方,那么interprter编译/解释执行,存在有海量的脱壳点。在这地方只要hook到类加载地址,类加载长度。那么只要遍历所有类,就能够把所有的类给还原了。判断类是否完整还原,
1.看md5函数,如果还原完成的话,那么就能看到完整md5函数了
2.找到一个跟login相关的activity,如果还原完成的话,那么就能看到完整的函数,不再是看到一些接口。
在安卓4.4下的Dalvik,关键追踪这个loadClass就好了,这个就不想再详细追踪了。。。
在当下ART环境下还是8.1的环境,可以尝试追踪这个函数,loadClasMembers
在知道从DexFile中进行还原方法,很多人写多了hook框架。
GitHub - asLody/whale: Hook Framework for Android/IOS/Linux/MacOS
GitHub - ele7enxxh/Android-Inline-Hook: thumb16 thumb32 arm32 inlineHook in Android
在写完文章后,又发现了一个github博客,还是非常好的,可以相互印证学习。
GitHub - JnuSimba/AndroidSecNotes: some learning notes about Android Security
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
欢迎关注公众号“呼啦啦安全”,原创技术文章第一时间推送。