Подтвердить что ты не робот

Изменение файлов .smali

Я обратил внимание на некоторые андроиды apks, чтобы добавить некоторые инструменты для функционального тестирования. Я хочу знать, учитывая smali как следующий, как я могу добавить что-то вроде

Log.e(TAG, "some descritpion", e);

для каждого метода в файлах .smali.

.class public Ld;
.super Landroid/view/View;
.source "SourceFile"


# instance fields
.field a:Z

.field b:Lcom/rovio/ka3d/App;


# direct methods
.method public constructor <init>(Lcom/rovio/ka3d/App;)V
    .locals 2
    .parameter

    .prologue
    const/4 v1, 0x1

    .line 317
    invoke-direct {p0, p1}, Landroid/view/View;-><init>(Landroid/content/Context;)V

    .line 313
    const/4 v0, 0x0

    iput-boolean v0, p0, Ld;->a:Z

    .line 314
    const/4 v0, 0x0

    iput-object v0, p0, Ld;->b:Lcom/rovio/ka3d/App;

    .line 318
    iput-object p1, p0, Ld;->b:Lcom/rovio/ka3d/App;

    .line 319
    invoke-virtual {p0, v1}, Ld;->setFocusable(Z)V

    .line 320
    invoke-virtual {p0, v1}, Ld;->setFocusableInTouchMode(Z)V

    .line 321
    return-void
.end method


# virtual methods
.method public a(Z)V
    .locals 4
    .parameter

    .prologue
    const/4 v3, 0x0

    .line 325
    invoke-virtual {p0}, Ld;->getContext()Landroid/content/Context;

    move-result-object v0

    const-string v1, "input_method"

    invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Landroid/view/inputmethod/InputMethodManager;

    .line 326
    invoke-virtual {p0}, Ld;->getWindowToken()Landroid/os/IBinder;

    move-result-object v1

    invoke-virtual {v0, v1, v3}, Landroid/view/inputmethod/InputMethodManager;->hideSoftInputFromWindow(Landroid/os/IBinder;I)Z

    .line 327
    if-eqz p1, :cond_0

    .line 329
    invoke-virtual {p0}, Ld;->getWindowToken()Landroid/os/IBinder;

    move-result-object v1

    const/4 v2, 0x2

    invoke-virtual {v0, v1, v2, v3}, Landroid/view/inputmethod/InputMethodManager;->toggleSoftInputFromWindow(Landroid/os/IBinder;II)V

    .line 330
    invoke-virtual {p0}, Ld;->requestFocus()Z

    .line 333
    :cond_0
    iput-boolean p1, p0, Ld;->a:Z

    .line 334
    return-void
.end method

.method public onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;
    .locals 3
    .parameter

    .prologue
    .line 343
    new-instance v0, La;

    iget-object v1, p0, Ld;->b:Lcom/rovio/ka3d/App;

    const/4 v2, 0x0

    invoke-direct {v0, v1, p0, v2}, La;-><init>(Lcom/rovio/ka3d/App;Landroid/view/View;Z)V

    .line 345
    const/4 v1, 0x0

    iput-object v1, p1, Landroid/view/inputmethod/EditorInfo;->actionLabel:Ljava/lang/CharSequence;

    .line 350
    const v1, 0x80090

    iput v1, p1, Landroid/view/inputmethod/EditorInfo;->inputType:I

    .line 351
    const/high16 v1, 0x1000

    iput v1, p1, Landroid/view/inputmethod/EditorInfo;->imeOptions:I

    .line 352
    return-object v0
.end method
4b9b3361

Ответ 1

Фактический код для вызова Log.e() довольно прост. Это будет включать в себя что-то вроде:

const-string v0, "MyTag"
const-string v1, "Something to print"
# assuming you have an exception in v2...
invoke-static {v0, v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I

Однако, вы должны быть осторожны с тем, какие регистры вы используете. Вы не хотите клонировать регистр, который имеет значение, которое будет использоваться позже.

Итак, у вас есть 2 варианта:

  • Найдите "безопасные" неиспользуемые регистры и используйте их (может быть сложно)
  • Увеличьте количество регистров метода и используйте вновь созданные регистры

Для номера 2 только полученным является то, что новые регистры не находятся в конце диапазона регистров - они фактически находятся непосредственно перед регистрами параметров.

Например, возьмем метод, который содержит всего 5 регистров (.registers 5), 3 из которых являются регистрами параметров. Таким образом, у вас есть v0 и v1, которые являются непараметрическими регистрами, и p0-p2, которые являются 3 регистрами параметров, и являются псевдонимами для v2-v4.

Если вам нужно добавить еще 2 регистра, вы можете поднять его до .registers 7. Регистры параметров остаются в конце диапазона регистров, поэтому p0-p2 теперь псевдонимы v4-v6, а v2 и v3 - новые регистры, которые безопасны в использовании.

Ответ 2

Комментарий к реестрам, который слишком велик для комментария к запросу JesusFreke. Стоит отметить, что если у вас есть директивы .local вместо директив .register, схема номеров будет отличаться. Грубо говоря, директивы соотносятся следующим образом:

.registers = .locals + NUMBER_OF_PARAMETERS

Итак, если у вас есть функция, которая имеет 4 параметра и использует еще 3 регистра, директивы, которые могут отображаться, это .registers 7 или .locals 3.

И вы получите настройки регистраторов следующим образом:

v0
v1
v2
v3 <==> p0
v4 <==> p1
v5 <==> p2
v6 <==> p3

Источник: https://github.com/JesusFreke/smali/wiki/Registers

Ответ 3

Одним из простых способов добавления smali-кода является запись java-кода в тестовое приложение для Android. Разберите с помощью apktool. Посмотрите на файлы smali, чтобы идентифицировать код smali и использовать его для инъекций в другие приложения, которые вы разобрали.

Загрузите apktool здесь: http://ibotpeaches.github.io/Apktool/