1. 程式人生 > >某梆企業版加固脫殼及抽程式碼還原方法

某梆企業版加固脫殼及抽程式碼還原方法

       某梆加固企業版還是會呼叫系統的dvmDexFileOpenPartial 介面,因此可以這裡新增hook

        51df6008-52cd50__unpackedDex.dmp即是dump出來的dex,拖到jeb裡,可以看到這些函式都是空的

       

       彙編顯示,大片的指令都為nop,這些指令都被抽掉了,執行之前才會還原。

       

        它hook了dvmResolveClass還動態加解密指令

        

        可以看到,它執行了兩次___Decrypt_dvmResolveClass,解密完等原始dvmResolveClass執行完後,還會再把指令清掉。

       之前網上有還原娜伽抽程式碼的教程,是把解密演算法還原出來,用演算法來解密的,不過___Decrypt_dvmResolveClass函式的流程圖如下圖所示:

       

       還是挺複雜的,弄出演算法的成本相當高。

        還是另想辦法。第C838行的BLX R3就是在呼叫原始dvmResolveClass函式,這時指令已經被還原了。那麼我們在這個點做hook,把程式碼還原出來。

        

     輸入引數有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)