7

apk をリバース エンジニアリングしようとしてapktool dいますが、それが生成する smali には、完全には理解できない pack-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 で何をしますか?

4

1 に答える 1

16

お気づきのように、スイッチは2つの部分にあります。リストした2番目の部分は、すべてのスイッチケースを含むペイロード疑似命令です。最初の部分は、チェックする値を含むレジスタを定義するパックスイッチ命令であり、ラベルを使用してペイロード命令を参照します。

パックされたスイッチの場合、ペイロード疑似命令のケース値は連続しており、最初の値のみが実際に与えられます (この場合は 0x7f060395)。

具体的には、packed-switch 命令が実行されると、ペイロードの 3 つのケースに対して v0 レジスタの値がチェックされます。値が 0x7f060395 の場合は :pswitch_4 にジャンプし、0x7f060396 の場合は :pswitch_5 にジャンプします。

レジスタの値がどのケースにも一致しなかった場合、実行はパックド スイッチ命令 (ペイロード疑似命令ではなく、レジスタとラベルを持つ命令) の後の次の命令で続行されます。

sparse-switch 命令は類似していますが、そのペイロード命令には、連続したキー値を使用する代わりに、各ケースに関連付けられた明示的な値がある点が異なります。

dalvik-bytecodeドキュメントですべての核心的な詳細を見つけることができます。

于 2013-09-02T01:54:10.583 に答える