接觸andorid逆向脫殼一段時間了,剛剛感覺開始入門,最開始時的過反調(diào)試,花費(fèi)了大量的時間,但時間長了,匯編指令慢慢熟悉,學(xué)會了一些調(diào)
試技巧,反調(diào)試方法知道了,就那么些反調(diào)試的方法,過反調(diào)就比較順利了,所以剛開始學(xué)逆向的同學(xué),應(yīng)該也會比較頭疼的,記錄下我的逆向?qū)W習(xí)之
旅,增強(qiáng)下記憶,記錄分享也是自我提升的過程吧。輕松過掉反調(diào)試后,就能有更多的時間去研究殼本身流程和加解密操作。先前的dex加殼,不管是
內(nèi)存加載(內(nèi)存dump),還是類抽。╠exHunter),從內(nèi)存中dump出來后,還是比較容易重打包運(yùn)行的,自從出現(xiàn)能解釋執(zhí)行smali指令的殼出現(xiàn)后
,小伙伴都能把dex dump出來可是onCreate函數(shù)是native的,無法還原指令,dex的關(guān)鍵代碼可以分析了,但是無法進(jìn)行重打包運(yùn)行,這tn就蛋疼了,
沒有卵用,這些天也是一有空就看,還有點(diǎn)成果,手里的兩個apk,只是把啟動相關(guān)Activity 的onCreate進(jìn)行了還原,apk能運(yùn)行起來,記錄分享下我
的思路。
其實(shí)也沒思路了,就是跟蹤匯編,看匯編指令,函數(shù)比較復(fù)雜,而且加了混淆,剛開始頭都大了。
1.apk 過反調(diào)試,360的反調(diào)試方法還是那么些,沒有更新,可以看我前一篇文章。
2.找到正確的地方下斷點(diǎn),因?yàn)閐ump出dex的onCreate函數(shù)是native的,所以肯定是需要注冊的,在so中找到給其賦值RegisterNative函數(shù),相應(yīng)的參
數(shù)就是對應(yīng)的jni函數(shù),IDA動態(tài)調(diào)試起來,下斷點(diǎn),迷糊的小伙伴可以翻看我前一篇文章,最后有介紹。
3.跟蹤jni函數(shù),關(guān)鍵在sub_A990函數(shù),而且函數(shù)挺長的,需要點(diǎn)耐心閱讀

4.根據(jù)方法的索引獲取方法的結(jié)構(gòu)體,大致結(jié)構(gòu)體如下:
Struct NativeMethod{
int classIdx;
int dexMethodIdx;
int dexCodeOff;
int** pDexAddr;
}*pNativeMethod;
5.根據(jù)結(jié)構(gòu)體獲取方法的相關(guān)信息
6.根據(jù)方法的shorty,構(gòu)建參數(shù)
7.解析指令
8.解密指令,獲取opCode
9.根據(jù)opcode進(jìn)行相應(yīng)的case處理,比如說一條invoke指令,就會通過,F(xiàn)indClass,GetMethod,CallXXXMethodA方法進(jìn)行翻譯
10.大體的流程就是這樣的,每個case的流程,就不寫了,因?yàn)闆]看,不會,只是看了用到的部分,以下是某個apk 簡單onCreate的還原
二、總結(jié)
360的opcode對應(yīng)表不是固定的,分析了兩個apk,表的對應(yīng)關(guān)系是不一樣的,應(yīng)該是在加固過程中,動態(tài)生成的,指令加密方式也是
不一樣的,盡管只是簡單的異或,所以就沒辦法進(jìn)行批處理了,只能手動分析,分析出這個apk對應(yīng)的opcode表,再進(jìn)行批處理操作了,反
正脫殼是越來越麻煩了,需要耐心去分析,分析用到的apk就不往論壇傳了,放出去不太好,有需要的可以私我。
|