简述:
想要脱方法抽取的壳,都必须要强制加载dex的所有类,随着壳技术的发展,壳对于dex文件的防护越来越厉害,在native层加载类的崩溃率越来越高,所以这次我尝试在java层加载所有的类,并把加载后的class传入native层处理
正文:
分析了DexFile类的源码后,决定从loadClassBinaryName方法入手,理由是:
1、它是调用defineClass的方法,一般壳程序不太会防护它
2、它不是静态方法,能获取到DexFile中的mCookie这个关键属性
3、ClassLoader是它的方法参数,后面加载所有类需要用到它
hook住loadClassBinaryName方法后,获取到dexFile对象、mCookie后,新建一个线程来加载所有类
如果需要对Class的信息进行处理,可以把Class对象传入native层,转换成ClassObject对象,也就是dvmDefineClass方法的返回对象
ClassObject * classObj = (ClassObject *)dvmDecodeIndirectRef(dvmThreadSelf(), clazz);
总结:
在java层加载所有类肯定要比在native层操作稳定性好,而且class可以和ClassObject转换