我正在尝试使用 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/