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:
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.
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 .....
Si vous aimez IntellijIdea, donnez smalidea une chance!
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
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.
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
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.