如何调试android应用程序的smali代码?

Dhe*_*ary 11 android apk dex smali

我有一个有效的Android应用程序.其中我没有源代码.我想调试这个应用程序的功能.我可以使用apktool成功逆向工程这个应用程序apk文件 - https://code.google.com/p/android-apktool/ 这个工具生成smali格式的类文件.

我的要求是:

  1. 能够通过添加调试日志来调试方法.
  2. 能够通过打印堆栈跟踪来调试方法调用.

为此,我需要注入/插入smali等效的调试日志或堆栈跟踪.我尝试在其中一个方法的开头添加一些smali指令,但它与ClassVerifyError崩溃.

示例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

               :
               :
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我添加smali调试日志.Thnx提前.

小智 26

1.调试smali中的日志

在smali中调试日志.比如在方法test()里面想要打印"Inside Test()"调试日志.在smali方法的开头添加以下说明:

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
Run Code Online (Sandbox Code Playgroud)

注 -在此处使用寄存器v0,v1时需要小心.在代码执行流程中,您必须检查您是否正在使用流程中稍后使用的寄存器之一.或者你可能会得到例外.

2. StackTrace

这是一个打印方法的stacktrace的smali代码

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

等效的smali代码是

.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
Run Code Online (Sandbox Code Playgroud)

将此方法添加到任何smali文件中.并打电话给

(假设您将上面的smali代码添加到com.example.pakagename.ClassName中)

invoke-static {}, Lcom/example/packagename/ClassName;->printStackTraces()V
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 .....

  • 我得到了以下例外情况:`输入'stackTraceElements'时没有可行的替代方案'和'输入'没有可行的替代方法'stackTraceElements'`...只需要更新`.local v1,stackTraceElements:[Ljava/lang/StackTraceElement;` to .local v1,"stackTraceElements":[Ljava/lang/StackTraceElement;`和`.local v0,element:Ljava/lang/StackTraceElement;`to` .local v0,"element":Ljava/lang/StackTraceElement;`看起来有.local变量的语法更新 (7认同)

Sim*_*nzo 6

如果您喜欢IntellijIdea,请给smalidea一个机会!


CRO*_*OSP 5

现在,您可以为Android Studio或Intellij IDEA- Smalidea使用出色的插件。此外,我在博客文章中介绍了安装过程和调试