1. SpyNote5.0 是什麼?
SpyNote是用來建立Android惡意程式的工具。它的功能十分引人注目,包括但不限於讀取聯絡人、錄音、執行命令、管理應用程式、記錄鍵盤、進行GPS定位等。這些功能在研究安卓惡意軟體時起到了關鍵的作用。咱們能夠透過一系列文章對於它的使用初步了解,《SpyNote V5.0圖形化工具遠端管理Android手機教學》、《小心,Android木馬工具SpyNote免費啦!遠端監聽就是這麼簡單》、《當心,安卓遠控(spynote)升級了…》等等。
2. 準備工具
對於SpyNote5.0 Client_APK的逆向分析卻鮮有人問津,以下我簡單介紹使用工具,然後開始進入逆向分析環節。
1、SpyNote5.0
下載網址:https://github.com/soDLL/SpyNote OR https://github.com/miladzero/SpyNote
#2、jadx-gui
下載網址: https://github.com/skylot/jadx/releases
3.androidkiller
下載網址: https://www.guguzhu.com/soft/270509.html
3. 開始反向分析
咱們開始對於Client_APK進行分析,通常喜歡將客戶端產生的APK程式拖入androidkiller。一旦程式被拖入androidkiller,它將自動進行反彙編,並產生程式的分析結果。
在左側依照繼承關係分類Activity、Receiver、Service和應用程式權限(Uses-Permisson),能夠看到客戶端需要的應用權限很多。右側則是smail彙編視窗和工作台。這個工具可以清楚顯示權限和各種繼承關係,但由於工具版本較低,程式碼還原不夠完整。我更換了工具並使用jadx-gui,隨後開始進行逆向分析,將Client_APK匯入。
咱們可以看到三個包,分別是android.support,con.eset.ems2.gp,yps.eton.application。其中android.support為安卓本支援包其中包括低版本、v4、v7,con.eset.ems2.gp為配置包裡麵包含了host、client_name等信息,yps.eton.application則是咱們需要分析的。
打開yps.eton.application,咱們能看到14個類別,由於需要分析的程式碼比較多,所以有針對性的對於部分關鍵程式碼進行分析。
透過先前androidkiller分析架構能夠看到,A、F、G、k 這個寫入類別繼承了Service,Service 在安卓系統中代表後台持續運作。咱們不妨猜下,Client_APK中需要持續運作的可能會有什麼?也許是關鍵物件會持續運作、受控、監聽、多執行緒等等。咱們本次分析的重點在於它部分功能以及如何辨識流量。
3.1指令執行啟動分析
我們從A方法開始,先啟動服務,然後遍歷R物件並取得第三個元素,如果它等於1,則執行j()函數。否則在判斷a()是否已經被實例化後啟動服務。之後會繼續判斷j()是否具備root權限。
繼續看j(),j()中使用執行su指令後,將Do I have root?寫入檔案/system/sd/temporary.txt,對於是否為root權限進行了判斷。
接著看h(),之中使用了多線程,取得R物件中的儲存的設定參數,採用循環和socket回傳訊息。
3.2 Base64編碼應用部分功能分析
在查看A物件的導入清單時候發現之中包含android.util.Base64,說明在運行之中使用了base64編碼。緊接著搜尋關鍵字Base64,能夠看到Base64包裹著((BitmapDrawable) applicationIcon).getBitmap(),其實內部就是應用圖示。客戶端將一些訊息透過c0c1c3a2c0c1c分割以9xf89fff9xf89結尾傳遞,對於異常訊息和選項採用fxf0x4x4x0fxf分割傳遞。
<br>
<br>
public void k() { new Thread(new Runnable() { public void run() { StringBuffer stringBuffer = new StringBuffer(); Packageget packageManager = A.this. ); ageName) != null && !packageManager.getLaunchIntentForPackage(applicationInfo.packageName).equals ("")) { 日期日期= new Date(packageManager.getPackageInfo(applicationInfo.packageName, 4096).firstInstallTime); unch (applicationInfo.flags & 1) == 1 ? "系統" : "用戶" : ""; Drawable applicationIcon = packageManager.getApplicationIcon(applicationInfo.packageName);字串 str3 = new String(); if (applicationIcon != null) { 位元圖上使用中對位圖來說(BitmapDrawable); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.JPEG, 50, byteArrayOutputStream); str = Base64.encodeToString(byteArrayOutputStream.toByteArray(), 2); } else { str = str3; } 0c1c" str2 "c0c1c3a2c0c1c" date.toString( ) "c0c1c3a2c0c1c" A.this.getPackageName() "9xf89fff9xf89"); } catch (NameNotFoundException e) { A.this.h("applicationsfxf0x4x4x0fxfString, 0fxfage"); } } } } stringBuffer.toString()); } catch (Exception e2) { A.this.h("applicationsfxf0x4x4x0fxf[My/Exception]" e2.getMessage().toString()); } } })。開始(); }
3.3 資訊取得部分功能分析
A对象中包含了一个非常冗长的方法b,其中使用了过多的switch case语句分支,导致反汇编出现异常。观察注释不难看出,里面实现了大多数的获取信息的逻辑。例如:Device info、System info、Sim info、WIFI info等等,包含了工具所宣传的功能。
在b方法的重写里面有些地方值得注意,这里用于获取存储路径。传输路径信息的分隔符使用e1x1114x61114e。文件名信息分隔符使用-1c0c1c3a2c0c1c-1c0c1c3a2c0c1c-1c0c1c3a2c0c1c。通过这些信息能够较为准确的判断客户端传递时的操作。
4. 总结
在分析过程中能够看到各个功能的实现。在客户端使用未加密和Base编码传输时,最显著的特征是分隔符号的出现。通过程序能够有效地判断,Client的传输行为。于是对于传输过程进行抓包。
图中明显看到分隔符号和base64编码内容。对于这点咱们可以在Snort中编写规则进行识别,识别示例:
alert tcp any any -> any any (content:"fxf0x4x4x0fxf"; sid:1; msg:SpyNote5.0 Client;)
以上是怎麼進行SpyNote5.0 Client_APK逆向分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!