2016-12-15 2 views
1

Je reverse une application android. Pendant la lecture, je vois certaines méthodes qui ont utilisé des variables telles que p1 ou p2 ... Je ne sais pas où puis-je référencer ces variables. Par exemple:Android bytecode: valeur de certaines variables non définies

.method public b(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V 
    .locals 1 

    invoke-static {}, Lpnf/this/object/does/not/Exist;->a()Z 

    move-result v0 

    invoke-static {v0}, Lpnf/this/object/does/not/Exist;->b(I)V 

    .prologue 
    .line 33 
    if-eqz p1, :cond_0 

    if-eqz p2, :cond_0 

    if-eqz p3, :cond_0 

    .line 34 
    invoke-static {p1, p2, p3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I 

    .line 36 
    :cond_0 
    return-void 
.end method 

La chose que je ne comprends pas est:

if-eqz p1, :cond_0 

if-eqz p2, :cond_0 

if-eqz p3, :cond_0 

Je ne sais pas les variables p1p2p3 ici. S'il vous plaît dites-moi. Merci

Répondre

1

p1, p2, etc. ne sont que du sucre syntaxique fourni par l'assembleur. Dans le code Dex, les variables et les paramètres locaux sont un tableau géant, avec des paramètres passés dans les derniers emplacements du tableau. L'assembleur vous permet utilement de vous référer aux paramètres directement via la syntaxe pn, plutôt que d'avoir à suivre le nombre de variables locales et d'utiliser le vn approprié.

Dans l'exemple affiché, vous avez 1 variable locale et 4 paramètres, ce qui signifie que les registres ressemblent à {v0, p0, p1, p2, p3}.

Les 4 derniers sont automatiquement initialisés au début de la méthode aux valeurs des paramètres transmis.

+0

merci: D pour plus d'informations, voici le lien: https://github.com/JesusFreke/smali/wiki/Registers –