Я где-то читал сообщение в блоге, в котором говорилось, что TowelRoot не нуждается в доступе в Интернет, и я также читал, что он нужен. Последнюю версию, которую я пытался запустить, TowelRoot v3 без него работать не будет. Он загружает или отправляет какую-либо информацию? Если да, то?
Приложение: Я полагаю, если бы они пытались совершить что-то гнусное, они бы просто сделали это, вместо того, чтобы спрашивать разрешения... верно?
Поскольку код TowelRoot недоступен в открытом доступе, я прибегнул к декомпиляции последней версии APK, загруженной с веб- сайта TowelRoot , чтобы исследовать потребность приложения в разрешении INTERNET.
При успешной декомпиляции оказалось, что ни активности, ни сам код не обфусцируются. Разработчик, конечно, ожидал, что это приложение будет изучено, но он оставил код максимально прозрачным. Самый важный файл, который у нас есть на данный момент, это TowelRoot.smali
, который описывает всю работу этого приложения.
Примечание: в зависимости от вашей конкретной версии ApkTool номера строк могут отличаться.
В строках 13-22
код инициализирует поле с именем fingerprint
. Ниже приведен соответствующий код:
.field fingerprint:Ljava/util/List;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/List",
"<",
"Lorg/apache/http/NameValuePair;",
">;"
}
.end annotation
.end field
который представляет собой список Java, состоящий из пар ключ-значение, который будет использоваться при сборе соответствующей информации с телефона.
В строках 56-215
код описывает метод с именем fillInFingerprint
, который отвечает за получение соответствующих данных для отправки на веб-сайт TowelRoot, чтобы выяснить, можно ли рутировать устройство с помощью одноименного эксплойта. Этот метод широко использует вышеупомянутое fingerprint
поле. Собранные данные следуют.
Видимая модель устройства. Линии 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
Уникальный идентификатор сборки ОС. Линии 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
Скорее всего плата процессора. Линии 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
Уникальный серийный номер устройства. Линии 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
Жизненно важно, так как эксплойт, вероятно, был исправлен в последних ядрах. Линии 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
Линии 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
. Линии 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
В строках 227-329
код описывает метод queryServer
, который запрашивает базу данных сервера, чтобы найти совпадение с собранными данными, и обрабатывает возможные исключения в коде. Такие данные передаются на URL https://towelroot.appspot.com/report/
через SSL и POST-запрос (строки 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
Метод buttonClicked
(lines 333-426
) содержит код, который заставляет приложение работать, когда вы нажимаете кнопку. Среди прочего, он вызывает методы fillInFingerprint
для сбора необходимой информации и queryServer
проверки возможности рутирования устройства.
Затем он продолжает анализировать ответ сервера. Если указанный ответ пуст, TowelRoot подскажет вам о необходимости подключения к Интернету (строки 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
Если ответ не пустой, то TowelRoot продолжает проверку, соответствует ли указанное выше строке nyet
(строкам 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
Если ответ равен nyet
, то телефон официально не поддерживается.
Наконец, если ответ одновременно непустой и отличается от nyet
, TowelRoot запускает процедуру рутирования, вызывая нативный метод rootTheShit
, определенный в строке 448
и, возможно, содержащийся внутри библиотеки libexploit.so
.
TowelRoot включает специальный режим для пользователей с неподдерживаемыми устройствами. Этот режим, код которого определен внутри метода titleClicked
(lines 451-504
), доступен по нажатию на красный welcome to towelroot v3
заголовок внутри приложения и позволит пользователю попробовать разные строки модов, чтобы в любом случае попытаться получить root права на устройство.