7

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

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 有什么关系?

4

1 回答 1

16

正如您所注意到的,开关分为两部分。您列出的第二部分是有效负载伪指令,其中包含所有开关情况。第一部分是打包切换指令,它定义了包含要检查的值的寄存器,并使用标签引用有效负载指令。

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

具体而言,对于您的示例,当执行打包切换指令时,它将根据有效负载中的 3 种情况检查 v0 寄存器的值。如果值为0x7f060395,则跳转到:pswitch_4,如果值为0x7f060396,则跳转到:pswitch_5,以此类推。

如果寄存器的值与任何一种情况都不匹配,则执行将继续执行打包切换指令之后的下一条指令(具有寄存器和标签的指令,而不是有效负载伪指令)。

sparse-switch 指令类似,只是它的有效载荷指令具有与每个案例相关的显式值,而不是使用顺序键值。

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

于 2013-09-02T01:54:10.583 回答