Como el código de TowelRoot no está disponible públicamente, recurrí a descompilar el último APK, descargado del Sitio web de TowelRoot para investigar la necesidad de la aplicación para el permiso de INTERNET.
Notas relevantes
Tras una exitosa descompilación, resultó que ni las actividades ni el código en sí mismo se ofuscaron. El desarrollador ciertamente había previsto que esta aplicación sería investigada, pero dejó que el código fuera lo más transparente posible. El archivo más importante que tenemos en este momento es ToallaRoot.smali que describe todo el funcionamiento de esta aplicación.
Estructura inicial
De line 13
a line 22
el código inicializa un campo llamado fingerprint
. A continuación, el código correspondiente:
.field fingerprint:Ljava/util/List;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/List",
"<",
"Lorg/apache/http/NameValuePair;",
">;"
}
.end annotation
.end field
que es una lista Java compuesta de pares clave-valor, para ser usada cuando se recoge la información relevante del teléfono.
Los datos recogidos
De line 56
a line 215
el código describe un método llamado fillInFingerprint
que se encarga de recuperar los datos adecuados para enviarlos al sitio web de TowelRoot, a fin de determinar si el dispositivo puede arraigarse mediante la explotación homónima. Este método hace un uso extensivo de la mencionada fingerprint
campo. A continuación, los datos recopilados.
Modelo de dispositivo
El modelo de dispositivo visible. Lines 70 to 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
Huella del dispositivo
Un identificador único para la construcción del sistema operativo. Lines 83 to 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
El hardware del dispositivo
Probablemente la placa procesadora. Lines 96 to 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
Dispositivo de serie
El número de serie unívoco del dispositivo. Lines 109 to 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
Versión del núcleo del dispositivo
Vital ya que es probable que la hazaña haya sido remendada en los núcleos recientes. Lines 122 to 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
Versión TowelRoot
Lines 168 to 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 cadena "modstring". Lines 202 to 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 solicitud del servidor
De line 227 to 329
el código describe el método queryServer
que consulta la base de datos del servidor para encontrar una coincidencia con los datos recogidos, y maneja las excepciones no deseadas en el código. Estos datos se transmiten a la URL https://towelroot.appspot.com/report/
a través de SSL y una solicitud POST ( lines 263 to 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
hazlo ra1n
El método buttonClicked
( lines 333 to 426
) contiene el código que hace que la aplicación funcione cuando se presiona el botón. Entre otros, llama a los métodos fillInFingerprint
para reunir la información necesaria, y queryServer
para ver si el dispositivo puede ser rooteado.
Luego procede a analizar la respuesta del servidor. Si dicha respuesta está vacía, TowelRoot te pregunta sobre la necesidad de una conexión a Internet ( lines 369 to 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 respuesta no está vacía, entonces Toallín procede a comprobar si lo anterior es igual a la cadena nyet
( lines 391 to 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 respuesta es igual nyet
entonces el teléfono no está oficialmente respaldado.
Por último, si la respuesta es tanto no vacía como diferente de nyet
Toallín inicia el procedimiento del rooting llamando al método nativo rootTheShit
definido en line 448
y probablemente contenido dentro de la biblioteca libexploit.so .
Para los valientes
Toallín incluye un modo especial para usuarios con dispositivos no compatibles. Este modo, cuyo código está definido dentro del método titleClicked
( lines 451 to 504
), es accesible pulsando el botón rojo bienvenido a towelroot v3 dentro de la aplicación, y permitirá al usuario probar diferentes modstrings para tratar de rootear el dispositivo de todos modos.
Descargo de responsabilidad
Todas las blasfemias incluidas en esta respuesta se derivan de la copia literal de los nombres de los métodos de la aplicación, y por lo tanto es obra del desarrollador.
0 votos
¿Puedes ver el código fuente al descompilar el APK? Si es así, ¿puedes buscar todas las llamadas de conexión al socket para verificar que no se están enviando datos encriptados? Muchas gracias por tu ayuda.
0 votos
@DeathMaskSalesman Gracias. Publícalo como respuesta y lo marcaré. Para que quede claro: has descompilado la última versión de su web oficial, la v3, ¿no? Hice esta pregunta después de sospechar de su UI, preguntado en esto otra pregunta . Publica un comentario si tienes alguna otra idea o añádela a tu respuesta.
0 votos
Sí, es cierto. He descargado la última versión de towelroot.com Lo instalé y luego lo descompilé, así que es genuino. Actualmente estoy recuperando algunos de los fragmentos descompilados para escribir la respuesta.