Dhe*_*ary 11 android apk dex smali
我有一个有效的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
:
:
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)
希望这可以帮助 .....
| 归档时间: |
|
| 查看次数: |
22619 次 |
| 最近记录: |