更强脱壳器的不同思路
分析Fart和Youpk的整体dump组件
Fart整体dump思路的演进
APP中的Application类中的attachBaseContext和onCreate函数是app中最先执行的方法。
因此需要选在在Application的onCreate函数执行之后才开始被调用的任意一个函数中。
比如选择在ActivityThread中的performLaunchActivity函数作为时机,来获取最终的应用的Classloader。
获取到应用解密后的dex文件最终依附的Classloader之后
通过java的反射机制最终获取到对应的DexFile的结构体,并完成dex的dump
所有类和方法的装载和链接/编译和执行流程之中
ART下DexFile类中定义了两个关键的变量: begin_、size_以及用于获取这两个变量的Begin()和Size()函数
这两个变量分别代表着当前DexFile对象对应的内存中的dex文件加载的起始位置和大小。
只要有了这两个值,我们就可以完成对这个dex的dump。
类装载的流程
1、装载:查找和导入Class文件
2、链接:其中解析步骤是可以选择的
(a)检查:检查载入的class文件数据的正确性
(b)准备:给类的静态变量分配存储空间
(c)解析:将符号引用转成直接引用
3、初始化:即调用<clinit>函数,对静态变量,静态代码块执行初始化工作
Fart整体dump思路的演进
找到绕过dex2oat的时机
类的初始化函数始终运行在ART下的inpterpreter模式
在解释执行<clinit>时进行脱壳 实现“绕过”dex2oat
因此必然进入到interpreter.cc文件中的Execute函数,进而进入ART下的解释器解释执行
同时在dex2oat和类的初始化流程函数设置“hook”
Youpk的整体dump思路
App启动后10s开始
禁用dex2oat:在dex2oat中设置 CompilerFilter 为仅验证
compiler_options_->SetCompilerFilter(CompilerFilter::kVerifyAtRuntime);
从ClassLinker中遍历DexFile对象并dump
推荐阅读:https://bbs.pediy.com/thread-254028.htm
Youpk+Fart 整体dump进一步提升
在安卓8上禁用dex2oat
结合fart所提出的海量脱壳点
推荐阅读
- https://bbs.pediy.com/thread-252630.htm
- https://bbs.pediy.com/thread-254028.htm