web-dev-qa-db-fra.com

Comment déboguer le code smali d'une application Android?

J'ai une application Android qui fonctionne. dont je n'ai pas de code source. Je voudrais déboguer une fonctionnalité de cette application. Je pourrais réussir le reverse engineering de ce fichier apk d'application à l'aide d'apktool - https://code.google.com/p/Android-apktool/ Cet outil génère des fichiers de classe au format smali.

Mon exigence est:

  1. Pour pouvoir déboguer une méthode en ajoutant des journaux de débogage.
  2. Pour pouvoir déboguer des appels de méthodes en imprimant une trace de pile.

Pour ce faire, j'ai besoin d'injecter/insérer smali, l'équivalent d'un journal de débogage ou d'une trace de pile. J'ai essayé d'ajouter une instruction smali au début de l'une des méthodes, mais celle-ci s'est plantée avec ClassVerifyError.

Exemple de code smali -

.method public declared-synchronized b()V
    .locals 2

    .prologue

    .line 87
    monitor-enter p0

    :try_start_0
    iget-object v0, p0, Lcom/example/viewerlib/t/d;->a:Ljava/lang/Thread;

    invoke-virtual {v0}, Ljava/lang/Thread;->isAlive()Z

               :
               :

Quelqu'un pourrait-il m'aider à ajouter des journaux de débogage smali? Merci d'avance.

11

1. Journal de débogage dans smali

Journal de débogage dans smali. Par exemple, dans la méthode test (), vous souhaitez imprimer le journal de débogage "Inside Test ()". Au début de la méthode dans smali, ajoutez les instructions suivantes:

sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

const-string v1, "Inside Test()"

invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

Remarque - Vous devez faire preuve de prudence lorsque vous utilisez les registres v0, v1 ici. Dans le flux d’exécution du code, vous devez vérifier que vous n’utilisez pas l’un des registres utilisés plus tard dans le flux. Ou vous pouvez obtenir une exception.

2. StackTrace

Voici le code de smali pour imprimer un stacktrace d'une méthode

Code Java

public static void printStackTraces() {
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
    for (StackTraceElement element : stackTraceElements) {
        System.out.println("Class name :: " + element.getClassName() + "  || method name :: " + element.getMethodName());
    }
}

Et le code smali équivalent est

.method public static printStackTraces()V
    .locals 7

    .prologue
    .line 74
    invoke-static {}, Ljava/lang/Thread;->currentThread()Ljava/lang/Thread;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/Thread;->getStackTrace()[Ljava/lang/StackTraceElement;

    move-result-object v1

    .line 75
    .local v1, stackTraceElements:[Ljava/lang/StackTraceElement;
    array-length v3, v1

    const/4 v2, 0x0

    :goto_0
    if-lt v2, v3, :cond_0

    .line 78
    return-void

    .line 75
    :cond_0
    aget-object v0, v1, v2

    .line 76
    .local v0, element:Ljava/lang/StackTraceElement;
    sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream;

    new-instance v5, Ljava/lang/StringBuilder;

    const-string v6, "Class name :: " 

    invoke-direct {v5, v6}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v0}, Ljava/lang/StackTraceElement;->getClassName()Ljava/lang/String;

    move-result-object v6

    invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

    const-string v6, "  || method name :: " 

    invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

    invoke-virtual {v0}, Ljava/lang/StackTraceElement;->getMethodName()Ljava/lang/String;

    move-result-object v6

    invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

    invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v5

    invoke-virtual {v4, v5}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    .line 75
    add-int/lit8 v2, v2, 0x1

    goto :goto_0
.end method

Ajoutez cette méthode dans n’importe quel fichier smali. Et appeler comme

(En supposant que vous ayez ajouté le code smali ci-dessus à com.example.pakagename.ClassName)

invoke-static {}, Lcom/example/packagename/ClassName;->printStackTraces()V

J'espère que cela t'aides .....

25
rajan goswami

Si vous aimez IntellijIdea, donnez smalidea une chance!

3
packmad

Maintenant, vous pouvez utiliser l'excellent plug-in pour Android Studio ou Intellij IDEA - Smalidea . De plus, j'ai décrit le processus d'installation et le débogage dans mon article blog.

3
CROSP

hey je pensais que vous pourriez trouver cet outil utile

il décompile n'importe quel fichier apk en un code écrit en Java

vérifier ce lien et l'essayer

http://forum.xda-developers.com/showthread.php?t=2430413

2
Owehbeh

Je suggère d'utiliser apkanalyzer de Sony:

https://github.com/sonyxperiadev/ApkAnalyser

il vous permet de décompiler apk-s et de lire le code smali, d’insérer des instructions d’impression à divers endroits. Il existe une option de menu: "Imprimer le journal personnalisé", vous pouvez également imprimer le chemin de pile et faire beaucoup d'autres choses. Après tous les changements, appuyez simplement sur Device-> Install et démarrez apk. Tout de GUI.

2
marcinj

Désolé de vous signaler que apkanalyzer est un analyseur statistique. Pour comprendre et éditer du code smali, essayez ce qui suit.

http://themasterofmagik.wordpress.com/2014/03/08/decompilerecompile-an-apk-basic-editing/

Il explique l'édition dans divers scénarios. Quel outil utiliser et quand.

Différentes approches pour décompiler/recompiler un apk

a. apk
    1. apktool + Notepad++
    2. Virtuous Ten Studio
    3. AndroChef Java Decompiler
b. classes.dex
    1. smali/baksmali
    2. dex2jar + JD-GUI
1
ASD

J'ai essayé d'utiliser le plugin smalidea, mais je ne pouvais pas le faire fonctionner, alors j'ai essayé avec une approche différente indiquée ci-dessous.

Il existe une option dans Android Studio 3.1.2: Aller dans Fichier -> Option Sélectionner un profil ou Analyser Apk. Il va ensuite décompiler le fichier Apk en classes.dex et le fichier qui contient des fichiers smali. Vous pouvez ensuite utiliser l'option Rus As-> Debug et placer des points d'arrêt dans tous les fichiers smali et ils s'arrêteront à un point d'arrêt spécifié. Cela ne fonctionne que si vous avez un seul fichier dex dans votre application. Il existe cependant une solution pour l’application multi-dex qui vous oblige à suivre les étapes ci-dessous:

1) Téléchargez l’outil Apktool de ici

2) Décompiler l’APK en utilisant -> apktool d

3) Copiez tous les fichiers smali générés ci-dessus dans plusieurs dossiers (smali, smali_classess2, smali_classes3, etc.) dans le dossier de sortie créé à partir d'Android Studio -> Analysez la méthode Apk plus tôt, afin que tous les fichiers smali soient dans un seul dossier.

4) Cette étape, je ne suis pas sûr que cela soit nécessaire, mais j'avais suivi cette procédure, n'hésitez pas à vérifier cette étape. Ici, vous construisez à nouveau Apk en utilisant apktool en utilisant le dossier créé à l'étape 2 en utilisant la commande -> apktool b. Cela générera tous les fichiers .dex et copiera tous les fichiers au même emplacement que celui où un fichier unique classes.dex a été généré à l’aide de la méthode Analyze Apk.

5) Maintenant, utilisez le même projet créé en utilisant la méthode Analyze Apk et vous êtes bon pour déboguer.

P.S. - Le studio Android se plaindra du débogage à l'aide de code Java, mais cette méthode fonctionnera. Cette méthode n’est utile que si vous modifiez un fichier smali et que vous souhaitez le déboguer.

0
Fenil