接觸andorid逆向脫殼一段時間了,剛剛感覺開始入門,最開始時的過反調試,花費了大量的時間,但時間長了,匯編指令慢慢熟悉,學會了一些調
試技巧,反調試方法知道了,就那么些反調試的方法,過反調就比較順利了,所以剛開始學逆向的同學,應該也會比較頭疼的,記錄下我的逆向學習之
旅,增強下記憶,記錄分享也是自我提升的過程吧。輕松過掉反調試后,就能有更多的時間去研究殼本身流程和加解密操作。先前的dex加殼,不管是
內存加載(內存dump),還是類抽。╠exHunter),從內存中dump出來后,還是比較容易重打包運行的,自從出現能解釋執行smali指令的殼出現后
,小伙伴都能把dex dump出來可是onCreate函數是native的,無法還原指令,dex的關鍵代碼可以分析了,但是無法進行重打包運行,這tn就蛋疼了,
沒有卵用,這些天也是一有空就看,還有點成果,手里的兩個apk,只是把啟動相關Activity 的onCreate進行了還原,apk能運行起來,記錄分享下我
的思路。
其實也沒思路了,就是跟蹤匯編,看匯編指令,函數比較復雜,而且加了混淆,剛開始頭都大了。
1.apk 過反調試,360的反調試方法還是那么些,沒有更新,可以看我前一篇文章。
2.找到正確的地方下斷點,因為dump出dex的onCreate函數是native的,所以肯定是需要注冊的,在so中找到給其賦值RegisterNative函數,相應的參
數就是對應的jni函數,IDA動態調試起來,下斷點,迷糊的小伙伴可以翻看我前一篇文章,最后有介紹。
3.跟蹤jni函數,關鍵在sub_A990函數,而且函數挺長的,需要點耐心閱讀
4.根據方法的索引獲取方法的結構體,大致結構體如下:
Struct NativeMethod{
int classIdx;
int dexMethodIdx;
int dexCodeOff;
int** pDexAddr;
}*pNativeMethod;
5.根據結構體獲取方法的相關信息
6.根據方法的shorty,構建參數
7.解析指令
8.解密指令,獲取opCode
9.根據opcode進行相應的case處理,比如說一條invoke指令,就會通過,FindClass,GetMethod,CallXXXMethodA方法進行翻譯
10.大體的流程就是這樣的,每個case的流程,就不寫了,因為沒看,不會,只是看了用到的部分,以下是某個apk 簡單onCreate的還原
二、總結
360的opcode對應表不是固定的,分析了兩個apk,表的對應關系是不一樣的,應該是在加固過程中,動態生成的,指令加密方式也是
不一樣的,盡管只是簡單的異或,所以就沒辦法進行批處理了,只能手動分析,分析出這個apk對應的opcode表,再進行批處理操作了,反
正脫殼是越來越麻煩了,需要耐心去分析,分析用到的apk就不往論壇傳了,放出去不太好,有需要的可以私我。
|