某梆企業版加固脫殼及抽程式碼還原方法
阿新 • • 發佈:2019-02-04
某梆加固企業版還是會呼叫系統的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)