android - packed-switch 在 Android 上如何作为 apktool 生成的 smali 工作?

标签 android smali

我正在尝试使用 apktool d 对 apk 进行逆向工程,它生成的 smali 包含我不完全理解的 packed-switch 语句。一个方法包含:

packed-switch v0,:pswitch_data_0

随后在代码中使用 :pswitch_X 之类的标签 其中 X 是一个数字,在方法的末尾有:

:pswitch_data_0
.packed-switch 0x7f060395
    :pswitch_4
    :pswitch_5
    :pswitch_1
.end packed-switch

这到底是做什么的?它看起来像一个跳转到的地方列表,但在什么条件下呢?它对 0x7f060395 有什么作用?

最佳答案

如您所见,开关分为两部分。您列出的第二部分是有效负载伪指令,其中包含所有开关案例。第一部分是 packed-switch 指令,它定义了包含要检查的值的寄存器,并使用标签引用有效负载指令。

对于 packed-switch,payload 伪指令中的 case 值是连续的,实际上只给出了第一个值(在本例中为 0x7f060395)

具体针对您的示例,当 packed-switch 指令被执行时,它将根据负载中的 3 种情况检查 v0 寄存器的值。如果值为0x7f060395,则跳转到:pswitch_4,如果为0x7f060396,则跳转到:pswitch_5,以此类推。

如果寄存器的值与任何情况都不匹配,则将继续执行 packed-switch 指令后的下一条指令(带有寄存器和标签的指令,而不是有效负载伪指令)。

sparse-switch 指令类似,除了它的有效负载指令有一个与每个 case 关联的显式值,而不是使用顺序键值。

您可以在 dalvik-bytecode 中找到所有细节文档。

关于android - packed-switch 在 Android 上如何作为 apktool 生成的 smali 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18564592/

相关文章:

java - 将变量添加到framework.jar后,它仍然无法访问

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

android - 更改包名称

java - 在 XML 中初始化 TableLayout 并以编程方式填充它 - Android (java)

android - 高效地为 map 标记创建位图

java - Java中hashmap排序的ArrayList

android - apktool 和 baksmali 的区别

java - 将.class文件转换为smali文件并重新打包.apk

android - 如何通过我的 PC 终端在我的 android 设备上编译和运行 C 程序。?

Android - Eclipse : Keystore was tampered with, 或密码不正确