接上篇:深度分析使用高級反調試和反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個步驟。

  1. FileUtil.dxfile() 用來解密 /data/data/com.web.sdfile/files/png.ico 文件并保存它到/data/data/com.web.sdfile/app_dex/.do。
  2. 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。
  3. 它刪除解密后的root工具 /data/data/com.web.sdfile/app_dex/.do 和 /data/data/com.web.sdfile/app_dex/ 文件夾。
  4. 它會在/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

  1. 推送色情(Push porn) 下面是以是一些推送色情的截圖.

圖64 app推送色情到設備上

  1. 在主屏幕上創建快捷方式

創建的快捷方式包括色情,hot app,hot video等。下面是一些創建快捷方式的關鍵代碼和一些屏幕截圖。

圖65 創建主屏幕上的代碼片段

圖65 主屏幕的快捷方式

  1. App和廣告的推廣

除了獲取設備的root權限外,這個app通過推廣app和廣告為這個app的創建者產生收入。推廣的app和廣告是特別讓用戶厭煩的。

下面是一些app推廣屏幕截圖:

圖67. App和廣告的推廣

  1. 正常安裝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

  1. 推送通知

這個惡意app會推送通知并誘導用戶在點擊它在瀏覽器里打開這個URL。

下面是推送通知的代碼片段。

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

圖74.被惡意app推送的通知

  1. 下載文件 我們找到了被下載到/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


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/209/