某梆加固企业版还是会调用系统的dvmDexFileOpenPartial 接口,因此可以这里添加hook
51df6008-52cd50__unpackedDex.dmp即是dump出来的dex,拖到jeb里,可以看到这些函数都是空的
汇编显示,大片的指令都为nop,这些指令都被抽掉了,执行之前才会还原。
它hook了dvmResolveClass还动态加解密指令
可以看到,它执行了两次___Decrypt_dvmResolveClass,解密完等原始dvmResolveClass执行完后,还会再把指令清掉。
之前网上有还原娜伽抽代码的教程,是把解密算法还原出来,用算法来解密的,不过___Decrypt_dvmResolveClass函数的流程图如下图所示:
还是挺复杂的,弄出算法的成本相当高。
还是另想办法。第C838行的BLX R3就是在调用原始dvmResolveClass函数,这时指令已经被还原了。那么我们在这个点做hook,把代码还原出来。
先来看下dvmResolveClass函数的实现
输入参数有ClassObject* referrer, u4 classIdx,这里的classIdx经过测试,似乎经常飘乎不定,并不可用。需要通过referrer->descriptor得到类名后,再定位到对应的class_data_item
dexClsIndex是通过类名计算出来的实际classIdx,patchDexMethod通过referrer将Method里面的指令写到第一步dump出来的dex里的对应位置上。
虽然大部分类都的代码都被还原了,但还是存在这样的类:
还有一些类没有被还原出来,因为dvmResolveClass只会还原加载过的类,对于那些没有加载的类,也是无能为力。
加载的时候会自动调用dvmResolveClass,需要想办法让所有的类都预先加载起来。
可以Hook Dalvik_dalvik_system_DexFile_defineClassNative函数,原始dex加载时,枚举所有的DexClassDef,对所有的class,调用dvmDefineClass进行类加载。
这样会就把之前没有还原到的类给补全。(创建了一个Android逆向分析群,欢迎有兴趣的同学加入,群号码:376745720)
时间: 2024-10-25 22:00:03