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

 兜妈是我 发布于 2023-02-07 09:43

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

我的要求是:

    能够通过添加调试日志来调试方法.

    能够通过打印堆栈跟踪来调试方法调用.

为此,我需要注入/插入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

               :
               :

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

2 个回答
  • 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
    

    注 -在此处使用寄存器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());
        }
    }
    

    等效的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
    

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

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

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

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

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

    2023-02-07 09:52 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有