現(xiàn)如今Android用戶的安全意識不是很強(qiáng),又有一些惡意開發(fā)者利用應(yīng)用的名字吸引眼球,包裝一個(gè)惡意鎖機(jī)收費(fèi)的應(yīng)用,在用戶被騙的安裝應(yīng)用之后,立馬手機(jī)鎖機(jī),需要付費(fèi)方可解鎖。這樣的惡意軟件是非常讓人痛恨的。所以本文就用一個(gè)案例來分析如何破解這類應(yīng)用,獲取解鎖密碼,讓被騙的用戶可以找回爽快!
本文用的是一款叫做:安卓性能激活.apk,關(guān)于樣本apk文件后面會給出下載地址,從名字可以看到它肯定不會是一個(gè)惡意軟件,但是當(dāng)我們安裝的時(shí)候,并且激活它的權(quán)限之后就完了。下面不多說了,直接用Jadx工具打開它:

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

這里可以看到,他利用了設(shè)備管理器權(quán)限,來強(qiáng)制修改了系統(tǒng)密碼來做的,我們通過打開軟件也可以確定這點(diǎn):

看到了,他申請了設(shè)備管理器權(quán)限,而這個(gè)權(quán)限用過的同學(xué)都知道,當(dāng)獲取到這個(gè)權(quán)限之后可以控制這個(gè)設(shè)備了,包括修改系統(tǒng)密碼。而這個(gè)軟件也是利用這個(gè)權(quán)限來做到鎖機(jī)的。
注意:對于這個(gè)權(quán)限還有一個(gè)重要作用,就是可以防止應(yīng)用被卸載,現(xiàn)在很多應(yīng)用為了防止自己被用戶無情的卸載了,就用這個(gè)權(quán)限,可以看到這個(gè)應(yīng)用申請了這個(gè)權(quán)限之后,卸載頁面:

是不可以卸載的。從Android系統(tǒng)來說這個(gè)也是合乎情理的,因?yàn)檫@個(gè)應(yīng)用具備了設(shè)備管理器權(quán)限如果能被卸載那是不可能的。所以有一些應(yīng)用就利用這個(gè)功能來防止被卸載。
上面分析完了這個(gè)應(yīng)用的鎖機(jī)原理,下面就需要破解它獲取到鎖機(jī)密碼即可,但是從上面代碼可以看到他用到了梆梆加固,所以如果想破解它得先把殼給脫了,關(guān)于脫殼文章在前面兩篇文章中介紹了兩篇關(guān)于脫殼文章:Apk脫殼圣戰(zhàn)之---脫掉“愛加密”的殼 和 Apk脫殼圣戰(zhàn)之---脫掉“360加固”的殼,本文就要先來介紹如何脫掉梆梆的殼,因?yàn)槿绻@個(gè)殼不脫掉,沒法分析他的惡意鎖機(jī)的解鎖密碼。
前面的這兩篇文章介紹脫殼主要是通過IDA動(dòng)態(tài)調(diào)試下斷點(diǎn)dump出內(nèi)存的dex數(shù)據(jù),但是本文不這么玩了,而是借助一個(gè)脫殼工具DexExtractor,這個(gè)工具是開源的:https://github.com/bunnyblue/DexExtractor,這里給出了修改源代碼。其實(shí)他的原理也很簡單,就是修改系統(tǒng)的DexFile.cpp源碼,在解析dex的函數(shù)開頭處加上自己的dumpdex邏輯:

這里的DexHacker就是他自己定義的,這里的dexFileParse就是系統(tǒng)解析dex函數(shù),從參數(shù)可以看到,有dex文件數(shù)據(jù),大小等信息。所以就可以把這個(gè)文件dex文件弄出來了。然后修改完了這個(gè)系統(tǒng)DexFile文件之后,需要將其編譯到system.img鏡像中,然后刷到手機(jī)中即可。
這里大神給出了一個(gè)修改之后的system.img下載地址:https://pan.baidu.com/s/1jG3WQMU,但是需要注意的是,這個(gè)文件是Android4.4系統(tǒng)的,如果想在其他系統(tǒng)版本中操作,需要自己找到系統(tǒng)對應(yīng)的版本找到DexFile源碼,添加上面的代碼,在編譯獲取到system.img文件即可。
所以從上面的原理可以了解到,他其實(shí)和我們之前用IDA動(dòng)態(tài)調(diào)試的原理非常類似,脫殼就是一點(diǎn):不管之前怎么對dex加密,最終都是需要解密加載到內(nèi)存中的。所以只要找到加載dex這個(gè)點(diǎn)即可。那么這種方式和之前調(diào)試的方式有什么區(qū)別呢?
動(dòng)態(tài)調(diào)試方便,無需其他條件限制,但是遇到反調(diào)試就會很難受了。得先解決反調(diào)試才可進(jìn)行下一步脫殼。刷入system.img這種方式可以不用關(guān)心反調(diào)試,但是條件太苛刻,使用成本較高。對于不同系統(tǒng)版本還得準(zhǔn)備不同版本的system.img文件,然后將其刷到設(shè)備中。1、可以選擇刷入system.img文件
針對于上面的這種條件限制,我們有一種好的方式可以解決,就是借助于模擬器,這樣就不需要繁瑣的將system.img刷到設(shè)備中了,可以將編譯之后的system.img文件替換對應(yīng)系統(tǒng)版本的模擬器鏡像文件即可。然后啟動(dòng)模擬器。
2、可以選擇替換系統(tǒng)libdvm.so文件
當(dāng)然我們不刷機(jī)也是可以的,大神給出了編譯之后的libdvm.so文件,其實(shí)上面編譯的system.img有點(diǎn)動(dòng)作太大了,因?yàn)槲覀兙托薷牧薉exFile這個(gè)文件,其實(shí)只要編譯修改后的libdvm.so文件,然后替換設(shè)備的system/lib目錄下libdvm.so文件即可,不過設(shè)備需要root,這種方式比上面的刷機(jī)system.img方便。
上面講解了DexExtractor工具的原理,下面就來詳細(xì)介紹他的用法吧,其實(shí)他的用法也很簡單,把他的源碼下載下來之后,他還有一個(gè)解密工程DexReverse,這個(gè)是一個(gè)java工程,為了解密dump出的dex文件的。那為什么要解密呢?還有這個(gè)工具dump出的dex文件在哪?下面就來詳細(xì)介紹:

看到DexHacker這個(gè)文件中,會將dex文件保存到sd卡中,而每個(gè)應(yīng)用啟動(dòng)的時(shí)候都是在一個(gè)進(jìn)程中創(chuàng)建一個(gè)虛擬機(jī),所以這里如果想讓這個(gè)工具可以dump出應(yīng)用的dex文件,需要給這個(gè)應(yīng)用添加一個(gè)寫sd卡的權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
這個(gè)比較簡單,咋們可以利用apktool反編譯應(yīng)用,在AndroidManifest.xml中添加這個(gè)權(quán)限,在回編譯即可。
那么dump出dex文件之后為何還要解密呢?這個(gè)主要是為了對抗加固策略:
現(xiàn)在一些加固平臺,比如梆梆加固,會對dex的內(nèi)存dump脫殼進(jìn)行檢測,具體的就是hook修改當(dāng)前進(jìn)程的read、write讀寫相關(guān)的函數(shù),一旦檢測到read,write讀寫相關(guān)的函數(shù)的操作中有對dex文件的dump行為會有對抗的處理,防止dex的內(nèi)存dump,因此呢,DexExtractor脫殼工具的作者為了過掉這種內(nèi)存dump的對抗,需要先將原始的dex文件數(shù)據(jù)進(jìn)行base64加密然后進(jìn)行寫文件到sdcard中進(jìn)行輸出,當(dāng)pull導(dǎo)出拿到base64加密的dex文件時(shí)還需要進(jìn)行base64的解密才能獲取到原始的dex文件。這個(gè)解密工具也在工具目錄下Decode.jar,用法:java -jar Decode.jar dexdir;這里需要注意的是,dexdir是我們pull出dex之后的目錄,記住是目錄,不是對應(yīng)的dex文件哦!
到這里我們就分析完了DexExtractor工具的原理,使用條件,使用步驟了,下面咋們就來實(shí)踐一下,把我們在前面說到的那個(gè)應(yīng)用脫個(gè)殼。這里為了簡單,直接啟動(dòng)一個(gè)4.4版本的模擬器,然后替換他的system.img文件。下面的步驟很簡單了:
第一步:替換system.img文件
用上面修改之后的system.img文件替換4.4的system.img文件,文件目錄:AndroidSDK目錄/system-images/android-19/default/armeabi-v7a/system.img

最好把之前的system.img文件進(jìn)行改名備份。然后啟動(dòng)模擬器即可。
第二步:添加寫SD卡權(quán)限
上面說到了,因?yàn)檫@個(gè)工具需要將dump出的dex文件寫到SD卡中,所以我們需要檢查脫殼應(yīng)用是否具備寫SD卡權(quán)限,我們用Jadx工具打開這個(gè)應(yīng)用,發(fā)現(xiàn)沒有,所以我們需要用apktool工具反編譯,然后在AndroidManifest.xml中添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,然后在回編譯重簽名即可。
第三步:安裝應(yīng)用觀察日志
安裝應(yīng)用到模擬器,因?yàn)槭悄M器,可能操作比較麻煩,所以這里需要借助兩個(gè)命令可以完美的安裝啟動(dòng)應(yīng)用即可,一個(gè)是adb install xxx.apk,安裝成功之后。
在啟動(dòng)應(yīng)用:adb shell am start -n tx.QQ898507339.bzy9/tx.qq898507339.bzy9.MainActivity

其中應(yīng)用的包名和啟動(dòng)activity的名稱都可以通過AndroidManifest.xml中查看:

無需任何界面操作即可完成啟動(dòng)應(yīng)用,然后查看這個(gè)包名對應(yīng)的日志信息,日志tag是dalvikvm:
在這些日志中可以看到脫殼之后的dex文件放在sd中,咋們把這個(gè)文件pull出來即可:
adb pull /sdcard/tx.qq898507339.bzy9_classes_927104.dex D:/DexExtractor/
這時(shí)候我們離成功就不遠(yuǎn)了,得到了脫殼后的dex文件了,但是我們還需要進(jìn)行解密。
注意:這里記得觀察"create file end" 字段內(nèi)容,有的應(yīng)用可能內(nèi)部本身有加載dex的邏輯,所以這里會發(fā)現(xiàn)有多個(gè)dex文件的產(chǎn)生,不過沒關(guān)系,可以把所有的dex文件都導(dǎo)出本地,然后分析即可。
第三步:解密脫殼后的dex文件
前面說過了,為了應(yīng)對現(xiàn)在加固平臺的檢測,DexExtractor工具將dex進(jìn)行加密了,可以利用Decode.jar工具進(jìn)行解密:java -jar Decode.jar D:/DexEctractor/

注意,這里的是目錄,不是dex文件哦。然后去目錄查看解密之后的dex文件即可,然后我們用jadx打開這個(gè)dex文件,可惜的是打開失敗,所以就用dex2jar工具將其變成jar文件進(jìn)行查看:

轉(zhuǎn)化的時(shí)候報(bào)錯(cuò)了,說這個(gè)dex是odex文件。關(guān)于odex格式文件不多解釋了,可自行搜索哈。jadx現(xiàn)在還不能識別odex文件的,這里好奇用IDA打開一下,發(fā)現(xiàn)竟然可以成功,所以IDA還真強(qiáng)大哈!

但是咋們用jadx用慣了,所以還是想用jadx打開它,其實(shí)我們只需要將odex轉(zhuǎn)化成dex即可,這里借助了smali.jar工具了,我們先用baksmali.jar將odex文件反編譯成smali文件,然后在用smali.jar將smali文件編譯成dex文件即可。這兩個(gè)工具用法比較簡單:
把c:/classes.dex反編譯為smali,輸出到c:/classout目錄
java -jar baksmali-2.0.3.jar -o c:/classout/ c:/classes.dex 把c:/classout目錄下的smali文件編譯為c:/classes.dexjava -jar smali-2.0.3.jar c:/classout/ -o c:/classes.dex
就用上面這兩個(gè)工具可以把odex文件變成dex文件,然后在用jadx工具打開即可:

在前面查看AndroidManifest.mxl文件中可以找到設(shè)備管理器聲明的類jh,這里直接查看源碼,果然是當(dāng)獲取到設(shè)備管理器權(quán)限之后,立馬將鎖屏密碼設(shè)置成:>>>qq 898507339 bzy>>> ,然后立即鎖屏。鎖屏之后,你不能通過重啟來解決,因?yàn)檫@種惡意軟件肯定監(jiān)聽到了開機(jī)廣播:

所以這時(shí)候,受害者只能通過提示來進(jìn)行付費(fèi)解鎖了。或者自己刷機(jī)操作了。付費(fèi)的邏輯比較簡單,通過加qq,然后惡意者會讓你付費(fèi),給完錢之后他會用電話號碼:18258614534,給你發(fā)送一條短信,代碼中監(jiān)聽到有這條短信就自動(dòng)解鎖,也就是將鎖屏密碼清空即可:

看到了這里我們就把這個(gè)軟件給脫殼破解了,下面來總結(jié)一下脫殼的流程和現(xiàn)在惡意鎖屏軟件原理:
第一、DexExtractor脫殼原理
通過修改系統(tǒng)DexFile.cpp源碼,添加dump出dex的邏輯,然后將其編譯到system.img和libdvm.so中,對于我們可以使用模擬器將system.img進(jìn)行替換,或者用真機(jī)替換system/lib目錄下的libdvm.so文件,從而讓每個(gè)應(yīng)用啟動(dòng)的時(shí)候使用到DexFile類功能都會執(zhí)行我們dump出dex的邏輯。
關(guān)于這個(gè)工具使用的步驟也非常簡單:
第一步:啟動(dòng)模擬器選擇修改后代碼的system.img文件。
第二步:檢查脫殼程序是否具備寫SD卡權(quán)限。
第三步:查看脫殼程序?qū)?yīng)的日志,tag是dalvikvm。發(fā)現(xiàn)create file end等信息段。找到脫殼之后的dex文件路徑。
第四步:將sd卡中脫殼之后的dex文件導(dǎo)出到本地,在使用Decode.jar工具進(jìn)行解密即可。
第五步:解密之后的dex格式odex,所以為了使用jadx方便查看代碼邏輯,可以使用smali.jar工具將其轉(zhuǎn)化成dex文件。
第二、鎖機(jī)原理
通過本文的案例可以看到,現(xiàn)在一些惡意的收費(fèi)鎖機(jī)軟件,故意利用軟件名稱吸引用戶安裝,安裝之后就引導(dǎo)用戶授權(quán)然后進(jìn)行鎖機(jī),當(dāng)用戶被鎖機(jī)之后只能通過給錢解決,當(dāng)然也可以自行刷機(jī)了。本文中的這個(gè)軟件的案例就利用了系統(tǒng)的設(shè)備管理器來設(shè)置系統(tǒng)的鎖機(jī)密碼。關(guān)于設(shè)備管理器這個(gè)權(quán)限,其實(shí)有很多用途,比如可以擦除設(shè)備數(shù)據(jù),防止被卸載的功能,感興趣的同學(xué)可以自行搜索。
本文資料下載地址:http://download.csdn.net/detail/jiangwei0910410003/9748357
注意:system.img文件是Android4.4版本的,切不可替換錯(cuò)誤!
本文脫殼其實(shí)是借助了DexExtractor工具進(jìn)行的,但是原理都是一致的,就是不管之前dex怎么加密,最終都是需要解密加載到內(nèi)存中的,所以在這個(gè)時(shí)刻,進(jìn)行操作dump出dex即可。對于之前介紹的方式使用IDA動(dòng)態(tài)調(diào)試下斷點(diǎn)來dump出dex這個(gè)最大的問題就在于如何解決反調(diào)試問題,而這個(gè)工具操作就可以無需關(guān)心反調(diào)試了。但是這種方式操作也是比較麻煩的,因?yàn)椴僮鞯那疤釛l件比較多。好了到這里就介紹完了本文的內(nèi)容,看完的同學(xué)記得多多分享擴(kuò)散哦,如果有打賞那就最好了!
更多內(nèi)容:點(diǎn)擊這里
關(guān)注微信公眾號,最新技術(shù)干貨實(shí)時(shí)推送



新聞熱點(diǎn)
疑難解答