一、前言
現如今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檔案。
第二、鎖機原理
通過本文的案例可以看到,現在一些惡意的收費鎖機軟體,故意利用軟體名稱吸引使用者安裝,安裝之後就引導使用者授權然後進行鎖機,當使用者被鎖機之後隻能通過給錢解決,當然也可以自行刷機了。本文中的這個軟體的案例就利用了系統的裝置管理器來設定系統的鎖機密碼。關于裝置管理器這個權限,其實有很多用途,比如可以擦除裝置資料,防止被解除安裝的功能,感興趣的同學可以自行搜尋。
本文資料下載下傳位址:http://download.csdn.net/detail/jiangwei0910410003/9748357
注意:system.img檔案是Android4.4版本的,切不可替換錯誤!
七、總結
本文脫殼其實是借助了DexExtractor工具進行的,但是原理都是一緻的,就是不管之前dex怎麼加密,最終都是需要解密加載到記憶體中的,是以在這個時刻,進行操作dump出dex即可。對于之前介紹的方式使用IDA動态調試下斷點來dump出dex這個最大的問題就在于如何解決反調試問題,而這個工具操作就可以無需關心反調試了。但是這種方式操作也是比較麻煩的,因為操作的前提條件比較多。好了到這裡就介紹完了本文的内容,看完的同學記得多多分享擴散哦,如果有打賞那就最好了!
轉自:http://blog.csdn.net/jiangwei0910410003/article/details/54409957