Dalvik指令解析示例

一、已知一个方法的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"
	------------------------------------------------------------

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江西省遂川县常驻深圳大使

喜欢本文,打赏下作者吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值