双亲委派

就是加载类的时候,先交给自己的父类来加载,然后父类看自己是否也有父类,有的话,也转交给父类,一直到最顶端的类,如果最顶端的类加载失败,再一层层的由子类来加载,直到加载成功。

classloader的继承关系

image-20210715212931668

InMemoryDexClassLoader:从内存中加载dex。android7.0以后才有的

PathClassLoader:一般没加壳的app会用这个来加载类

DexClassLoader:一般加壳保护的app会用这个或者自定义ClassLoader来加载类

BaseDexClassLoader可以获取所有DexFile,详细获取途径:DexPathList pathList -> Element[] dexElements -> DexFile dexFile;

DexFile可以通过getClassNameList获取到所有的类名。

使用这个方式遍历出来的所有类名比frida的遍历类名的结果更加完整。因为frida是遍历出加载了的数据。这里把没有加载的dexfile的所有类名也都打印了。

但是这里只是获取BaseDexClassLoader的所有DexFile。frida把BootClassLoader下加载的类也都打印了。

动态加载

loadClass、findClass、forName 都会触发动态加载dex。

第一节课主要是一段android层的反射调用打印MainActivity所在的ClassLoader的所有父级。和一段打印BaseDexClassLoader下的所有DexFile的类名。

第二节课是frida的反射实现第一课的打印所有classloader下的DexFile的所有类名,第二个例子是使用DexClassLoader动态加载一个dex,并且调用dex里面的指定类的方法。