接上篇:深度分析使用高級反調試和反hook的Android Rootnik Malware,Part I:在Native層調試
原作者:Kai Lu
譯者:BlackTrace
在Part I中,我們分析了native層和獲得了解密后的第二個dex文件,在PartⅡ中我們將繼續分析它。為了保持文章的連續性,我們將繼續保持從part I中的章節序號。
IV. 第二個dex文件
下圖是解密后的文件,它是jar文件格式。這個就是通過multidex方案動態加載的第二個dex文件

圖25. 解密后的第二個apk文件包含dex文件
解壓"decrypt.dump",你會看見名為"classes.dex"的文件在這個文件夾里。

圖26. 名為classes.dex
接下來,我們分析這個classes.dex

圖27. 反編譯第二個dex文件和AndroidManifest.xml文件
從上圖,我們可以看出classes.dex是名為“file Helper”的惡意app的主要邏輯。
下圖是com.sd.clip.activity. FileManagerActivity類里的"OnCreate"方法

圖28. FileManagerActivity類里的OnCreate方法

圖29. initadv()方法

圖30. Nws類
在Nws類中的getStart方法是用來開啟com.hg.mer.PG服務。下圖是類PG的定義

圖31. service com.hg.mer.PG類
在startService()方法被調用后,OnCreate方法被調用,緊接著是調用OnHandleIntent()方法。在上圖中,我們用紅色標記了4行關鍵代碼,我們接下來依次分析這4行關鍵代碼。
1. readDex()
下圖是readDex()方法的代碼片段

圖32. readDex()方法
基于我的分析,類Sheu是base64的實現類,因此Sheu.decode("S0suYmlu")的結果是字符串“KK.bin”。接著,程序打開在程序的assets文件夾里的KK.bin,并且讀取它的內容,提取一些有用的信息。
下面是KK.bin的文件內容

圖33. assets文件夾里的KK.bin文件
這個程序從KK.bin文件的結尾提取了一下信息。有7個使用base64編碼的字符串存儲在數組列表中。這里的getAppid()方法就是用來解碼這些字符串的。

圖34. 解碼字符串
這7個字符串解碼后的結果如下
Pls.Kbin: wddex.jar
Pls.OI: xdt
Pls.PL: com.svq.cvo.Rtow
Pls.Jr: getDex
Pls.Wv: sgdex
Pls.As: dos.jar
Pls.NQ: KK.bin
2.dxfile()
下面是dxfile()方法的代碼片段

圖35. dxfile()方法

圖36. UnZipFolder()方法
方法 Pls.UnZipFolder()提取來自KK.bin的加密內容。這部分加密內容開始于KK.bin文件偏移0x20到偏移0x1CDB,這部分內容被保存到/data/data/com.web.sdfile/files/wddex.jar。這部分內容是使用DES算法加密的。
這個程序在dxfile()解密/data/data/com.web.sdfile/files/wddex.jar文件的內容到/data/data/com.web.sdfile/app_sgdex/dos.jar文件。
3.DexClassLoader()
這個方法的構造如下

在這個方法的調用,形參dexPath的值是“/data/data/com.web.sdfile/app_sgdex/dos.jar”,形參optimizedDirectory 的值是“/data/data/com.web.sdfile/app_xdt”。
這個方法是用來從.jar和.apk類型的文件內部加載classes.dex文件。通過這種方式可以用來執行非安裝的程序代碼,作為程序的一部分進行運行。優化后的dex文件寫入文件夾 data/data/com.web.sdfile/app_xdt中的dos.dex。
在從/data/data/com.web.sdfile/app_sgdex/dos.jar加載完之后,這個程序將刪除這個文件。
4.動態調用類com.svq.cvo.Rtow的getDex()方法
接下來,讓我們檢查一下dos.dex

圖37. 反編譯dos.dex
下圖是類class com.svq.cvo.Rtow的getDex方法:

圖38. 類class com.svq.cvo.Rtow的getDex方法

圖39. 類Dwol的結構
在類com.kdw.xoa.Dwol的結構中,有一個新文件mda.ico被創建到/data/data/com.web.sdfile/files/文件夾中。這里,它是調用downloadFile方法去遠程服務器[http://gt[.]rogsob[.]com/stmp/ad.png]()下載payload,并把payload保存到/data/data/com.web.sdfile/files/mda.ico。這個payload使用的是DES算法加密。

圖40. downloadFile方法

圖41. initData()方法
下面是silentInstall方法的定義。

圖42. silentInstall方法
上圖中的5處紅色的標記解釋依次如下。
a. 類Dwol的方法dxfile是被用來解密/data/data/com.web.sdfile/files/mda.ico這個payload的。這個解密后的payload保存到了/data/data/com.web.sdfile/app_snex/dkt.jar。
b. 類Ngss的upZipFile方法是被用來解壓解密后的payload dkt.jar到 /data/data/com.web.sdfile/files/ 文件夾中。它包含以下文件:

圖43.payload的文件
c. 解壓完后,它會刪除 /data/data/com.web.sdfile/app_snex/dkt.jar 和 /data/data/com.web.sdfile/files/mda.ico 這兩個文件和 /data/data/com.web.sdfile/app_snex/ 這個目錄。
d. 重命名 /data/data/com.web.sdfile/files/ 文件夾里的 classes.dex 為wsh.jar。
e. 動態加載/data/data/com.web.sdfile/files/wsh.jar里的classes,并且優化app_outdex 目錄,存儲這個dex緩存文件到wsh.dex。
f. 調用類 com.rootdex.MainActivity 類的getDex方法。
接下來,我們深入的看看這個wsh.dex,它主要運行root工具去root設備并且安裝應用到系統app文件夾里。

圖44. 反編譯wsh.dex
下面是類com.rootdex.MainActivity的getDex方法的定義。

圖45. 類com.rootdex.MainActivity的getDex方法
a. 方法GetActivie是用來收集設備信息并把這些信息發送到遠程服務器上。遠程服務器的URL是[http://grs[.]gowdsy[.]com:8092/active.do]()。下面是這個操作的捕獲的包:

圖46. 發送收集的信息到遠程服務器
b. 檢查一下文件是否存在于 /data/data/com.web.sdfile/files/ 文件夾里,并把他們的文件名字加到數組列表中,用來準備下一步的ruut設備。
c. 在這個設備上運行root工具。
接下來,在run()方法里的HandleRoot()方法被調用。
圖47. HandleRoot()方法。
下面是copyRootFile方法的關鍵代碼片段。

圖48. copyRootFile方法
在這個方法里,有4個步驟。
- FileUtil.dxfile() 用來解密 /data/data/com.web.sdfile/files/png.ico 文件并保存它到/data/data/com.web.sdfile/app_dex/.do。
- FileUtil.UnZip() 是用來解壓 /data/data/com.web.sdfile/app_dex/.do 這個文件到 /data/data/com.web.sdfile/.rtt 文件夾,這個文件夾是系統隱藏文件夾,解壓到里面的文件包含6個ELF運行文件,詳細如下圖。它包含了r1,r2,r3,r4,4個root exploit。
- 它刪除解密后的root工具 /data/data/com.web.sdfile/app_dex/.do 和 /data/data/com.web.sdfile/app_dex/ 文件夾。
- 它會在/data/data/com.web.sdfile/files/ 文件夾里創建一個名為psneuter.js的新文件。它的內容如下。

圖50. psneuter.js文件
在executeRootAct方法里handOrimiddle被調用。下面是4個通過命令行運行root exploits的4個代碼片段:

圖51. 通過shell命令行運行root exploits
研究這些可執行文件后,我發現r3是來自dashi root工具中的MTK root方案,r4是來自開源項目android-rooting-tools中的一個exploit(CVE-2013-6282),r2是CVE-2012-6422,這個exploit是Samsung Exynos上的root exploit。
handleOriMiddles方法是通過shell命令行運行root exploit和一些命令。所有的shell命令如下:
.png)
圖52. root設備時執行的所有命令
成功得到root權限后,這個名為psneuter.js的腳本在超級用戶權限下運行。這個腳本的主要目的是在/system/priv-app/ 文件夾下安裝root權限的應用。
之后我們將研究兩個新的apk文件。為了避免被普通用戶捕獲,這個兩個app在受害者的設備上安裝后是沒有圖標的。
此外,還有其他的一個名為 rsh的腳本通過shell命令行運行

圖53. 通過shell命令行運行rsh腳本
這個rsh腳本是不同的,它是基于Build.MANUFACTURER屬性的。這個腳本內容如下:

圖 54. rsh(1)腳本

圖55. rsh(2)腳本
BSetting.apk 是如何工作的。
如圖50所示,abc.apk是放在 /system/priv-app/ 并重命名為 BSetting.apk 并且 BSetting.apk 是通過pm安裝的。
BSetting.apk服務是遠程控制服務,它從遠程服務器獲取任務并運行任務。
這個app是運行在后臺的并且在設備上沒有圖片,下面是這個app的信息

圖55 BSetting.apk的信息
這個app偽裝它自己為Android sync service。反編譯這個apk的文件結構如下圖:

圖56. 反編譯abc.apk

圖57. abc.apk里面的AndroidMainfest.xml
BroadcastReceiver com.sfy.oyr.R 執行這個app的主要邏輯。

圖58 類R
這個程序首先解密assets文件夾里的jif.png。這個文件是一個dex文件。然后這個程序使用java的反射機制加載類并運行一些方法。
我們反編譯這個解密后的dex文件,如下圖所示:

圖59 反編譯classes.dex
類ADService的launchTancTask 方法是用來從遠程服務器上獲取任務和執行任務。

圖60. 從遠程服務器上獲取任務
下圖是從遠程服務器獲取任務的包,這個遠程服務器又兩個域名,一個是主域名 grs[.]gowdsy[.]com,還有一個備用域名 grs[.]rogsob[.]com。從遠程服務器上返回的響應信息是xml文件,這個文件的任務類型包含了用來推送色情信息的url,用來下載apk的url和app安裝類型等。

圖61. 從遠程服務器獲取任務的包
根據不同的任務類型,app在不同的方式下運行任務,下面是關鍵代碼片段:

圖62 根據不同的任務類型運行任務
遠程控制服務能夠執行多個惡意行為,包括但不只是下面的行為:
1. Uninstall app
它使用android系統的“pm uninstall”卸載app

圖63 通過shell命令行運行pm unintall來卸載app
- 推送色情(Push porn)
下面是以是一些推送色情的截圖.



圖64 app推送色情到設備上
- 在主屏幕上創建快捷方式
創建的快捷方式包括色情,hot app,hot video等。下面是一些創建快捷方式的關鍵代碼和一些屏幕截圖。
圖65 創建主屏幕上的代碼片段


圖65 主屏幕的快捷方式
- App和廣告的推廣
除了獲取設備的root權限外,這個app通過推廣app和廣告為這個app的創建者產生收入。推廣的app和廣告是特別讓用戶厭煩的。
下面是一些app推廣屏幕截圖:









圖67. App和廣告的推廣
- 正常安裝app和靜默安裝app
這個惡意app根據獲取的任務類型來使用不同的方式安裝app。下面是正常通安裝app的代碼片段,這種方式在安裝時,是有安裝視圖的。
圖68. 正常安裝app
這個app使用android系統的"pm install -r"功能來靜默安裝非系統app到/system/priv-app/ 成為系統app。

圖69 靜默安裝非系統app
在/data/app/文件夾里我們找到了一些安裝完成了的apk文件(包括,但不只是以下這些)。
圖70 在文件夾/data/app/里的被惡意安裝的apps

圖71. 命令安裝系統app
在/system/priv-app/ 文件夾里,我們也找到了安裝完成了的一些apk文件(包括,但不只是一下這些)

圖72 在文件夾/system/priv-app/ 里的被惡意安裝的apps
- 推送通知
這個惡意app會推送通知并誘導用戶在點擊它在瀏覽器里打開這個URL。
下面是推送通知的代碼片段。

圖73. 推送通知的代碼片段

圖74.被惡意app推送的通知
- 下載文件
我們找到了被下載到/sdcard/文件夾下的很多文件和文件夾。
這些文件有apk文件、jar文件、圖片、日志文件等。這些文件是安裝app生成的,其中的一些是執行惡意行為。

圖75.下載到/sdcard/文件夾下的文件和文件夾
解決方案
惡意樣本被Fortinet Antivirus檢測簽名為Android/Rootnik.PAC!tr。
通信交流的遠程C2服務被Fortinet IPS檢測并簽名為 Android.Rootnik.Malware.C2.
總結
通過前面的分析,我們能看出,這個rootnik惡意app是非常強的并使用非常高級的反調試和反hook技術來防止被逆向工程,不同類型的文件和字符串加密。除此之外,它還使用了multidex 方案來動態加載和安裝第二個擁有惡意的主邏輯的dex文件。這個惡意app使用一些開源的android root exploit工具和dashi root工具里的MTK root方案在Android設備上獲取root權限。在設備上成功獲取root權限后,rootnik malware 能執行多樣的惡意操作,這些操作包括app和廣告的推送、推送色情(pushing porn)、在主屏幕上創建快捷方式、靜默安裝app和推送通知等。
附錄
## Rootnik Malware樣本
# Package Name: com.web.sdfile
SHA256: E5E22B357893BC15A50DC35B702DD5FCDFEAFC6FFEC7DAA0D313C724D72EC854
Additional APK files dropped into system partition by Rootnik malware
# Package Name: com.br.srd
SHA256: E2BDCFE5796CD377D41F3DA3838865AB062EA7AF9E1E4424B1E34EB084ABEC4A
# Package Name: com.oyws.pdu
SHA256: CEE6584CD2E01FAB5F075F94AF2A0CE024ED5E4F2D52E3DC39F7655C736A7232
# C&C Server
gt[.]rogsob[.]com
grs[.]gowdsy[.]com:
qj[.]hoyebs[.]com
qj[.]hoyow[.]com
gt[.]yepodjr[.]com
翻譯,難免會有錯誤,還請指正。萬分感謝.我的bolg地址:www.kejidi.net --BlackTrace
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/209/
暫無評論