1. 程式人生 > >一種常規Android脫殼技術的拓展(附工具)

一種常規Android脫殼技術的拓展(附工具)

http://www.freebuf.com/sectool/105147.html?utm_source=tuicool&utm_medium=referral

最近在做移動安全測試的專案時,遇到了最新的某數字殼,好久都沒脫殼了,記得上次脫殼還是zjdroid通殺的時候。秉著安全研究的精神,趁此機會,又把最新的加固與脫殼技術過了一遍,然而並沒有成功脫掉。

鬱悶之際,我索性沉下心來,好好看看當前脫殼技術的原理,就這樣我在Github上看了幾個脫殼工具的程式碼。其中一個我感覺很有趣, 正是strazzere大神的android-unpacker,這是一款ndk寫的動態Android脫殼的工具,原理簡單來說就是ptrace,然後在記憶體中匹配特徵碼和odex的magic,最後dump到檔案。我當然自己編譯測試了,但發現是對於最新的殼,貌似還是不管用,總是dump下來一個空檔案。

後來我在分析程式碼,自己邊看邊改邊測試。慢慢結構和程式碼基本上面目全非了,順便改了個程式碼錯誤( 這個錯誤就是之前dump結果為空的真凶 -_- ),到最後按照strazzere大神的基本思路索性自己重新寫了一個工具(複用了大神的部分程式碼)。

下面說下幾個最重要的和大神方法不一樣的地方:

1. android-unpacker基本上就是匹配odex magic的函式時(下圖),而我不管odex了,專心匹配dex的magic。

dex-odex.png

2.android-unpacker用pread(下圖),而我換了read和lseek,具體就不說為啥了,這是非常重要的一點。

pread.png

3.我直接拋棄了android-unpacker中的殼的特徵匹配這一整塊兒內容。

4.android-unpacker只匹配和dump一次,而我引入了雙迴圈機制,這點對我的脫殼成功也非常重要。

5.android-unpacker在peek_memory(下圖)中進行magic匹配,我改了邏輯,換了一種匹配方式。

peekmem.png

6.另外我還增加了一匹配種方法,來增強匹配的成功率。

7.引入了wait_times機制(很無奈)

7.其他..

我找了三家公司的殼試了下,下面直接上效果圖順便說說工具怎麼用:

1.這個工具就是ndk程式,所以要在Root後的Android環境下執行(虛擬機器和實體機都可以)

2.一般來說,先讓工具跑起來等著,第一個引數是包名,第二個引數是等待時間。

3.等待時間有兩重含義,第一是當工具發現APP程序後,等待多久才開始第一次Scan;第二是每次Scan的時間間隔。(因為每種殼機制都不太一樣,所以dex在記憶體中出現和留存的時間也不同,所以這個wait_time可以靈活配置,具體大家自己琢磨吧。)

4.實際dump成功的例子(我就不把殼廠商和APP名字寫出來了,大家應該都能看出來):

(1)某些殼需要把引數wait_times設定1~3秒,然後開啟APP,不然APP會退。

12306.png

(2)等待時機支援小數秒,呵呵。

moji.png

(3)這個dump下來的是缺失的dex,接著向下看。

hzyh-err.png

(4)還是上個APP,這次成功了,沒關係,多試幾次就好了,呵呵。

hzyh-success.png

(5)不寫wait_times的話也可以,預設0秒。

lyyh-nowait.png

(6)某數字公司的殼,dex記憶體裡一直有,所以先啟動APP,然後再開工具也是可以的。

wdsj-nowait.png 

(7)再來一個

huxiu.png

就不貼dex2jar的圖了。

說明

1.工具僅用於安全研究及安全測試,如用於非法用途,後果自負。

2.除了arm版,我還編譯了個x86的,方便使用虛擬機器的童鞋。

3.本來是準備要再研究更多廠商的,但是這段時間實在是忙,想了想還是先發出來吧。

4.這工具並不是萬能的,甚至可以說是不健全的。我僅測試了三家的殼,有兩家都可以穩脫,還有一家一部分可以,一部分不行。歡迎大家測試其他的殼,你們脫不了可不要怨我。

5.別跟我要程式碼了,我的程式碼太醜陋,直接參考android-unpacker的思路就可以。

下載地址