1. 程式人生 > >360加固保的dex脫殼方法

360加固保的dex脫殼方法

360整體加固classes.dex後的apk程式的特點,以超信1.1.4版本為例。360加固以後,會在apk的assets檔案的路徑下增加兩個檔案libjiagu.so和libjiagu_x86.so以及修改原apk的AndroidManifest.xml檔案的application標籤增加兩個元素。



360加固脫殼需要完成兩個任務,一個任務是過掉360加固的反除錯,另外一個是獲取原apk的classes.dex檔案。下面寫一下具體的脫殼步驟,完成這兩個任務。為了脫殼成功,在動態除錯加固apk程式前,需要將android_server除錯程式的名字修改一下,因為360加固會通過查詢/proc/pid/cmdline檔案獲取程式的名稱來對android_server、gdb、ltrace、strace偵錯程式進行反除錯。

在動態除錯加固apk程式的時候,需要在幾個關鍵點函式 open、strtol、mmap、memcmp處下斷點,後面具體的分析。由於android系統是由Linux系統修改而來,因此Android系統上很多的屬性和Linux系統下的屬性。Linux下程序和執行緒的資訊是儲存在檔案中的,因此要查詢程序或者執行緒的資訊必須通過open或者fopen等方式操作檔案來完成。

Android的so除錯的步驟略過,已經在上面提到的4個函式處下斷點,注意下斷點的技巧,下斷點的時候,要在一個函式的第1條指令和最後一條指令的地方下斷點。



F9執行程式,當看到下圖的狀態,呼叫open函式開啟檔案/proc/self/status時,可以確實是加固外殼apk程式通過TracePid的反除錯。



過掉通過TracePid方式的反除錯的方法是在strtol函式處下斷點,在strstol函式的最後一行指令的地方,修改該函式的返回值R0的值為0即可,然後F9執行程式。



360加固的外殼程式apk還會通過檔案/proc/net/tcp的本地套接字進行反除錯,一旦檢測到程式有23946埠的本地連線的套接字,他就會結束當前程式,其實過這個方式的反除錯的方法很多,修改遠端除錯的埠號就可以過掉反除錯。



過掉通過/proc/net/tcp檔案的本地套接字的反除錯的方法是在open函式處下斷點,然後F8單步除錯發現strstr函式,加固的外殼apk程式就是通過strstr函式進行判斷當前程序是否存在本地連線的套接字,一旦檢測到,就結束當前程序。



發現程式迴圈呼叫strstr函式進行判斷,當strstr函式的返回值不為0為字串“sl local_address rem_address”時,需要注意,說明當前程序已經檢測到了本地連線的套接字,因此需要修改strstsr函式的返回值為0即可。




加固apk程式還會通過"/proc/pid/mdline"對android_server、gdb、strace、ltrace偵錯程式進行反除錯,但是隻要向前文提到的修改android_server的名稱即可過掉該反除錯。



過掉反除錯的方法已經說明白了,下面只要F9執行,按照前面的方法過掉幾次前面提到的反除錯即可暢快的除錯程式了。當發現當前程序呼叫open函式開啟檔案/proc/pid/maps需要注意了,脫殼需要關注的地方開始了。原被加固的dex檔案開始解壓和解密了。



經過幾次F9的除錯發現了下面截圖的狀態,但是不要心急,只是離脫殼進了一步,此時記憶體dump出來的odex檔案不是被加固的原dex檔案的而是加固外殼qihu360的dex檔案。



繼續F9執行程式,經過n次F9執行memcmp函式以後(其實這裡可以做一個處理,暫時去掉mmap函式的斷點,等到mmap函式斷點處再次設定mmap函式的斷點),再經過大約2次mmap函式執行以後,再一次呼叫memcmp函式即到了脫殼的地方,注意此時加固外殼apk程式呈現的堆疊和記憶體的狀態。由於360加固自己製作了dvmDexFileOpenPartial函式,但是該函式需要呼叫memcmp進行dex檔案的魔法字串”dex“的比較,因此此時是脫殼的最佳時機。



OK,現在的任務就是從記憶體中dump出原來完整的dex檔案,既可以手動的dump出記憶體中的dex檔案,也可以通過IDC的指令碼或者dumpdex的外掛將原dex檔案dump出來。



原apk程式的Dex檔案拿到了,只需替換360加固的外殼程式的dex,刪除AndroidManifest.xml檔案的application標籤增加的兩個元素,刪除assets檔案的路徑下增加兩個檔案libjiagu.so和libjiagu_x86.so以及原來的簽名,重新簽名一下apk程式即可。

在刪除的application標籤增加的元素中,特別是在刪除android:name =””的時候,一定要檢查脫殼的classes.Dex檔案中否重寫過application類,如果脫殼後的classes.Dex檔案中重寫了application類,需要將application標籤中android:name=””修改過來才行

上面的脫殼方法對2015.11月到2016.4月的360的dex加固脫殼有效,後面的360加固的版本基本的反除錯的方法還是差不多的,只是在dex檔案的脫殼點的地方有所區別,但是隻要稍微探索一下,還是可以脫殼成功的。