質問の 2 番目の部分に答えるために、「35c」、「22x」、「10x」などの値は命令形式を指します。これにより、命令のサイズと、命令のさまざまな部分がこの空間にどのように詰め込まれるかが決まります。これらは、命令形式ドキュメントで定義されています。
指定された命令を誤って「解析」しています。命令の長さは必ずしも 2 バイトではありません。これは実際には 2 命令のエンコードです。オペコードが 0x70 の最初の命令は、invoke-direct 命令で、フォーマットは 35c です。
35c 命令のレイアウトは、命令形式ドキュメントに記載されています。
A|G|op BBBB F|E|D|C
[A=5] op {vC, vD, vE, vF, vG}, meth@BBBB
[A=5] op {vC, vD, vE, vF, vG}, type@BBBB
[A=4] op {vC, vD, vE, vF}, kind@BBBB
[A=3] op {vC, vD, vE}, kind@BBBB
[A=2] op {vC, vD}, kind@BBBB
[A=1] op {vC}, kind@BBBB
[A=0] op {}, kind@BBBB
これは 3 ユニットの命令で、各ユニットは 2 バイトです。したがって、合計で 6 バイトです。この命令の 16 進値は次のとおりです。7010 050C 0000
2 バイトの各「グループ」は、あたかもビッグ エンディアン順であるかのように示されていることに注意してください。したがって、「7010 050C 0000」の場合、各「文字」の値は次のようになります。
7010 050C 0000
OOAG BBBB DCFE
OP = 0x70
A = 1
G = 0
B = 0x0C05
C = 0
D = 0
E = 0
F = 0
A
の値によって、メソッドに渡される引数の数が決まることが形式からわかります。この場合、A
の値は 1 であるため、該当する行は
[A=1] op {vC}, kind@BBBB
したがって、B には、呼び出されたメソッドのメソッド インデックスが含まれます。これは、その特定のインデックスにある dex ファイル内の method_id_item を参照します。そして、単一の引数、レジスタ v0 の値が渡されます。
2 番目の命令0E00
のオペコードは 0E で、これは return-void で、10x のフォーマットです。
ØØ|op
これは簡単にデコードできます。オペコード以外の情報は含まれていません。