Dalvik指令解析示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ab6326795/article/details/78444041
一、已知一个方法的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"
	------------------------------------------------------------

	剩下的类同。。。。。。。。。。

展开阅读全文

没有更多推荐了,返回首页