這是暑假時看到的一篇病毒分析文章,以爲裏面有不少東西值得學習,恰好這幾天有空就將它翻譯了出來。有不對的地方請你們指正!android
Virus Bulletin是一個關於流氓軟件與垃圾郵件防禦、偵測以及移除的雜誌。它常常給出一些關於最新病毒威脅的分析,發表探索反病毒領域的最新進展,採訪反病毒的專家,而且評估現存的反病毒產品。web
Android/FakeKaKao木馬將本身假裝成一個KaKaoTalk安全插件,以誘導用戶安裝。一旦用戶安裝了這個插件,它就會監視收發的短信,發送垃圾短信,收集敏感信息並提交到遠程服務器。更加嚴重的是,它組合了反調試和反模擬器跟蹤的功能,這樣就使得一些安全軟件失效。並不一樣於其餘惡意軟件,此木馬的dex文件主要做爲一個加載器存在。在本文中,經過剖析此惡意軟件的行爲,咱們將會看到一些調試和分析的方法。算法
加載器註冊了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
|
啓動了的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方法的註冊過程:
惡意軟件收集被感染設備的用戶私密信息,而後使用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分鐘的話,還會請求新的過濾規則。
爲了監視短信,軟件會首先經過registerReceiver註冊一個新的廣播receiver。而後它將receiver的intent fileter的權限值設爲0x7fffffff,以確保其擁有最高的接收優先級,進而在第一時間處理短信。不管短信何時達到,軟件都會使用上面提到的規則進行過濾——好比,匹配電話號碼,搜尋消息內容等。軟件還將調用abortBroadcast方法來防止它感興趣的消息被髮送給其餘低優先級的receiver。
爲了監視SMS數據庫的變化,軟件經過registerContentObserver註冊了一個內容觀察者。不管數據庫何時發生了變化,它都會採用相似於檢測短信的方式檢測每一條消息。
不管匹配的消息來自於receiver仍是observer,軟件都會加密它們併發送至遠程服務器。而且只要receiver或observer被觸發,軟件都會從新發送收集到的信息,並請求新的過濾規則。
是否發送垃圾短信是由過濾規則中的關鍵字"checked", "allmsgs", "allmsg"的值決定的。若是"checkes"值不爲0,而且"allmsgs"或"allmsg"不爲空,軟件就會向聯繫人列表中的每一位聯繫人發送垃圾短信。發送垃圾短信的間隔時間是40秒。若是受感染的設備號碼爲空,它會就發送關鍵字"smsg"的內容到有關鍵字"snumber"指定的號碼中。另外,它也會從本地數據庫中刪除本身的發送短信記錄,以銷燬證據。
在這一部分,軟件嘗試將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
|
衆所周知,在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替換掉當前庫便可。下面分析人員就能夠逐步分析病毒了。