天天看點

通過文本分類檢測中的代碼混淆

作者:區塊軟體開發

概述

安卓APK中的混淆

混淆是軟體開發中常用的技術,用于使代碼更難了解、分析和逆向工程。它将代碼轉化為一種複雜而紛繁的形式,同時保留其功能。混淆的主要目标是阻礙對代碼的未經授權通路,保護軟體的知識産權或者隐藏軟體的真實行為。

在Android APK中,常用多種混淆技術來保護代碼,使其更難了解或逆向工程。其中一種技術是代碼混淆,它将源代碼轉換為等效但更複雜的形式,使其難以解讀和分析。另一種常用的技術是字元串加密,在這種技術中,敏感字元串(如API密鑰或URL)被加密,以防止輕易提取。此外,還采用控制流混淆來幹擾代碼的邏輯流程,使其難以跟蹤程式的執行路徑和了解其功能。

混淆對Android安全的影響

混淆技術的使用增加了安全研究分析的難度,并使一些基于簽名的檢測方法失效。字元串加密使得追蹤關鍵資訊變得具有挑戰性。這些措施使得惡意軟體更難以識别和追蹤。

一種基于文本分類的軟體包混淆檢測方法

出于這些原因,我們的公司——Liansecurity開發了一款名為"Incinerator"的産品,旨在提供高效、準确和自動化的逆向工程服務。通過對惡意軟體的廣泛分析和先前混淆檢測技術的研究,在我們的Android APK逆向工程産品“焚化爐"中實作了一種基于文本分類的混淆檢測方法。根據我們的測試,我們的方法實作了98%的準确率,這超出了我們的期望。在接下來的章節中,我們将較長的描述我們的方法。

背景

在檢測Android應用程式中的混淆技術方面,最先進的系統是"AndrODet"。在這項工作中,作者建構了一個混淆檢測系統,針對每種混淆類型提取不同的特征,然後訓練一個線上機器學習模型。下面列出了目标混淆類型和AndrODet實作後的測試結果:

  • 辨別符重命名:0.92
  • 字元串加密:0.79
  • 控制流混淆:0.67

AndrODet在Android環境中的局限性

在Android的背景下,AndrODet面臨某些限制,影響其作為靜态代碼分析工具的準确性和有效性。主要集中在兩個方面:

基于APK的計算和特征弱化

AndrODet計算其度量名額是基于整個APK,包括核心業務代碼和關聯的庫檔案。在Android生态系統中,依賴庫可能會非常龐大,有時甚至比核心業務代碼本身還要大。而且大多數情況下,依賴庫并不需要進行混淆。當僅依靠整個APK進行計算時,這些大型未混淆的庫的存在削弱了混淆部分的重要性,最終影響了AndrODet進行正确判斷的準确性。

無法處理Unicode編碼

AndrODet計算距離的方法局限于ASCII編碼。然而,使用Unicode編碼進行混淆技術的使用越來越普遍。是以,AndrODet無法處理和分析使用Unicode編碼進行混淆的代碼。這個限制阻礙了該工具在真實生産場景中準确檢測和評估混淆代碼的安全性和品質方面的能力。

AndrODet的限制對其在真實生産場景中的準确性構成了挑戰。了解這些限制及其對真實生産環境的影響對于尋求改進Android應用程式安全領域代碼分析工具能力的研究人員和從業者至關重要。

我們的方法

我們的方法主要解決了代碼混淆技術中最常見的辨別符重命名的識别問題,這是惡意軟體常用的混淆技術。我們的方法也可以擴充到字元串加密。在我們的研究中,我們觀察到,當研究人員評估一個代碼片段是否被混淆時,他們最初的判斷依賴于類名、方法名和變量名的可了解性,以及可識别和常用的編碼約定,即所謂的“編碼英語”,與類似'a'、'Zb'、'c4'、'1li'、'0Oo'等不容易了解的名稱進行對比。最初,我們嘗試了算法方法來解決這個問題,但測試結果不怎麼理想。然而,我們突然想到,這實際上是一個經典的自然語言(NLP)分類問題。

憑借這一靈感,我們将混淆檢測問題轉化為文本分類問題,而深度神經網絡處理文本分類,已經非常成熟。我們的測試結果也證明了這種轉換非常成功。“字元串加密”本質上也是一個文本分類問題,是以我們相信這種方法可以輕松擴充到字元串加密。

方法說明

第1步:反編譯和Smali提取

第1步涉及反編譯AndroidAPK和提取Smali代碼。在我們的實作中,我們使用我們自己的反編譯引擎"Reactor”。其他開源工具,如AndroGuard或Apktools也可以。從每個類中,我們提取類名和類變量名,這些是下一步分析的輸入。理論上可以提取更多特征,如函數參數名稱和局部變量,但提取更多的特征對準确率沒有太大的提升,因為前面的三個特征已經達到了很高的準确性。

第2步:建立訓練集

建立兩個不同的訓練集。第1個訓練集是混淆的類生成的資料,标記為1。第2個訓練集是未混淆的類生成的資料,标記為0。

通過文本分類檢測中的代碼混淆

第3步:文本分類神經網絡訓練

我們建構了一個文本分類神經網絡。該神經網絡使用步驟1中提取的特征和步驟2中的相應标簽進行訓練。通過利用深度學習網絡模型進行訓練。

該模型分成3層:嵌入層、LSTM層和密集層。

1)嵌入層:嵌入層将輸入整數序列轉換為密集矢量表示。

2)LSTM層:LSTM(長短期記憶)層是一種能夠處理序列資料和捕獲長期依賴關系的循環神經網絡(RNN)。在該模型中,使用了具有128個單元的LSTM層。

3)Dense層:Dense層是一個全連接配接層,對LSTM層的輸出進行線性變換并應用sigmoid激活函數。

第4步:訓練

我們從1000個資料樣本開始,發現結果已經非常不錯。随着我們将樣本量增加到10000,準确率和驗證準确率都變得非常令人滿意。最終,我們的模型使用100000個資料樣本進行了訓練。我們試圖進一步擴充資料集,但準确率和驗證準确率沒有提高。為了避免由單個APK生成的資料引起的偏差,我們從資料庫中随機提取了幾百個APK來生成我們的資料。從生成的數百萬個資料樣本中,我們随機選擇了100000個進行訓練。

通過文本分類檢測中的代碼混淆

訓練結果如下:

訓練準确率:99.75%

驗證準确率:98.50%

實驗結果與分析

在實際應用中,為了确定一個APK是否被混淆,我們使用了一種方法,該方法涉及檢查APK内的每個類是否進行混淆。通過将混淆類的數量除以類的總數,我們可以計算APK中混淆代碼的比例。盡管在理論,針對每個類,判斷可能出現假陽或者假陰,但是在判斷一個APK是否存在現象時,很難出錯,因為一個被混淆的APK,需要確定它的大部分代碼很難了解,這正是混淆的目的和最終呈現,大部分難以了解的類,是不能逃過模型的檢測的。是以,我們的模型在确定APK中是否存在混淆時達到了接近100%的準确率。

第一輪訓練後,我們從Fdroid和Abuse各擷取了1000個APK,進行驗證測試。FDroid代表良性apk, abuse代表惡意 apks,測試後,我們發現有較高機率出現假陽,一些非常短的内部類,例如”Class: MainActivity ExternalSyntheticLambda15; Method: <init> run Field: f$0 f$1 f$2 “ 這樣的情況,模型無法判斷是否是混淆。為了解決這個問題,我們從假陽的apk中,抽取了3000條資料樣本,加入訓練集合。重新訓練,再次訓練後,極大的降低了假陽。

下面是我們抽取随機的100個測試樣本,因為我們的模型校驗準确率是98.5%,是以測試結果中,混淆覆寫率1%,2%這樣的情況,應該判斷為沒有混淆。剩下結果中的4%(md5:8328cd96c931d06d25f67d42a50fd20d)這個是誤報,分析原因是因為這個apk的類非常少,三條假陽資料導緻了這個錯誤。其他的5%(923df6854199e999fdd274729b28a1ad),7%(71e293f29e636112e0a00ebac8cf3eb8)都是真實存在的混淆。是以這個模型,判斷混淆的準确率接近100%,而且APK中存在非常少量的混淆也是可以檢測出來。

我們的訓練集中并沒有出現 unicode的混淆樣本,但是在測試的時候,這種情況也會被識别為混淆,因為模型對非混淆的文本有非常好的識别,是以即便出現樣本中沒有出現的其他混淆情況,也可以識别。

APK APK Md5 Obfuscation Coverage
et.nWifiManager.apk 11c43f6d781457352e5e61e725998ea8 0%
jackpal.androidterm.apk 8bbc3d9173e6d6b19e561a8651e83731 0%
com.boombuler.widgets.contacts.apk 8328cd96c931d06d25f67d42a50fd20d 4%
cz.jirkovsky.lukas.chmupocasi.apk 86f763c8cf4530e1c46c75d26374855a 99%
com.example.poleidoscope.apk 08cf9be157669f3e0f7dd88975fdc22c 1%
dufmvh.frdnoj.oggtsh.apk cf2f9963933457dcdd1f28fec054cd07 56%
ua.com.radiokot.lnaddr2invoice.apk c1ade85027c6178e43daac2e957ba9b1 96%
org.openbmap.unifiedNlp.apk 79ce98b9d38490625ad15f5948afe32f 0%
com.dekics.chat.message.apk dc84f225fdb1c21071ee70d43af39224 50%
org.getdisconnected.libreipsum.apk a394d3131303bd24bdcddc7e0a507f0d 1%
com.pnr.engproverbsandsayings.apk 1d28e138a9ecf1c9b3240868879bbd54 10%
org.ligi.blexplorer.apk 49619da57858ffdd6bd55bb5b962efe3 1%
net.osmand.srtmPlugin.paid.apk c7dd9b418933ceea723527487bd94268 1%
org.broeuschmeul.android.gps.bluetooth.provider.apk cf1d9aa2d5eec5a8e0af76d9708a8da0 0%
com.intense.pub1.sbgs.apk e272df5c9abd7d4c03982bb506922428 15%
tgr.kitach.messenger.apk cd4acd78cf29adf56837e944c0ea3791 50%
com.github.lamarios.clipious.apk 0e728b50b101456d74329f97552ea2db 94%
com.ctbcad.cnove01.apk 782216c3d9db96da2ef0285daddbdcdb 0%
in.ac.iitb.cse.cartsbusboarding.apk ee83d9a3c3fcffbd833f1b73d28d28cd 2%
de.reimardoeffinger.quickdic.apk 8e5e7cc0e581fac6c5d83802dadc0095 98%
com.fastcleaner.forphoneandroid.freenoads.apk c31ca58e67d55bb20a06e0f986cf04c1 92%
com.gh4a.apk 22556b8c3b0f4196b0db777d64cac5ee 1%
nznm.qfvxs.apk a827ee829d6067eda9c19f1dee15b9af 1%
com.freezingwind.animereleasenotifier.apk c0786ccbcfe7cb57f82f36a66040d452 1%
ogjp.otmyswhz.apk ef3c97b748088019dc986dce53ae0755 1%
com.scare.obscure.apk b11e72c94d810958df65d8716d853bc3 46%
org.smc.inputmethod.indic.apk c9eeb111666c723e3a4f78e2e11ab10d 1%
com.blame.annual.apk 376fc34c1eb64a348311156b1f22763e 45%
org.xapek.andiodine.apk 923df6854199e999fdd274729b28a1ad 5%
ir.PluTus.pluto.apk dc9f73c8ec88a8b493a15a3cbcb36f15 33%
org.sufficientlysecure.viewer.apk dcb35395a9a3fa0aea0bd9c876c4fadc 1%
ir.shz.shzkisi.apk 7ec247424733c287c3322fc49f1a7766 33%
com.mimic.left.apk 4076db4387eb8ddf8f2010e3db8c8b07 59%
com.igllc.reign.apk bb78d33aac9b1c0c741b9e66d1ad9710 96%
org.tuxpaint.apk 5f1d4d542004efd946a40a26166aed00 1%
Adliran.ir.apk 3c0cccf2790ba49a122d0235225dbceb 26%
com.believe.blouse.apk 768ec2246d2c92330ba8fafe6513963e 5%
Rahbar.Api.apk 2f1570b5b5723d3f4ddd615905e8c08f 27%
net.everythingandroid.smspopup.apk 1e5d955dabdd0ee548054c8cdc223653 1%
com.cointrend.apk cb3726beeb870d96e2dd458da66af96b 97%
com.junjunguo.pocketmaps.apk 0be11a3a032b35e2ce8021d32780cf32 21%
com.kabood.koroshkabir.apk 6129cc4392d2e10ffdb80db67ca2534b 24%
site.leos.setter.apk 2f03d669939c74b508a3959838fbba4c 94%
jp.co.qsdn.android.jinbei3d.apk f25da1334e4db5d6c14c2361ba4defa8 1%
ir.game.co.apk 9849247aef1aa1ae82c4dc06a638f29d 1%
fr.xgouchet.texteditor.apk a3f79b347a1c06140697326acb04581a 1%
org.smssecure.smssecure.apk a6dcb00ee7482256f8070b2d2eb23f62 2%
com.ebaschiera.triplecamel.apk d36cd1850f8dfec7298c08e8eed3f997 1%
org.y20k.trackbook.apk d4054bf60b2fbcfc152b32397cb861b0 97%
com.comfort.digital.apk a32c36009a37893be90e4f385b26b5ee 35%
com.kylecorry.trail_sense.apk 42501430e5b199df00f0068b3bd59db4 92%
com.helphomestickers.heartcarejingchat.apk fec9d39eb80814e1eec29e52e0fede2d 50%
de.markusfisch.android.pielauncher.apk d0cf7f183b84ff040f237da0d7e89c58 90%
org.xcsoar.apk 35923a4197bcd2efd8d22a167af3f028 1%
com.takela.message.apk 55774d1c8251ee3c12ce08af65000bd7 16%
tech.bogomolov.incomingsmsgateway.apk 85d0288b9b04c7d71bfd8185a916490b 1%
com.rmowa.wpamz.apk 23e49cc28a5feeed4b9e362aa43e158a 65%
piste.security.path.vf.apk 95d33595783ede50bd428a18823ca0a9 20%
de.rwth_aachen.phyphox.apk 0a3fa3b09980e629c6a983a2c33d0400 1%
com.brief.blouse.apk be9d61e3363c3399b55a44895fd1cf60 47%
xjl.lrl.jzk.xkbnif.apk f140ec3c051717491aac1a477c0f453a 44%
net.goroid.maya.apk 9b1de8718bb348e74ecde66dfa7332a8 19%
eu.polarclock.apk c3c6f8ba040f1715d32ac7563d7d9b0c 33%
tube.chikichiki.sako.apk d79144a6e4aad73e78bc25af25e8f8d1 1%
org.dyndns.fules.ck.apk 7c1e243288ff30b602976d2ce634b0f3 0%
com.nima.demomusix.apk 93a79a8f1b2ad1eb2b670782e571107d 1%
aps.js.piste.asd.apk b1e0ad60b4113ecfdf74e930848dcab4 21%
com.tutpro.baresip.apk 702d0800421413f73f0f3d65a577986e 1%
iroj.jnafjk.apk d0118fe80f1af4cf2fad4579fa7f8741 1%
de.monocles.mail.apk 21ce417bd40a12c2333ab505a0095891 1%
com.example.myapplication.apk 52a5b10ae074459fbbeb1a0e8c297eac 1%
com.piolang.transltor.voice.apk c4c0982149feaf5266d6b2a9c4634858 84%
net.sourceforge.kid3.apk 7bff47951d893d50b7bf1bb151225006 1%
com.burtonben.goodlauncher.apk d7ffbdf8e491f0c3e53901cf830f10b2 9%
com.howwatchfunsms.locktextmessage.apk d59b366ab1870d17f9abdd4824461327 0%
free.vpn.unblock.proxy.turbovpn.apk 1fd53adfc1ff5f6262567592dfc88fd4 70%
com.yshlhh.com.apk f0c84c3ffcc77a88ce344e7f632afb2d 67%
com.feis.bphealthy.blood.apk 6e05b674fb8725a4f1faae9d39be1b94 14%
org.servalproject.apk 8b2df68517574eb0c7d1b42858403695 1%
plus.H59300BC9.apk 889e1c52bdebe6e1ae952bcc38b5daf1 11%
mon.suxzgi.apk b48f43a3c6b7c4ef07b7f87b62f64d61 1%
com.seleuco.easshs.apk 013a0f9ddc9db42f06ae2cd1b6228c8f 31%
com.vicman.toonmeapp.apk f724e92bdf978fb3bbdac308d4ba800c 73%
com.hugo.apk 6320c822ba4ce417ffb82746dbf6f6f8 27%
org.segin.bfinterpreter.apk 69d3cd2ef0e619193f145c89b22ce920 1%
de.jonasbernard.tudarmstadtmoodlewrapper.apk 29bf40b35ce52d6e44c61304fdd8561a 1%
com.belt.space.apk 71e293f29e636112e0a00ebac8cf3eb8 7%
center.bestlinks.samuraivpn.apk f6e5f704bf5910b4d0aff44df2a77a8b 91%
com.dev.xavier.tempusromanum.apk 1d51ef04566cc66661358f7708c0a9d3 1%
com.zanghh.pdfreader.apk e9133a533614dafee5780d50b29484c3 91%
org.avmedia.gshockGoogleSync.apk f942cf3de1107400be084ddd596016d9 1%
com.github.igrmk.smsq.apk 72dfae851b1c93838094fe3b059ac5b1 1%
com.ljechbei.apk 87118a9b63adebe8ad642509ff76818b 16%
org.courville.nova.apk 7041af61162329c4e2022d82939a2d2d 1%
com.cliambrown.easynoise.apk 8755ffdd6fe155593af77536bc8d1da1 1%
net.mullvad.mullvadvpn.apk 956659e2df6362a79e110fac0fda3534 65%
nl.eduvpn.app.apk aa2099699b3c8b68aa33925899ad9e84 96%
com.cheogram.android.apk 4987ea46c3679a191434c1546231bade 1%
io.pslab.apk 37f9a2a3e4c906bf2cc3c14895620b1e 1%
ru.yanus171.feedexfork.apk 742aebc4c88564678e78276dbf29e935 1%

限制和未來方向

本文讨論的都是針對辨別符重命名的混淆檢測,相同的辦法可以應用到字元串檢測上。但是不能應用到控制流混淆檢測。AndrODet的結果在這方面的表現也不盡如人意。未來我們會針對控制流檢測專門設計新的模型。

與AndrODet相比,我們的模型需要相對更多的時間來确定APK是否被混淆,因為它需要單獨檢測每個類。雖然可以批量檢測,但APK可能包含數千甚至數萬個類。然而,在生産環境中,這是可以接受的,因為分析APK涉及靜态分析、動态分析等各個方面,需要更長的時間來執行。是以,在我們的産品中,混淆檢測的等待時間是合理的。此外,這個時間也可以通過并行架構處理來緩解。

結論

我們提出了一種基于文本分類的方法來檢測APK是否被混淆。這種方法以前在現有研究中沒有應用過,可以擴充到其他軟體中的混淆檢測以及字元串加密檢測。此外,我們建議APK中混淆的檢測應該在類級别進行,因為這樣可以達到基本100%的準确率。

我們已經在正式生産環境中實作了這種方法。

from https://www.freebuf.com/articles/mobile/370247.html

繼續閱讀