Le code de TowelRoot n'étant pas accessible au public, j'ai eu recours à la décompilation de la dernière version de l'APK, téléchargée à partir de l'adresse suivante Site web de TowelRoot afin d'examiner si l'application a besoin de l'autorisation INTERNET.
Notes pertinentes
Une fois la décompilation réussie, il s'est avéré que ni les activités ni le code lui-même n'étaient obscurcis. Le développeur avait certainement prévu que cette application ferait l'objet d'une enquête, mais il avait laissé le code aussi transparent que possible. Le fichier le plus important que nous avons à ce stade est le suivant TowelRoot.smali
qui décrit tout le fonctionnement de cette application.
Note : selon votre version particulière d'ApkTool, les numéros de ligne peuvent varier.
Structure initiale
Dans les lignes 13-22
le code initialise un champ appelé fingerprint
. Le code correspondant est le suivant :
.field fingerprint:Ljava/util/List;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/List",
"<",
"Lorg/apache/http/NameValuePair;",
">;"
}
.end annotation
.end field
qui est une liste Java composée de paires clé-valeur, à utiliser lors de la collecte des informations pertinentes du téléphone.
Données collectées
Dans les lignes 56-215
le code décrit une méthode appelée fillInFingerprint
qui est chargé de récupérer les données appropriées à envoyer au site Web TowelRoot, afin de vérifier si le dispositif peut être enraciné via l'exploit homonyme. Cette méthode fait un usage intensif de l'outil d'exploitation susmentionné. fingerprint
champ. Les données recueillies sont les suivantes.
Modèle de dispositif
Le modèle de dispositif visible. Lignes 70-80
:
iget-object v4, p0, Lcom/geohot/towelroot/TowelRoot;->fingerprint:Ljava/util/List;
new-instance v5, Lorg/apache/http/message/BasicNameValuePair;
const-string v6, "model"
sget-object v7, Landroid/os/Build;->MODEL:Ljava/lang/String;
invoke-direct {v5, v6, v7}, Lorg/apache/http/message/BasicNameValuePair;-><init>(Ljava/lang/String;Ljava/lang/String;)V
invoke-interface {v4, v5}, Ljava/util/List;->add(Ljava/lang/Object;)Z
Empreinte digitale du dispositif
Un identifiant unique pour la version du système d'exploitation. Lignes 83-93
:
iget-object v4, p0, Lcom/geohot/towelroot/TowelRoot;->fingerprint:Ljava/util/List;
new-instance v5, Lorg/apache/http/message/BasicNameValuePair;
const-string v6, "fingerprint"
sget-object v7, Landroid/os/Build;->FINGERPRINT:Ljava/lang/String;
invoke-direct {v5, v6, v7}, Lorg/apache/http/message/BasicNameValuePair;-><init>(Ljava/lang/String;Ljava/lang/String;)V
invoke-interface {v4, v5}, Ljava/util/List;->add(Ljava/lang/Object;)Z
Matériel du dispositif
Probablement la carte processeur. Lignes 96-106
:
iget-object v4, p0, Lcom/geohot/towelroot/TowelRoot;->fingerprint:Ljava/util/List;
new-instance v5, Lorg/apache/http/message/BasicNameValuePair;
const-string v6, "hardware"
sget-object v7, Landroid/os/Build;->HARDWARE:Ljava/lang/String;
invoke-direct {v5, v6, v7}, Lorg/apache/http/message/BasicNameValuePair;-><init>(Ljava/lang/String;Ljava/lang/String;)V
invoke-interface {v4, v5}, Ljava/util/List;->add(Ljava/lang/Object;)Z
Série de dispositifs
Numéro de série unique du dispositif. Lignes 109-119
:
iget-object v4, p0, Lcom/geohot/towelroot/TowelRoot;->fingerprint:Ljava/util/List;
new-instance v5, Lorg/apache/http/message/BasicNameValuePair;
const-string v6, "serial"
sget-object v7, Landroid/os/Build;->SERIAL:Ljava/lang/String;
invoke-direct {v5, v6, v7}, Lorg/apache/http/message/BasicNameValuePair;-><init>(Ljava/lang/String;Ljava/lang/String;)V
invoke-interface {v4, v5}, Ljava/util/List;->add(Ljava/lang/Object;)Z
Version du noyau de l'appareil
C'est vital car l'exploit a probablement été corrigé dans les noyaux récents. Lignes 122-134
:
iget-object v4, p0, Lcom/geohot/towelroot/TowelRoot;->fingerprint:Ljava/util/List;
new-instance v5, Lorg/apache/http/message/BasicNameValuePair;
const-string v6, "kernel"
invoke-virtual {p0}, Lcom/geohot/towelroot/TowelRoot;->javaSucksAssReadTheKernelVersion()Ljava/lang/String;
move-result-object v7
invoke-direct {v5, v6, v7}, Lorg/apache/http/message/BasicNameValuePair;-><init>(Ljava/lang/String;Ljava/lang/String;)V
invoke-interface {v4, v5}, Ljava/util/List;->add(Ljava/lang/Object;)Z
Version de TowelRoot
Lignes 168-180
:
iget-object v4, p0, Lcom/geohot/towelroot/TowelRoot;->fingerprint:Ljava/util/List;
new-instance v5, Lorg/apache/http/message/BasicNameValuePair;
const-string v6, "appversion"
invoke-direct {p0}, Lcom/geohot/towelroot/TowelRoot;->getSoftwareVersion()Ljava/lang/String;
move-result-object v7
invoke-direct {v5, v6, v7}, Lorg/apache/http/message/BasicNameValuePair;-><init>(Ljava/lang/String;Ljava/lang/String;)V
invoke-interface {v4, v5}, Ljava/util/List;->add(Ljava/lang/Object;)Z
Modstring
La chaîne modstring
. Lignes 202-211
:
.local v1, "modstring":Ljava/lang/String;
iget-object v4, p0, Lcom/geohot/towelroot/TowelRoot;->fingerprint:Ljava/util/List;
new-instance v5, Lorg/apache/http/message/BasicNameValuePair;
const-string v6, "modstring"
invoke-direct {v5, v6, v1}, Lorg/apache/http/message/BasicNameValuePair;-><init>(Ljava/lang/String;Ljava/lang/String;)V
invoke-interface {v4, v5}, Ljava/util/List;->add(Ljava/lang/Object;)Z
La demande du serveur
Dans les lignes 227-329
le code décrit la méthode queryServer
qui interroge la base de données du serveur afin de trouver une correspondance avec les données collectées, et traite les éventuelles exceptions dans le code. Ces données sont transmises à l'URL https://towelroot.appspot.com/report/
via SSL et une requête POST (lignes 263-275
):
.local v2, "httppost":Lorg/apache/http/client/methods/HttpPost;
new-instance v5, Lorg/apache/http/client/entity/UrlEncodedFormEntity;
iget-object v6, p0, Lcom/geohot/towelroot/TowelRoot;->fingerprint:Ljava/util/List;
invoke-direct {v5, v6}, Lorg/apache/http/client/entity/UrlEncodedFormEntity;-><init>(Ljava/util/List;)V
invoke-virtual {v2, v5}, Lorg/apache/http/client/methods/HttpPost;->setEntity(Lorg/apache/http/HttpEntity;)V
.line 88
invoke-interface {v1, v2}, Lorg/apache/http/client/HttpClient;->execute(Lorg/apache/http/client/methods/HttpUriRequest;)Lorg/apache/http/HttpResponse;
move-result-object v3
faites le ra1n
La méthode buttonClicked
(lignes 333-426
) contient le code qui fait fonctionner l'application lorsque vous appuyez sur le bouton. Il appelle, entre autres, les méthodes fillInFingerprint
pour recueillir les informations nécessaires, et queryServer
pour voir si l'appareil peut être enraciné.
Il procède ensuite à l'analyse de la réponse du serveur. Si ladite réponse est vide, TowelRoot vous invite à indiquer la nécessité d'une connexion Internet (lignes 369-378
):
invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v2
if-eqz v2, :cond_1
.line 115
const-string v2, "Please ensure you are connected to the internet"
invoke-virtual {v1, v2}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
Si la réponse n'est pas vide, TowelRoot vérifie si la réponse ci-dessus est égale à la chaîne de caractères suivante nyet
(lignes 391-402
):
const-string v2, "nyet"
invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v2
if-eqz v2, :cond_2
.line 117
const-string v2, "This phone isn\'t currently supported"
invoke-virtual {v1, v2}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
Si la réponse est égale à nyet
alors le téléphone n'est pas officiellement pris en charge.
Enfin, si la réponse est à la fois non vide et différente de nyet
TowelRoot lance la procédure d'enracinement en appelant la méthode native rootTheShit
défini à la ligne 448
et probablement contenu dans la bibliothèque libexploit.so
.
Pour les courageux
TowelRoot comprend un mode spécial pour les utilisateurs dont les appareils ne sont pas pris en charge. Ce mode, dont le code est défini à l'intérieur de la méthode titleClicked
(lignes 451-504
), est accessible en appuyant sur le bouton rouge welcome to towelroot v3
à l'intérieur de l'application, et permettra à l'utilisateur d'essayer différentes modstrings afin d'essayer de Rooter le dispositif malgré tout.