简述:

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

正文:

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

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

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

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

java 加载jar包 时机 java加载dex_android逆向

 

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

java 加载jar包 时机 java加载dex_android逆向_02

 

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

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

 

总结:

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