(翻譯)FakeKaKao木馬分析

這是暑假時看到的一篇病毒分析文章,以爲裏面有不少東西值得學習,恰好這幾天有空就將它翻譯了出來。有不對的地方請你們指正!android

FakeKaKao木馬分析

Virus Bulletin是一個關於流氓軟件垃圾郵件防禦、偵測以及移除的雜誌。它常常給出一些關於最新病毒威脅的分析,發表探索反病毒領域的最新進展,採訪反病毒的專家,而且評估現存的反病毒產品。web

1 假冒的KaKaoTalk安全插件分析

Android/FakeKaKao木馬將本身假裝成一個KaKaoTalk安全插件,以誘導用戶安裝。一旦用戶安裝了這個插件,它就會監視收發的短信,發送垃圾短信,收集敏感信息並提交到遠程服務器。更加嚴重的是,它組合了反調試和反模擬器跟蹤的功能,這樣就使得一些安全軟件失效。並不一樣於其餘惡意軟件,此木馬的dex文件主要做爲一個加載器存在。在本文中,經過剖析此惡意軟件的行爲,咱們將會看到一些調試和分析的方法。算法

1.1 APP加載器

加載器註冊了3個組件:MainActivity, ActionReceiver以及MoriService。MainActivity用於啓動一個精心設計的用戶接口來誤導用戶,如圖1所示:數據庫

 

ActionReceiver用於接收android.intent.action.USER_PRESENT廣播,當設備被喚醒的時候,系統會發送此廣播。爲了確保儘量早地接收到此廣播,該惡意軟件將此Receiver的intent filter權限值設爲0x7fffffff。當一個廣播到達的時候,MoriService組件就會在後臺啓動,此服務的調用方法在本地庫libEglsv1.so中。爲了順利地運行此惡意軟件,它請求了以下權限:promise

• READ_SMS安全

• READ_CONTACTS服務器

• READ_PHONE_STATE網絡

• SEND_SMS架構

• WRITE_EXTERNAL_STORAGE併發

• WRITE_SMS

• INTERNET

• RECEIVE_SMS

 

1.2 反調試和JNI初始化

啓動了的service首先加載libEglsv1.so到惡意軟件的進程地址空間。當一個庫被初始化的時候,它就會嘗試檢測它是否正在被調試或運行在模擬器中。若是發現了二者之一,就會設置一個反調試和模擬器的標記,用於事後的操做:

• strace

• ltrace

• android_server

• gdbserver

• gdb

• tcpdump

• ro.kernel.qemu

• /system/bin/qemu-props

• /system/bin/qemud

完成初始化工做以後,它會經過RegisterNatives註冊6個native方法。而後調用SetJNIEvn方法來初始化JNI環境變量,此變量用於調用其餘的native方法。可是,若是反調試標記爲真,那麼剩下的native方法就什麼也不作,以防止安全人員的分析。圖2展現了native方法的註冊過程:

 

1.3 C&C通信

惡意軟件收集被感染設備的用戶私密信息,而後使用AES-192算法加密這些信息。在將這些加密信息發送到遠程服務器以前,它先從加密的config.js文件中提取遠程服務器的列表,這個文件包含在APK文件中,也使用AES-192加密。更加巧妙的是,它不只僅加密了這個配置文件,還使用調用uncompress API解壓遠程服務器列表。圖3展現瞭解密後的服務器列表:

 

在上圖中,咱們能夠看到兩個服務器信息條目:第一個用於網絡測試;另外一個纔是真正的C&C服務器信息。

收集到的信息將會被分割爲兩部分,咱們將之稱爲ID部分和MD部分。ID部分包含以下信息:

• id IMEI

• token product brand and model

• target build version

• rd flags existence of /system/bin/su or /system/xbin/su

• fo  compromised phone number

MD部分包含以下信息:

• md same as id

• fo  compromised phone number

• ds  contact name and number list

惡意軟件首先向遠程服務器發送ID部分,用以註冊受感染的設備。若是服務器返回數據‘0’,那麼它就會發送MD部分。若是返回爲‘1’,就不會發送。圖4展現了一個樣例:

 

而後,它從遠程服務器中請求過濾規則。這些規則用於過濾接收到的短信和SMS數據庫。惡意軟件使用下述的關鍵字來篩選信息:

• plist  matches phone number of message

• klist  matches message content

• blist  matches nickname of message

• allmsgs  spam message content

• snumber  specific phone number by malware

• smsg  message which is sent to snumber

• allmsg  another spam message content

• checked  flag, sends spam message or not

• unlock   flag, stores the contact  list or not

圖5a和5b展現了一個過濾規則的事例:

 

 

惡意軟件會記錄此service每次啓動的時間,當service下一次啓動的時候,它就會從新發送收集到的信息,而且若是交互時間間隔大於30分鐘的話,還會請求新的過濾規則。

1.4 監視短信

爲了監視短信,軟件會首先經過registerReceiver註冊一個新的廣播receiver。而後它將receiver的intent fileter的權限值設爲0x7fffffff,以確保其擁有最高的接收優先級,進而在第一時間處理短信。不管短信何時達到,軟件都會使用上面提到的規則進行過濾——好比,匹配電話號碼,搜尋消息內容等。軟件還將調用abortBroadcast方法來防止它感興趣的消息被髮送給其餘低優先級的receiver。

爲了監視SMS數據庫的變化,軟件經過registerContentObserver註冊了一個內容觀察者。不管數據庫何時發生了變化,它都會採用相似於檢測短信的方式檢測每一條消息。

不管匹配的消息來自於receiver仍是observer,軟件都會加密它們併發送至遠程服務器。而且只要receiver或observer被觸發,軟件都會從新發送收集到的信息,並請求新的過濾規則。

1.5 發送短信

是否發送垃圾短信是由過濾規則中的關鍵字"checked", "allmsgs", "allmsg"的值決定的。若是"checkes"值不爲0,而且"allmsgs"或"allmsg"不爲空,軟件就會向聯繫人列表中的每一位聯繫人發送垃圾短信。發送垃圾短信的間隔時間是40秒。若是受感染的設備號碼爲空,它會就發送關鍵字"smsg"的內容到有關鍵字"snumber"指定的號碼中。另外,它也會從本地數據庫中刪除本身的發送短信記錄,以銷燬證據。

1.6 自我保護機制

在這一部分,軟件嘗試將FOTAKILL.apk安裝到/system/app/folder目錄下。FOTAKILL是一個第三方應用程序,用來阻止FOTA(Firmwate Over-The-Air 更新服務)。其實FOTA的初衷是用來防止更新固件後清除用戶已經得到的特權,如root權限。爲了安裝這個APK,軟件經過getuid來檢測用戶的UID。若是UID是root,它就會讀取/data/system/packeges.list文件,這個文件記錄了設備上全部已經安裝了的APK信息。若是此列表包含任意下述安全相關的字符串,它就會經過"pm disable"命令來關閉這些軟件:

• com.avira.android

• com.antivirus

• com.kms

• com.wsandroid.suite

• com.qihoo360.mobilesafe

• com.ijinshan.duba

• com.tencent.qqpimsecure

• com.anguanjia.safe

• com.lbe.security

• com.netqin.mobileguard

• com.avast.android.mobilesecurity

• com.estsoft.alyac

• com.lookout

• com.zoner.android.antivirus

• com.symantec.mobilesecurity

• com.drweb.pro

• com.drweb

• com.drweb.pro.market

• com.symantec.mobilesecurity

• com.symantec.monitor

 

1.7 分析方法

衆所周知,在Android平臺使用native編碼的一個壞處就是它會增長應用程序的複雜度。此軟件就是使用了這個特性經過增長逆向分析的難度,從而達到保護本身的目的。調試native庫的一個通用方法就是attach調試器到目標進程。可是,在這個案列中,咱們可能沒法attach到進程,由於此應用程序已經運行過了咱們想要下斷點的地址。因此,咱們須要知道如何在咱們想要調試地址下第一個斷點。最簡單有效的方式就是使用一條單指令進入無限循環狀態。在咱們想下斷點的地址處,可使用一個無條件跳轉指令代替咱們原來的指令。鑑於native庫是基於ARM架構的,因此更改後的指令格式以下:

Set

Formate

Byte code

THUMB

1110  0XXX  XXXX  XXXX

FE  E7

ARM

1110 1010 XXXX....XXXX

FE  FF  FF  EA

譯者注:將本身想要下斷點地方的指令換成上面的 byte code便可完成  {B 本身}指令,這就實現無條件無限跳轉了。

不用重打包修改後的 APK,咱們只須要使用adb替換掉當前庫便可。下面分析人員就能夠逐步分析病毒了。

相關文章
相關標籤/搜索