一、已知一个方法的dex指令集为:
0x1070 0x6 0x0 0xe
这里指令集地址是低->高,指令格式是高->低
op 为第一部分指令开始,低8位,这里是0x70(70: invoke-direct)。
对应指令编码格式35C(A|G|op BBBB F|E|D|C)
35c表示
该条指令占用了3个16位
该条指令最多使用5个寄存器
该条指令有常量池索引
既然占用了3个16位,所以先将该条指令的3个16位拷贝过来
0x1070 0x6 0x0
dalvik-bytecode里指出
A: argument word count (4 bits)
B: method reference index (16 bits)
C..G: argument registers (4 bits each)
得出:
op=70,G=0,A=1 BBBB=0x6,C=0, D=0,E=0,F=0
又因为instruction-formats指出 [A=1] op {vC}, kind@BBBB
invoke-direct {vC} = invoke-direct {v0}, Ljava/lang/Object;-><init>()V
------------------------------------------------
接着解析剩下的指令
0xe
对应编码格式 ID为 10x(ØØ|op),语法为 return-void
结果也就是return-void 0
--------------------------------------------------
二、另一个方法dex指令集为:
0x62 0x0 0x122 0x5 0x1070 0x7 0x1 0x206e 0x8 0x31 0x10c 0x21a 0x0 0x206e 0x8 0x21 0x10c 0x106e 0x9 0x1 0x10c 0x212 0x2223 0x8 0x306e 0x4 0x210 0xe
0x62对应编码格式ID为21c(A: value register or pair; may be source or dest (8 bits)
B: static field reference index (16 bits)),格式AA|op BBBB,语法为 sget-object。占用2个16位,1个寄存器,有常量池索引。那么copy一条指令出来:
0x62 0x0
得出:
op=62, AA=0, BBBB=0
sget-object v0,Ljava/lang/System;->out:Ljava/io/PrintStream;
-----------------------------------------------------------
0x122 低8位 0x22对应指令ID 21c new-instance vAA, type@BBBB A: destination register (8 bits)
B: type index 。 占用2个16位,1个寄存器,有常量池索引。格式AA|op BBBB。那么copy一条指令出来:
0x122 0x5
得出:
op=22, AA=1, BBBB=5
new-instance v1,Ljava/lang/StringBuilder;
-----------------------------------------------------------
0x1070 低8位 0x70对应指令ID 35c , invoke-direct A: argument word count (4 bits)
B: method reference index (16 bits)
C..G: argument registers (4 bits each) A|G|op BBBB F|E|D|C,那么copy一条指令出来:
0x1070 0x7 0x1
得出:
op=70,G=0, A=1, BBBB=7 C=1, D=0, E=0, F=0
[A=1] op {vC}, kind@BBBB
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
----------------------------------------------------
0x206e 低8位 0x6e对应指令ID 35c, invoke-virtual,A|G|op BBBB F|E|D|C,那么copy一条指令出来:
0x206e 0x8 0x31
得出:
op=6e, G=0, A=2, BBBB=8 C=1, D=3, E=0, F=0 ([A=2] op {vC, vD}, vtaboff@BBBB)
invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
----------------------------------------------------
0x10c 低8位 0x0c对应指令ID 11x move-result-object vAA A: destination register (8 bits),
AA|op
move-result-object v1
-------------------------------------------------------------
0x21a 低8位 0x1a对应指令ID 21c const-string vAA, string@BBBB A: destination register (8 bits)
B: string index 。AA|op BBBB
0x21a 0x0
op=1a, AA=2 , BBBB = 0
const-string v2, "\r\n"
------------------------------------------------------------
剩下的类同。。。。。。。。。。
Dalvik指令解析示例
最新推荐文章于 2023-06-26 19:59:19 发布