在Android操作系統(tǒng)中,APK文件是一個包含多種普通文件和可執(zhí)行文件的ZIP格式文件。在一個正常的APK文件中,其壓縮的根目錄下會包含一個名為classes.dex的DEX可執(zhí)行文件,并且可能在lib目錄下包含一個或多個ELF格式的動態(tài)鏈接庫文件。如果在這個APK文件中,在其他位置還包含其他的APK、DEX或ELF格式的可執(zhí)行文件或動態(tài)鏈接庫文件,我們稱之為出現(xiàn)了異常的可執(zhí)行文件。
安全軟件在檢測惡意代碼的時候,不僅會對APK,classes.dex以及相關(guān)動態(tài)鏈接庫文件的特征進(jìn)行匹配檢測,并且同時會對APK中異常的可執(zhí)行文件特征進(jìn)行檢測。
這里以egdata家族的樣本為例,介紹其采用的一種對異常的可執(zhí)行文件的隱藏方式,來逃避安全軟件對相關(guān)惡意代碼文件的檢測,并增加檢出的難度。
樣本egdata.a是一個被攻擊者篡改并重新打包過的萬年歷應(yīng)用,在運(yùn)行時會提示程序更新,但是由于簽名不同,更新會失敗。
圖1 egdata.a運(yùn)行截圖
對樣本的APK文件結(jié)構(gòu)和官方應(yīng)用的結(jié)構(gòu)進(jìn)行比較,發(fā)現(xiàn)樣本在/assets目錄下多了一個eg.data文件,對eg.data的文件頭部內(nèi)容進(jìn)行識別發(fā)現(xiàn)開始2個字節(jié)為PK,進(jìn)行解壓,其根目錄下包含AndroidManifest.xml,classes.dex,為標(biāo)準(zhǔn)的APK文件。
圖2 egdata.a(左)和官方應(yīng)用(右)APK結(jié)構(gòu)對比
圖3 eg.data文件內(nèi)容
通過對樣本APK的分析,其在類com.android.commond.Egrecvol中的createSingleInstall()方法實(shí)現(xiàn)了從/assets中提取eg.data。
釋放eg.data后,使用動態(tài)的方式調(diào)用所需的代碼,方式如下:
使用DexClassLoader動態(tài)加載釋放的eg.data文件,返回ClassLoader;
調(diào)用loadClass方法加載關(guān)鍵類,這里加載的類“com.suntu.engine3.engine.Main1”;
獲取該類的Constructor
調(diào)用newInstance創(chuàng)建類,并初始化,至此惡意代碼被徹底調(diào)用起來
當(dāng)eg.data這個APK文件被動態(tài)加載執(zhí)行后,它會執(zhí)行自身的com.suntu.engine3.engine.jni.JNIEngine類下的realeseFile()方法釋放一個.so的本地動態(tài)鏈接庫文件。這個被釋放文件的實(shí)際內(nèi)容以byte數(shù)組的形式存儲在Java代碼中。
以下是這個數(shù)組的一個片段:
在這個樣本中,依舊采用了常規(guī)的添加異常的APK文件并動態(tài)加載的方式[1],但是通過在代碼中存儲.so動態(tài)鏈接庫文件內(nèi)容的方式實(shí)現(xiàn)對異常的動態(tài)鏈接庫文件的隱藏。
變種egdata.c是一個被攻擊者篡改的酷我音樂應(yīng)用【2】,其采用了更加隱蔽的方式來隱藏包含有惡意代碼的APK文件,從而來增加安全軟件對其特征提取和識別的難度。
其APK文件結(jié)構(gòu)如下所示。
圖4 egdata.c APK結(jié)構(gòu)
在/assets目錄下有兩個jpg圖片文件emg.jpg,wkag.jpg,其中emg.jpg不能正常顯示為圖片。在變種APK的cn.kuwo.player.MainActivityyb類中的releaseClassData()方法實(shí)現(xiàn)從wkag.jpg文件中提取APK文件并動態(tài)加載。這里是從wkag.jpg文件的1024字節(jié)偏移處開始到文件最后為隱藏的APK文件內(nèi)容,并且每個字節(jié)做了減一變換。