這是一篇非反病毒工程師的非專業分析,寫完發現更像逆向教程,文中如果有疏漏,歡迎批評指正。
0x00 前言
最近在吾愛破解論壇病毒救援區看到一個鎖機樣本,說是root鎖,雖然帖子好幾天了但還沒人分析,樓主應該線刷系統了,打算就以這個練練手吧。很久也沒分析鎖屏App了,之前有個王者榮耀輔助的樣本,不過沒root鎖,想看看最近勒索App有什么新花樣。話說,現在惡意軟件都喜歡蹭熱度,什么游戲流行就偽裝什么外掛。

0x01 信息收集
先安裝樣本到模擬器里看看(模擬器萬一搞壞了,大不了卸載重新安裝),安裝完成后會有一個“荒野行動盒子”的圖標,運行后發現App申請Root權限,(很多外掛都需要Root權限,勒索軟件以外掛為名倒是很容易讓人放松警惕):

這里點擊“永久記住選擇“,然后點擊”允許“,看看勒索軟件搞什么鬼。發現這個勒索App還做了一個外掛界面:

等一會模擬器自動重啟了。重啟完成后,發現如愿以償,模擬器被鎖了,鎖屏界面如下(鎖屏界面忒丑了):

隨便輸入“123456“,點擊”解鎖“發現沒有反應,點擊高亮的”解鎖20元“,發現有提示:

意思是點100次就會解鎖,這種都是調戲人的。要是可以免費解鎖,那還怎么勒索那20塊錢?
0x02 反編譯分析
接下來祭出神器jadx反編譯分析,反編譯后發現資源里面的結構有點不一樣:

正常情況下,apk反編譯后應該是下面這種結構:

原來res目錄下的drawable、layout等資源全部被混淆了。打開r下的0文件發現其實就是編譯后的layout文件:

這個樣本其實是使用了MT管理器的”RES資源混淆“功能。(MT管理器是一個可以在安卓手機上修改apk文件、反編譯dex、修改smali、修改xml、重打包的App,功能很強大)。
代碼的入口是MainActivity:

代碼簡潔的不得了,LogCatBroadcaster看著很眼熟吧,進去看看代碼:

這就是AIDE的特征(AIDE是一款可以在安卓手機上編寫安卓App的開發工具,分析過勒索App的應該都很熟悉了) 。
再來看看e.busybox函數,發現代碼混淆了,那還是使用JEB接著分析吧,分析完混淆函數,然后重命名一下,看著還不是很清楚:

尤其是下面一大堆的StringBuffer:

先把函數拷貝出來,精簡掉StringBuffer,代碼清晰多了:

這部分代碼功能很清晰:復制libjiagu.so到App私有目錄的a/k.bat文件中,再復制lib2jiagu.so到App私有目錄的a/libStarEngine.so文件中,然后解密k.bat得到key.bat文件,再獲取key.bat文件的包名保存到e.packageName中,這里可以看出來key.bat(即libjiagu.so文件)是一個apk文件。繼續看下面代碼:

接著執行“ls data“命令,安卓App中要執行系統命令,必須申請root權限,代碼執行到這里就需要申請root權限。不過這里執行這個命令沒起到什么作用。
這里根據安卓系統版本分別進行處理,如果小于5.0,先把key.bat釋放到/system/app/并改名為time.apk,然后釋放libStarEngine.so到/system/lib/libStarEngine.so, 判斷是否安裝了com.example.xphuluxia,如果安裝了就卸載,最后重啟手機,安裝激活勒索App。補充一下,com.example.xphuluxia是一個名為防鎖俠的App,據說可以查殺鎖屏勒索App,個人還沒測試過。
繼續看后面代碼:

從大段重復代碼可以看出作者很擅長CVM模式(ctrl+c、ctrl+v、modify)(個人猜想寫病毒維護應該很少吧)。
這里需要用到e.packageName,我們先來獲取一下包名,使用命令行獲取一下模擬器的當前Activity即可:

即e.packageName=”com.hl.app”。現在來分析勒索App在5.0及其以上系統時的操作:釋放key.bat到/system/priv-app/com.hl.app/并改名為com.hl.app.ap;釋放libStarEngine.so到 /system/priv-app/com.hl.app/lib/arm/libStarEngine.so;重啟手機,系統重啟后會自動安裝/system/priv-app/com.hl.app/com.hl.app.apk,激活勒索App。
分析到這里,現在清楚了,這是一個字母型的勒索App,母App任務應該完成了,可以通過Manifest.xml文件再確認一下:

這里沒有申請任何權限,所以母App就是個殼,已經不需要繼續分析了。
0x03分析子包
接下來分析真正的鎖屏勒索子包代碼,我的模擬器系統是4.4,使用adb先導出病毒文件到電腦:

然后使用jadx反編譯,這里同樣是使用MT管理器做了資源混淆:

查看AndroidManifest.xml,入口還是MainActivity:

LogCatBroadcaster就不用看了,還是AIDE的特征,沒什么作用。主要是啟動了com.hl.app.MyApp服務。繼續看看這個服務代碼:

代碼混淆了,那用JEB繼續分析,先看看a類:

很明顯這是一個DES的加密解密算法類,所以a類被重命名為a_Cryptor。再看hx1:

很明顯,創建全屏的浮動窗口,遮擋其他App導致無法操作,達到鎖屏效果。那么重命名為hx1_showLockView1,重命名變量、函數名稱后,添加注釋代碼如下:

這里初始化了加密密鑰,然后創建了全屏浮動窗口達到鎖屏效果,繼續看代碼:

這里更新了a_crypt的密鑰,然后生成隨機數保存在lock1xlh中,設置點擊響應函數,其中100000000是假的,騙人點100次的函數,最后的100000001才是真的解鎖判斷函數,繼續看100000001的onClick代碼:

Try代碼塊是一堆解密、轉換代碼,最后關鍵的是if語句,判斷輸入和隨機碼計算后的結果是不是相同,相同則進入第二層鎖屏界面。所以,解鎖密碼就是這一堆代碼計算后再與隨機碼計算的結果。這里b類代碼被重命名為b_AES,set函數被重命名為set_replaceAndReverse。解密的代碼就不用看了,我們寫解密算法時直接copy過來用就行了,這時候就要發揮CVM模式(ctrl+c、ctrl+v、modify)的長處。
0x04解密第一層鎖屏
接下來寫計算第一層解密密碼的算法,創建java工程,把100000001的onClick代碼復制過來,中間需要依賴的類: a_Cryptor、b_AES、c以及其他相關函數全部從JEB復制過來,修改錯誤后,把onClick函數改成getLockView1Pass,主要代碼如下(記得前面有a_crypt更新密鑰的相關代碼,要復制過來):

lock1xlh就是鎖屏界面上的隨機碼,運行后你就可以得到解鎖密碼了。我的隨機碼是477042,計算后得到解鎖密碼:1200556544,在模擬器中輸入后,點擊解鎖,然后進入第二層鎖屏,作者還是那么囂張,界面依然奇丑無比:

0x05分析第二層鎖屏
接下來繼續JEB分析第二層鎖屏。查看hx2代碼,這里改名為hx2_showLockView2:

還是一樣的配方,隨機碼保存在lock2xlh中,創建全屏浮動窗口達到鎖屏效果,解鎖按鈕點擊響應函數是100000002,繼續看代碼:

代碼有點亂,拷貝出來精簡一下:

注釋都寫清楚了,關鍵是理解最后代碼,輸入的解鎖碼v2前3位經過sha、md5之后就應該等于“9fd09fe7fd77ab118ef78795668bc8a1”,后9位等于隨機碼經過md5、sha之后保留數字位的前9位。下面就可以寫代碼計算了。
0x06 解密第二層鎖屏
由于解鎖碼都是數字,前3位經過sha、md5之后就應該等于“9fd09fe7fd77ab118ef78795668bc8a1”,這個可以寫代碼爆破。算法很簡單,如下所示:

lock2xlh就是第二層鎖屏界面上的隨機碼,運行后你就可以得到解鎖密碼了。我的隨機碼是498691,計算后得到解鎖密碼:187360012293,在模擬器中輸入后,點擊解鎖,鎖屏終于解除了。
之前還有個libStarEngine.so,在app代碼中并沒有發現加載該庫文件的代碼,IDA查看也沒有發現什么,經過搜索發現是一個3d引擎,在這里也沒有什么實際作用。
到這里,鎖屏App已經分析完了。
0x07 總結
結合之前分析,總結一下:
- 這是一個子母型的勒索App,母App主要完成解密、釋放子病毒文件。病毒文件在5.0以下系統是
/system/app/time.apk、/system/lib/libStarEngine.so;5.0及其以上系統是/system/priv-app/com.hl.app/com.hl.app.apk、/system/priv-app/com.hl.app/lib/arm/libStarEngine.so。 - 子病毒文件被加密后放在母App中,主要目的應該是繞過殺毒軟件檢測,效果如何見后文。
- 子病毒文件被釋放到系統App目錄中,系統雙清是無法刪除病毒文件的。
- 如果手機沒有root,或者沒有給勒索App授予root權限,那么是不會受影響的,只要卸載該“荒野行動盒子”即可。
- 病毒代碼中雖然寫了很多加密算法:AES、DES、md5、sha及字符替換等等,但還是很容易寫出解密算法的。
- 另外,這個樣本中可以看到使用了AIDE、MT管理器,這兩個工具可以完成病毒App的開發、修改,也就是說,你只要有個安卓手機,就可以完成病毒的制作、修改過程,可以不用PC來完成,這個變化是值得注意和警惕的。
這里我簡單寫了一個計算解鎖碼的程序,需要java環境支持,用法很簡單:
java -jar unlock_hyhz.jar,然后按照提示輸入屏幕解鎖碼即可,執行效果如下圖所示:

下載地址:https://share.weiyun.com/46ffd85b4467fa564819262cbe32df5a
Hash校驗:CRC32: 346A9DCB
MD5: 6BC24E74AA3C80FE2C85F0ADD84F5772
SHA-1: E0D693064D2A4350A4FC4B4B700F891420ED446C

5.0及以上系統執行:

最后所有系統上需要卸載母包:

0x09 測試一下殺毒軟件
最后把樣本上傳到virustotal.com上看了一下,有17款殺毒軟件檢測出來問題:

國產的阿里、360、騰訊、瑞星都可以檢測出來。附鏈接。
如果把子包直接放上去再看看,檢測率還降低了:

我也是醉了,不知道國外那幾個是怎么檢測的,不過國產的阿里、360、騰訊、瑞星還是可以檢測出來的,附鏈接。
總體感覺,這個檢測率還是偏低的。這個檢測結果可能也無法代表安卓手機端的檢測率。
0x010 后記
個人感覺,自從5月份 wannacry爆發之后,不管是PC還是安卓系統,國內勒索病毒也越來越多了。而且現在安卓手機端的病毒可以使用安卓手機App開發、修改,那么分發、傳播起來會更快,變種也會更多,這些都是PC上病毒沒有的特點,需要引起重視。
最后,對于普通用戶來說,防范措施非常簡單,只要保持良好的使用習慣即可避免被鎖屏勒索:
- 不要root手機!(除非你非常懂安全,即使被鎖也能自己搞定)
- 不要下載、安裝來歷不明的App!
- 安裝一個殺毒軟件。
最重要的還是前兩個習慣,因為“安全問題很多時候都是人的問題”。
0x011 附錄
樣本來源:https://www.52pojie.cn/thread-672111-1-1.html
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/486/
暫無評論