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

從包名可以看到是梆梆加固的,咋們也看不到他的代碼了,所以第一步咋們得先脫殼了,在這之前我們?cè)倏纯此那鍐挝募?/p>

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

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

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

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

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

最好把之前的system.img文件進(jìn)行改名備份。然后啟動(dòng)模擬器即可。
第二步:添加寫(xiě)SD卡權(quán)限
上面說(shuō)到了,因?yàn)檫@個(gè)工具需要將dump出的dex文件寫(xiě)到SD卡中,所以我們需要檢查脫殼應(yīng)用是否具備寫(xiě)SD卡權(quán)限,我們用Jadx工具打開(kāi)這個(gè)應(yīng)用,發(fā)現(xiàn)沒(méi)有,所以我們需要用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的名稱(chēng)都可以通過(guò)AndroidManifest.xml中查看:

無(wú)需任何界面操作即可完成啟動(dòng)應(yīng)用,然后查看這個(gè)包名對(duì)應(yīng)的日志信息,日志tag是dalvikvm:
在這些日志中可以看到脫殼之后的dex文件放在sd中,咋們把這個(gè)文件pull出來(lái)即可:
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的邏輯,所以這里會(huì)發(fā)現(xiàn)有多個(gè)dex文件的產(chǎn)生,不過(guò)沒(méi)關(guān)系,可以把所有的dex文件都導(dǎo)出本地,然后分析即可。
第三步:解密脫殼后的dex文件
前面說(shuō)過(guò)了,為了應(yīng)對(duì)現(xiàn)在加固平臺(tái)的檢測(cè),DexExtractor工具將dex進(jìn)行加密了,可以利用Decode.jar工具進(jìn)行解密:java -jar Decode.jar D:/DexEctractor/

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

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

但是咋們用jadx用慣了,所以還是想用jadx打開(kāi)它,其實(shí)我們只需要將odex轉(zhuǎn)化成dex即可,這里借助了smali.jar工具了,我們先用baksmali.jar將odex文件反編譯成smali文件,然后在用smali.jar將smali文件編譯成dex文件即可。這兩個(gè)工具用法比較簡(jiǎn)單:
把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工具打開(kāi)即可:

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

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

看到了這里我們就把這個(gè)軟件給脫殼破解了,下面來(lái)總結(jié)一下脫殼的流程和現(xiàn)在惡意鎖屏軟件原理:
第一、DexExtractor脫殼原理
通過(guò)修改系統(tǒng)DexFile.cpp源碼,添加dump出dex的邏輯,然后將其編譯到system.img和libdvm.so中,對(duì)于我們可以使用模擬器將system.img進(jìn)行替換,或者用真機(jī)替換system/lib目錄下的libdvm.so文件,從而讓每個(gè)應(yīng)用啟動(dòng)的時(shí)候使用到DexFile類(lèi)功能都會(huì)執(zhí)行我們dump出dex的邏輯。
關(guān)于這個(gè)工具使用的步驟也非常簡(jiǎn)單:
第一步:啟動(dòng)模擬器選擇修改后代碼的system.img文件。
第二步:檢查脫殼程序是否具備寫(xiě)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ī)原理
通過(guò)本文的案例可以看到,現(xiàn)在一些惡意的收費(fèi)鎖機(jī)軟件,故意利用軟件名稱(chēng)吸引用戶安裝,安裝之后就引導(dǎo)用戶授權(quán)然后進(jìn)行鎖機(jī),當(dāng)用戶被鎖機(jī)之后只能通過(guò)給錢(qián)解決,當(dāng)然也可以自行刷機(jī)了。本文中的這個(gè)軟件的案例就利用了系統(tǒng)的設(shè)備管理器來(lái)設(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即可。對(duì)于之前介紹的方式使用IDA動(dòng)態(tài)調(diào)試下斷點(diǎn)來(lái)dump出dex這個(gè)最大的問(wèn)題就在于如何解決反調(diào)試問(wèn)題,而這個(gè)工具操作就可以無(wú)需關(guān)心反調(diào)試了。但是這種方式操作也是比較麻煩的,因?yàn)椴僮鞯那疤釛l件比較多。好了到這里就介紹完了本文的內(nèi)容,看完的同學(xué)記得多多分享擴(kuò)散哦,如果有打賞那就最好了!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注