1. 程式人生 > >360二代加固脫殼方法總結

360二代加固脫殼方法總結

二代加固的難度有所增加,最明顯的地方就是qihoo下面增加了一個Configuration.smali檔案。由以前的一個增加為兩個。
脫殼時有幾個關鍵的so:
1.libc.so(主要是提供一些系統函式,比如open、fopen、fget等等);
2.libdvm.so/libart.so(主要是Android中的系統so,也是重要的Android虛擬機器中的重要的so,由於Android有java層面要跟本地層進行互動時,因此這裡面的很多系統函式很重要,比如libdvm.so中的dvmdexfileopen()函式或者libart.so中的java中的javavmextloadnative()函式,都是脫殼時候的重要把握的函式);
3.libjiagu.so
(我們簡稱為殼so,這裡主要是指的是360殼的so,就是反除錯什麼的都在這裡面,反除錯函式肯定是要用到很多libc.so提供的系統函式,因此可以看到在除錯反除錯的時候,總是libjiagu.so跟libc.so在進行不斷的互動);
4.libXX.so就是目標的so檔案,也就是我們應用級別的so;
其實脫殼就是這幾個so檔案,從頭走到尾的過程,只有走到應用級別的so,那麼就很容易dump處想要的so。

因此一個過程就是:

libc.so--->libart.so/libdvm.so--->libjiagu.so--->libXX.so

對於過反除錯有很多的方法:
1.我們對於cmp R0,0;執行到這個地方進行一個個的修改;
2.對於反除錯的子函式我們進行NOP或者加一些mov r0,#0 ret,也就是00 00 A0 E3、 0E F0 A0 E1這樣的說明;
3.或者對於某些反除錯,比如不斷的檢測Tracepid,這時候就不能手動過掉,修改系統核心對於核心中比如檢測Tracepid的地方進行修改,那麼加固中的反除錯是不是就起不到作用了。
參考:http://mp.weixin.qq.com/s/v_3o8XJ0u5F-euCv9lY2TQ

方法一:IDA手動脫殼:(在mmap函式處下端)

此時注意APK附加上以後,重新勾選三項,因為此處的反除錯放的更早了,等你直接執行到mmap函式的時候已經遲了,所以從linker處進行下端點然後進行載入分析。


方法二:IDA手動脫殼:(Dalvik模式下在memcmp處進行下端)
手動脫殼:
靜動態進行結合:
先靜態觀察然後結合動態去觀察尋找反除錯點
第一步:就是在JNI_Onload處dump處so並修復。可以看到一個呼叫函式關係圖,特別是反除錯中所用到的關鍵的函式的一個關係圖。
第二步:就是由於反除錯一般在JNI_Onload處,所以這時候,可能會呼叫open或者fopen進行開啟,在open處進行下端點,F9執行;
第三步:(最關鍵的一步)ctrl+F7與F9交替進行出現在反除錯最上層的呼叫處,然後過掉;
第四步:繼續F9,ctrl+F7,F9進行交替走到反除錯的函式處,這時候採用以上反除錯的第二點弄點反除錯函式;
第五步:在memcmp函式進行下斷點,一直F9,去掉斷點,然後F9;
第六步:執行到memcmp處,然後F9,觀察R0 HEX視窗;
第七步:dump出來進行分析;


方法三:IDA手動脫殼:(ART模式下)

此處略過;


方法四:drizzleDump,自動脫殼機

原理:一款基於記憶體特徵搜尋的dex檔案dump脫殼工具,drizzleDumper工作的原理是root環境下,通過ptrace附加需要脫殼的apk程序,然後在脫殼的apk程序的記憶體中進行dex檔案的特徵搜尋,當搜尋到dex檔案時,進行dex檔案的記憶體dump。