1. 程式人生 > >360加固之libjiagu.so脫殼及dex dump

360加固之libjiagu.so脫殼及dex dump

       360加固後的apk,在arm裝置上首先會將assets目錄下的libjiagu.so拷貝到files目錄下,然後通過libjiagu.so動態載入原始dex


       libjiagu.soinit_procinit_array都無實質功能,真正的解密放在JNI_OnLoad裡面


       JNI_OnLoad函式裡有非常多的垃圾跳轉指令干擾分析,後面還會有動態解密的函式執行,如果檢測到偵錯程式,會把動態函式置成非法程式碼,使程式CRASH



51b0c404這個位置就會跑飛。這樣分析比較累人。換個思路,對一些關鍵函式進行hook,進行hook log分析

Hook dlopen和dlsym LOG打印出libjiagu.so的載入基址和大小


可以看到JNI_OnLoad的地址還是在libjiasu.so記憶體範圍內的

Hook RegisterNatives函式,列印如下LOG


這個LOG可以看到RegisterNatives有被呼叫,註冊了一個interface7函式,函式地址是51e2f211,仔細看這個地址發現,這個地址已經是thumb指令集了,跟libjiagu.so使用的arm指令集不太相符,而且可以看到函式地址已經超出了libjiagu.so記憶體範圍了.

libjiagu.so的基址是51b3b000,大小是46000,最大記憶體地址是51B81000

那麼,基本可以確定,它在記憶體中載入了另一個so

從/proc/%pid%/maps裡找到函式地址所在的記憶體塊,把周圍連續的記憶體一起dump出來

在這片記憶體裡找到如下一塊記憶體


這其實就是elf heaer了,不過一些elf結構資訊已經被抹掉了。除了基本的結構資訊還缺失

如下三個資料:

0x20                   e_shoff

0x30                   e_shnum

0x32                   e_shtrndx

         接下來的工作就是對這個殘缺的記憶體進行修復了,通過分析上面三個資料,dlopen其實都沒有用到,其值對elf執行沒有影響。

經過修復後的檔案可以替換掉原來的libjiagu.so,重新簽名後使apk正常執行,用於IDA動態除錯分析。

  下面是經過修復後的

libjiagu.soida分析的流程圖片段


360dex載入的時候,並沒有呼叫dvmDexFileOpenPartial,而是自實現了此函式的功能,因此直接在這個函式上下斷點是不能脫殼的。它的實現方式基本是照抄了原始碼


如上面原始碼所示,使用dex所在記憶體的時候都會使用memcmp校驗MAGIC是否為dex,所以只要hook memcmp,然後在過濾函式裡校驗是否為dex,然後dump出來即是原始的dex

  (建立了一個Android逆向分析群,歡迎有興趣的同學加入,群號碼:376745720)