2012-09-28 31 views
11

Invertí ingeniería de algunos apk de Android para agregar algunos instrumentos para pruebas funcionales. Quiero saber da una smali de la siguiente manera cómo puedo añadir algo comomodificando archivos .smali

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

a cada método en los archivos .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 

Respuesta

28

El código real para llamar a Log.e() es bastante simple. Implicaría algo como:

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 

Sin embargo, debe tener cuidado con los registros que utiliza. No desea golpear un registro que tenga un valor que se utilizará más adelante.

Así que tienes 2 opciones:

  1. Encuentra registros no utilizados "seguros", y utilizar esos (puede ser complicado)
  2. aumentar el número de registro del método, y utilizar los registros de nueva creación

Para el número 2, el único problema es que los nuevos registros no están al final del rango de registro, sino que están justo antes de que se registren los parámetros.

Por ejemplo, tomemos un método que tenga 5 registros en total (.registers 5), 3 de los cuales son registros de parámetros. Por lo tanto, tiene v0 y v1, que son registros que no son param, y p0-p2, que son los registros de 3 parámetros, y son alias para v2-v4.

Si necesita agregar 2 registros adicionales, lo aumentará a .registers 7. Los registros de parámetros permanecen al final del rango de registro, por lo que p0-p2 ahora tienen un alias para v4-v6, y v2 y v3 son los nuevos registros que son seguros de usar.

+0

Esto explica por qué mis esfuerzos a veces inexplicablemente causar un accidente. ¡Gracias! –

+1

Esta es una gran respuesta concisa, pero creo que hay un pequeño error tipográfico al final de invoke-static y necesita una; después de Ljava/lang/Throwable – GeekyDeaks

+0

Esto está arreglado, gracias. – JesusFreke

10

Un comentario en los registros que era demasiado grande para un comentario a la respuesta de JesusFreke. Vale la pena mencionar que si tiene directivas .local en lugar de .register, el esquema numérico será diferente. En términos generales, las directivas se relacionan de la siguiente manera:

.registers = .locals + NUMBER_OF_PARAMETERS 

Así que si usted tiene una función que tiene 4 parámetros y utiliza 3 registros más las directivas que podrían aparecer son .registers 7 o .locals 3.

Y obtendrá la configuración de los registros de la siguiente manera:

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

Fuente: https://github.com/JesusFreke/smali/wiki/Registers

3

Una de las maneras más simples de agregar código smali, es escribir el código Java de una aplicación Android de prueba. Desarmar usando apktool. Mire los archivos smali para identificar el código más pequeño y úselo para inyectar en otras aplicaciones que haya desmontado.

Descargar apktool aquí: http://ibotpeaches.github.io/Apktool/

Cuestiones relacionadas