1. 程式人生 > >Apk脫殼聖戰之---如何脫掉“梆梆加固”的保護殼

Apk脫殼聖戰之---如何脫掉“梆梆加固”的保護殼

一、前言

現如今Android使用者的安全意識不是很強,又有一些惡意開發者利用應用的名字吸引眼球,包裝一個惡意鎖機收費的應用,在使用者被騙的安裝應用之後,立馬手機鎖機,需要付費方可解鎖。這樣的惡意軟體是非常讓人痛恨的。所以本文就用一個案例來分析如何破解這類應用,獲取解鎖密碼,讓被騙的使用者可以找回爽快!

二、分析軟體鎖機原理

本文用的是一款叫做:安卓效能啟用.apk,關於樣本apk檔案後面會給出下載地址,從名字可以看到它肯定不會是一個惡意軟體,但是當我們安裝的時候,並且啟用它的許可權之後就完了。下面不多說了,直接用Jadx工具開啟它:


從包名可以看到是梆梆加固的,咋們也看不到他的程式碼了,所以第一步咋們得先脫殼了,在這之前我們再看看他的清單檔案:


這裡可以看到,他利用了裝置管理器許可權,來強制修改了系統密碼來做的,我們通過開啟軟體也可以確定這點:


看到了,他申請了裝置管理器許可權,而這個許可權用過的同學都知道,當獲取到這個許可權之後可以控制這個裝置了,包括修改系統密碼。而這個軟體也是利用這個許可權來做到鎖機的。

注意:對於這個許可權還有一個重要作用,就是可以防止應用被解除安裝,現在很多應用為了防止自己被使用者無情的解除安裝了,就用這個許可權,可以看到這個應用申請了這個許可權之後,解除安裝頁面:


是不可以解除安裝的。從Android系統來說這個也是合乎情理的,因為這個應用具備了裝置管理器許可權如果能被解除安裝那是不可能的。所以有一些應用就利用這個功能來防止被解除安裝。

三、脫殼工具DexExtractor原理分析

上面分析完了這個應用的鎖機原理,下面就需要破解它獲取到鎖機密碼即可,但是從上面程式碼可以看到他用到了梆梆加固,所以如果想破解它得先把殼給脫了,關於脫殼文章在前面兩篇文章中介紹了兩篇關於脫殼文章:Apk脫殼聖戰之---脫掉“愛加密”的殼 和 Apk脫殼聖戰之---脫掉“360加固”的殼,本文就要先來介紹如何脫掉梆梆的殼,因為如果這個殼不脫掉,沒法分析他的惡意鎖機的解鎖密碼。

前面的這兩篇文章介紹脫殼主要是通過IDA動態除錯下斷點dump出記憶體的dex資料,但是本文不這麼玩了,而是藉助一個脫殼工具DexExtractor,這個工具是開源的:https://github.com/bunnyblue/DexExtractor

,這裡給出了修改原始碼。其實他的原理也很簡單,就是修改系統的DexFile.cpp原始碼,在解析dex的函式開頭處加上自己的dumpdex邏輯:


這裡的DexHacker就是他自己定義的,這裡的dexFileParse就是系統解析dex函式,從引數可以看到,有dex檔案資料,大小等資訊。所以就可以把這個檔案dex檔案弄出來了。然後修改完了這個系統DexFile檔案之後,需要將其編譯到system.img映象中,然後刷到手機中即可。

這裡大神給出了一個修改之後的system.img下載地址:https://pan.baidu.com/s/1jG3WQMU,但是需要注意的是,這個檔案是Android4.4系統的,如果想在其他系統版本中操作,需要自己找到系統對應的版本找到DexFile原始碼,新增上面的程式碼,在編譯獲取到system.img檔案即可。

所以從上面的原理可以瞭解到,他其實和我們之前用IDA動態除錯的原理非常類似,脫殼就是一點:不管之前怎麼對dex加密,最終都是需要解密載入到記憶體中的。所以只要找到載入dex這個點即可那麼這種方式和之前除錯的方式有什麼區別呢?

  • 動態除錯方便,無需其他條件限制,但是遇到反除錯就會很難受了。得先解決反除錯才可進行下一步脫殼。
  • 刷入system.img這種方式可以不用關心反除錯,但是條件太苛刻,使用成本較高。對於不同系統版本還得準備不同版本的system.img檔案,然後將其刷到裝置中。

1、可以選擇刷入system.img檔案

針對於上面的這種條件限制,我們有一種好的方式可以解決,就是藉助於模擬器,這樣就不需要繁瑣的將system.img刷到裝置中了,可以將編譯之後的system.img檔案替換對應系統版本的模擬器映象檔案即可。然後啟動模擬器。

2、可以選擇替換系統libdvm.so檔案

當然我們不刷機也是可以的,大神給出了編譯之後的libdvm.so檔案,其實上面編譯的system.img有點動作太大了,因為我們就修改了DexFile這個檔案,其實只要編譯修改後的libdvm.so檔案,然後替換裝置的system/lib目錄下libdvm.so檔案即可,不過裝置需要root,這種方式比上面的刷機system.img方便。


四、DexExtractor工具使用條件

上面講解了DexExtractor工具的原理,下面就來詳細介紹他的用法吧,其實他的用法也很簡單,把他的原始碼下載下來之後,他還有一個解密工程DexReverse,這個是一個java工程,為了解密dump出的dex檔案的。那為什麼要解密呢?還有這個工具dump出的dex檔案在哪?下面就來詳細介紹:


看到DexHacker這個檔案中,會將dex檔案儲存到sd卡中,而每個應用啟動的時候都是在一個程序中建立一個虛擬機器,所以這裡如果想讓這個工具可以dump出應用的dex檔案,需要給這個應用新增一個寫sd卡的許可權:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

這個比較簡單,咋們可以利用apktool反編譯應用,在AndroidManifest.xml中新增這個許可權,在回編譯即可。

那麼dump出dex檔案之後為何還要解密呢?這個主要是為了對抗加固策略:

現在一些加固平臺,比如梆梆加固,會對dex的記憶體dump脫殼進行檢測,具體的就是hook修改當前程序的read、write讀寫相關的函式,一旦檢測到read,write讀寫相關的函式的操作中有對dex檔案的dump行為會有對抗的處理,防止dex的記憶體dump,因此呢,DexExtractor脫殼工具的作者為了過掉這種記憶體dump的對抗,需要先將原始的dex檔案資料進行base64加密然後進行寫檔案到sdcard中進行輸出,當pull匯出拿到base64加密的dex檔案時還需要進行base64的解密才能獲取到原始的dex檔案。這個解密工具也在工具目錄下Decode.jar,用法:java -jar Decode.jar dexdir;這裡需要注意的是,dexdir是我們pull出dex之後的目錄,記住是目錄,不是對應的dex檔案哦!

五、DexExtractor工具使用步驟

到這裡我們就分析完了DexExtractor工具的原理,使用條件,使用步驟了,下面咋們就來實踐一下,把我們在前面說到的那個應用脫個殼。這裡為了簡單,直接啟動一個4.4版本的模擬器,然後替換他的system.img檔案。下面的步驟很簡單了:

第一步:替換system.img檔案

用上面修改之後的system.img檔案替換4.4的system.img檔案,檔案目錄:AndroidSDK目錄\system-images\android-19\default\armeabi-v7a\system.img


最好把之前的system.img檔案進行改名備份。然後啟動模擬器即可。

第二步:新增寫SD卡許可權

上面說到了,因為這個工具需要將dump出的dex檔案寫到SD卡中,所以我們需要檢查脫殼應用是否具備寫SD卡許可權,我們用Jadx工具開啟這個應用,發現沒有,所以我們需要用apktool工具反編譯,然後在AndroidManifest.xml中新增<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,然後在回編譯重簽名即可。

第三步:安裝應用觀察日誌

安裝應用到模擬器,因為是模擬器,可能操作比較麻煩,所以這裡需要藉助兩個命令可以完美的安裝啟動應用即可,一個是adb install xxx.apk,安裝成功之後。

在啟動應用:adb shell am start -n tx.qq898507339.bzy9/tx.qq898507339.bzy9.MainActivity


其中應用的包名和啟動activity的名稱都可以通過AndroidManifest.xml中檢視:


無需任何介面操作即可完成啟動應用,然後檢視這個包名對應的日誌資訊,日誌tag是dalvikvm:

在這些日誌中可以看到脫殼之後的dex檔案放在sd中,咋們把這個檔案pull出來即可:

adb pull /sdcard/tx.qq898507339.bzy9_classes_927104.dex D:\DexExtractor\

這時候我們離成功就不遠了,得到了脫殼後的dex檔案了,但是我們還需要進行解密。

注意:這裡記得觀察"create file end" 欄位內容,有的應用可能內部本身有載入dex的邏輯,所以這裡會發現有多個dex檔案的產生,不過沒關係,可以把所有的dex檔案都匯出本地,然後分析即可。

第三步:解密脫殼後的dex檔案

前面說過了,為了應對現在加固平臺的檢測,DexExtractor工具將dex進行加密了,可以利用Decode.jar工具進行解密:java -jar Decode.jar D:\DexEctractor\


注意,這裡的是目錄,不是dex檔案哦。然後去目錄檢視解密之後的dex檔案即可,然後我們用jadx開啟這個dex檔案,可惜的是開啟失敗,所以就用dex2jar工具將其變成jar檔案進行檢視:


轉化的時候報錯了,說這個dex是odex檔案。關於odex格式檔案不多解釋了,可自行搜尋哈。jadx現在還不能識別odex檔案的,這裡好奇用IDA開啟一下,發現竟然可以成功,所以IDA還真強大哈!

第四步:odex檔案轉化成dex檔案

但是咋們用jadx用慣了,所以還是想用jadx開啟它,其實我們只需要將odex轉化成dex即可,這裡藉助了smali.jar工具了,我們先用baksmali.jar將odex檔案反編譯成smali檔案,然後在用smali.jar將smali檔案編譯成dex檔案即可。這兩個工具用法比較簡單:

把c:\classes.dex反編譯為smali,輸出到c:\classout目錄

java -jar baksmali-2.0.3.jar -o c:\classout/ c:\classes.dex 

把c:\classout目錄下的smali檔案編譯為c:\classes.dex
java -jar smali-2.0.3.jar c:\classout/ -o c:\classes.dex

就用上面這兩個工具可以把odex檔案變成dex檔案,然後在用jadx工具開啟即可:


在前面檢視AndroidManifest.mxl檔案中可以找到裝置管理器宣告的類jh,這裡直接檢視原始碼,果然是當獲取到裝置管理器許可權之後,立馬將鎖屏密碼設定成:>>>qq 898507339 bzy>>> ,然後立即鎖屏。鎖屏之後,你不能通過重啟來解決,因為這種惡意軟體肯定監聽到了開機廣播:


所以這時候,受害者只能通過提示來進行付費解鎖了。或者自己刷機操作了。付費的邏輯比較簡單,通過加qq,然後惡意者會讓你付費,給完錢之後他會用電話號碼:18258614534,給你傳送一條簡訊,程式碼中監聽到有這條簡訊就自動解鎖,也就是將鎖屏密碼清空即可:


六、脫殼流程

看到了這裡我們就把這個軟體給脫殼破解了,下面來總結一下脫殼的流程和現在惡意鎖屏軟體原理:

第一、DexExtractor脫殼原理

通過修改系統DexFile.cpp原始碼,新增dump出dex的邏輯,然後將其編譯到system.img和libdvm.so中,對於我們可以使用模擬器將system.img進行替換,或者用真機替換system/lib目錄下的libdvm.so檔案,從而讓每個應用啟動的時候使用到DexFile類功能都會執行我們dump出dex的邏輯。

關於這個工具使用的步驟也非常簡單:

第一步:啟動模擬器選擇修改後程式碼的system.img檔案。

第二步:檢查脫殼程式是否具備寫SD卡許可權。

第三步:檢視脫殼程式對應的日誌,tag是dalvikvm。發現create file end等資訊段。找到脫殼之後的dex檔案路徑。

第四步:將sd卡中脫殼之後的dex檔案匯出到本地,在使用Decode.jar工具進行解密即可。

第五步:解密之後的dex格式odex,所以為了使用jadx方便檢視程式碼邏輯,可以使用smali.jar工具將其轉化成dex檔案。

第二、鎖機原理

通過本文的案例可以看到,現在一些惡意的收費鎖機軟體,故意利用軟體名稱吸引使用者安裝,安裝之後就引導使用者授權然後進行鎖機,當用戶被鎖機之後只能通過給錢解決,當然也可以自行刷機了。本文中的這個軟體的案例就利用了系統的裝置管理器來設定系統的鎖機密碼。關於裝置管理器這個許可權,其實有很多用途,比如可以擦除裝置資料,防止被解除安裝的功能,感興趣的同學可以自行搜尋。

注意:system.img檔案是Android4.4版本的,切不可替換錯誤!

七、總結

本文脫殼其實是藉助了DexExtractor工具進行的,但是原理都是一致的,就是不管之前dex怎麼加密,最終都是需要解密載入到記憶體中的,所以在這個時刻,進行操作dump出dex即可。對於之前介紹的方式使用IDA動態除錯下斷點來dump出dex這個最大的問題就在於如何解決反除錯問題,而這個工具操作就可以無需關心反除錯了。但是這種方式操作也是比較麻煩的,因為操作的前提條件比較多。好了到這裡就介紹完了本文的內容,看完的同學記得多多分享擴散哦,如果有打賞那就最好了!

《Android應用安全防護和逆向分析》

點選立即購買:京東  天貓

更多內容:點選這裡

關注微信公眾號,最新技術乾貨實時推送

掃一掃加小編微信
新增時註明:“編碼美麗”否則不予通過!