某梆企业版加固脱壳及抽代码还原方法

       某梆加固企业版还是会调用系统的dvmDexFileOpenPartial 接口,因此可以这里添加hook某梆企业版加固脱壳及抽代码还原方法_第1张图片


        51df6008-52cd50__unpackedDex.dmp即是dump出来的dex,拖到jeb里,可以看到这些函数都是空的

       某梆企业版加固脱壳及抽代码还原方法_第2张图片

       汇编显示,大片的指令都为nop,这些指令都被抽掉了,执行之前才会还原。

       某梆企业版加固脱壳及抽代码还原方法_第3张图片

        它hook了dvmResolveClass还动态加解密指令

        某梆企业版加固脱壳及抽代码还原方法_第4张图片

        可以看到,它执行了两次___Decrypt_dvmResolveClass,解密完等原始dvmResolveClass执行完后,还会再把指令清掉。        

       之前网上有还原娜伽抽代码的教程,是把解密算法还原出来,用算法来解密的,不过___Decrypt_dvmResolveClass函数的流程图如下图所示:

       某梆企业版加固脱壳及抽代码还原方法_第5张图片

       还是挺复杂的,弄出算法的成本相当高。

        还是另想办法。第C838行的BLX R3就是在调用原始dvmResolveClass函数,这时指令已经被还原了。那么我们在这个点做hook,把代码还原出来。

  先来看下dvmResolveClass函数的实现

        某梆企业版加固脱壳及抽代码还原方法_第6张图片

     输入参数有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)

 
  
 

你可能感兴趣的:(Android逆向)