gpt4 book ai didi

dalvik - DalvikVM如何处理switch并尝试smali代码

转载 作者:行者123 更新时间:2023-12-02 17:11:48 25 4
gpt4 key购买 nike

我正在尝试学习 smali,但有一些问题无法通过谷歌搜索找到。

1)我创建了一个简单的测试用例来更好地解释自己

const-string v1, "Start"
:try_start_0
const-string v1, "Try Block"
invoke-static {v1}, Lcom/example/test/Main;->print(Ljava/lang/String;)V
:try_end_0
.catchall {:try_start_0 .. :try_end_0} :catchall_0

.catch 语句:两个参数是否意味着从该标签到该标签并捕获它(两个标签之间的代码),或者是否意味着从 :try_start_0 开始执行 try 直到到达 :try_end_0 (允许goto 跳转来执行不在两个标签内的代码)?

try 的标签是否始终采用 try_start_%d 格式,或者可以是任何标签?

2)另一种情况

packed-switch v0, :pswitch_data_0

const-string v1, "Default Case"

invoke-static {v1}, Lcom/example/test/Main;->print(Ljava/lang/String;)V

:goto_0

const-string v1, "The End"

invoke-static {v1}, Lcom/example/test/Main;->print(Ljava/lang/String;)V

return-void

:pswitch_0
const-string v1, "Case 1"

invoke-static {v1}, Lcom/example/test/Main;->print(Ljava/lang/String;)V

goto :goto_0

:pswitch_data_0
.packed-switch 0x1
:pswitch_0
.end packed-switch

switch 语句:是否要求 switch 语句位于 switch 数据和 switch 调用之间?标签的命名也是固定的还是只是为了方便?

3)如果标签可以不同,baksmali会生成具有不同标签的smali代码吗?

4)反编译 dex 时不总是显示的可选行有哪些?

我知道 .parameter 和 .line 是可选的,但是可能不存在的是什么?

提前谢谢您。

最佳答案

1)

前两个标签(示例中的 try_start_0 和 try_end_0)定义了 try block 涵盖的代码范围。如果所覆盖的代码中发生异常,则执行立即跳转到第三个标签(catchall_0)。标签的名称并不重要,它可以是任何有效的标识符。

还有.catch指令,与它是一样的,只不过它只处理特定类型的异常(类似于java的catch语句)。

一段代码可以被多个catch语句覆盖,最多1个catch all语句。 .catch 语句的位置并不重要,但是,覆盖相同代码的 catch 语句的相对顺序很重要。例如,如果您有

.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :handler1
.catch Ljava/lang/RuntimeException; {:try_start_0 .. :try_end_0} :handler2

第二个 catch 语句永远不会被使用。如果在所覆盖的代码中抛出 RuntimeException,则始终会使用第一个 catch,因为 RuntimeException 是一个异常。

但是,如果它们的顺序相反,它将像您期望的那样工作 - RuntimeException 处理程序用于 RuntimeException,而 Exception 处理程序用于任何其他类型的异常。

最后,与 java 不同,.catch 语句中的代码范围不需要严格嵌套。例如,拥有类似的东西是完全合法的

:a
const-string v1, "Start"
:b
const-string v1, "Try Block"
:c
invoke-static {v1}, Lcom/example/test/Main;->print(Ljava/lang/String;)V
:d
.catch Ljava/lang/RuntimeException; {:a .. :c} :d
.catch Ljava/lang/Exception; {:b .. :d} :d

你还可以有一些非常奇怪的结构,就像这样。

.method public static main([Ljava/lang/String;)V
.registers 3

:second_handler
:first_try_start
new-instance v0, Ljava/lang/RuntimeException;
invoke-direct {v0}, Ljava/lang/RuntimeException;-><init>()V
throw v0
:first_try_end
.catch Ljava/lang/Exception; {:first_try_start .. :first_try_end} :first_handler
:first_handler
:second_try_start
new-instance v0, Ljava/lang/RuntimeException;
invoke-direct {v0}, Ljava/lang/RuntimeException;-><init>()V
throw v0
:second_try_end
.catch Ljava/lang/Exception; {:second_try_start .. :second_try_end} :second_handler
.end method

上述两个示例都不会从编译的 java 代码生成,但字节码本身允许这样做。

2) switch 语句可以位于与 switch 语句或 switch 数据相关的任何位置。这里的标签名称也是任意的。

3) Baksmali 可以通过两种方式之一生成标签。默认方式是使用标签的通用“类型”,并附加标签的字节码地址。如果指定 -s/--sequential-labels 选项,则它不使用字节码地址,而是为每个标签类型保留一个计数器,并在每次生成该类型的标签时递增该计数器。

4)通常是调试信息的一部分。 .parameter、.line、.prologue、.epilogue、.source、.local、.restart local、.end local...我认为大约涵盖了它。

关于dalvik - DalvikVM如何处理switch并尝试smali代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14100992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com