2012-09-28 20 views
11

Ho invertito alcuni apk Android per aggiungere alcuni strumenti per test funzionali. Voglio sapere dato un Smali come seguendo Come posso aggiungere qualcosa di similemodifica dei file .smali

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

a ciascun metodo nei file .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 

risposta

28

Il codice effettivo per chiamare Log.e() è abbastanza semplice. Potrebbe trattarsi di qualcosa come:

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 

Tuttavia, è necessario fare attenzione con quali registri si utilizza. Non si desidera eseguire il blob di un registro che ha un valore che verrà utilizzato in seguito.

in modo da avere 2 opzioni:

  1. Trova "sicuri" registri inutilizzati, e utilizzare tali (può essere difficile)
  2. aumentare il numero di registro del metodo, e utilizzare i registri di nuova creazione

Per il numero 2, l'unico risultato è che i nuovi registri non si trovano alla fine dell'intervallo di registri: sono in realtà poco prima che il parametro si registri.

Ad esempio, prendiamo un metodo che ha 5 registri totali (.registers 5), 3 dei quali sono registri di parametri. Quindi avete v0 e v1 che sono registri non param, e p0-p2, che sono i 3 registri dei parametri, e sono alias per v2-v4.

Se è necessario aggiungere altri 2 registri, è possibile eseguirlo fino a .registers 7. I registri dei parametri rimangono alla fine dell'intervallo di registro, quindi p0-p2 sono ora aliasizzati in v4-v6 e v2 e v3 sono i nuovi registri che sono sicuri da usare.

+0

Questo spiega il motivo per cui i miei sforzi a volte inspiegabilmente causare un crash. Grazie! –

+1

Questa è una grande risposta sintetica, ma penso che ci sia un piccolo errore di battitura alla fine della invoke-static e ha bisogno di a; dopo Ljava/lang/Throwable – GeekyDeaks

+0

Questo è risolto, grazie. – JesusFreke

10

Un commento sui registri che era troppo grande per un commento alla risposta di JesusFreke. Vale la pena ricordare che se si hanno le direttive .local invece delle direttive .register, lo schema dei numeri sarà diverso. In parole povere, le direttive riguardano nel modo seguente:

.registers = .locals + NUMBER_OF_PARAMETERS 

Quindi, se si dispone di una funzione che ha 4 parametri e utilizza più 3 registri le direttive che potrebbero presentarsi sono .registers 7 o .locals 3.

E si otterrà il setup registri come segue:

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

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

3

Uno dei modi più semplici per aggiungere il codice Smali, è scrivere il codice Java in un test android app. Smontare utilizzando apktool. Guarda i file smali per identificare il codice smali e usalo per l'iniezione in altre app che hai smontato.

Scarica apktool qui: http://ibotpeaches.github.io/Apktool/