我正在尝试使用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有什么关系?
解决方法
正如您所注意到的,开关分为两部分.您列出的第二部分是有效负载伪指令,其中包含所有切换案例.第一部分是打包切换指令,它定义包含要检查的值的寄存器,并使用标签引用有效负载指令.
对于打包交换机,有效负载伪指令中的大小写值是顺序的,只有第一个值实际给出(在本例中为0x7f060395)
具体而言,对于您的示例,当执行packed-switch指令时,它将检查v0寄存器的值与有效负载中的3种情况.如果值为0x7f060395,则跳转到:pswitch_4,如果为0x7f060396,则跳转到:pswitch_5等.
如果寄存器的值与任何情况都不匹配,则执行将继续执行打包切换指令之后的下一条指令(具有寄存器和标签的指令,而不是有效负载伪指令).
稀疏切换指令类似,只是其有效负载指令具有与每种情况相关联的显式值,而不是使用顺序键值.
您可以在dalvik-bytecode文档中找到所有细节.