天天看点

尝试在java层加载dex文件的所有类

简述:

        想要脱方法抽取的壳,都必须要强制加载dex的所有类,随着壳技术的发展,壳对于dex文件的防护越来越厉害,在native层加载类的崩溃率越来越高,所以这次我尝试在java层加载所有的类,并把加载后的class传入native层处理

正文:

       分析了DexFile类的源码后,决定从loadClassBinaryName方法入手,理由是:

1、它是调用defineClass的方法,一般壳程序不太会防护它

2、它不是静态方法,能获取到DexFile中的mCookie这个关键属性

3、ClassLoader是它的方法参数,后面加载所有类需要用到它

尝试在java层加载dex文件的所有类

hook住loadClassBinaryName方法后,获取到dexFile对象、mCookie后,新建一个线程来加载所有类

尝试在java层加载dex文件的所有类

如果需要对Class的信息进行处理,可以把Class对象传入native层,转换成ClassObject对象,也就是dvmDefineClass方法的返回对象

ClassObject * classObj = (ClassObject *)dvmDecodeIndirectRef(dvmThreadSelf(), clazz);
           

总结:

        在java层加载所有类肯定要比在native层操作稳定性好,而且class可以和ClassObject转换

继续阅读