类加载器
双亲委派
就是加载类的时候,先交给自己的父类来加载,然后父类看自己是否也有父类,有的话,也转交给父类,一直到最顶端的类,如果最顶端的类加载失败,再一层层的由子类来加载,直到加载成功。
classloader的继承关系
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里面的指定类的方法。