标签:dalvik
有过android应用反编译或者再打包的朋友都有使用过apktool的经验,apktool能将dex文件的
字节码转换为smali代码,这个工具是怎么做到对dex进行解析并生成smali代码的呢?这就需要对
dex文件的格式很熟悉、需要掌握dalvik指令的字节码格式,并能翻译成对应的smali代码。
我准备写一系列的文章来分析dex文件的格式、dalvik字节码的格式、以及dex to smali的方法,
基于此可以做很多的应用,比如安全扫描、应用加固等等!
Dalvik指令介绍请参考官方文档:General design 如果读者对X86或者ARM指令集有一定的了解,
学习Dalvik指令还是很容易的。如果您掌握了Dalvik指令集,就能将dex文件转换为smali代码,这也
是很多android安全研发人员的基本功。
下面以一个例子开始来讲解Dalvik指令集:
实例1:将如下十六进制指令翻译为davik字节码,从高字节到低字节为:00 02 2C 69 10 70
翻译步骤:(用程序语言描述)
step1: 将00 02 2C 69 10 70赋值给变量instr
step2: 低8bits为opcode,即OP = instr & 0xff 得到 0x70,对应的指令为invoke-direct,查询官方文档
可知0x70指令对应的指令格式为35c,即长度为6个字节,最多有5个寄存器;
format为35c的指令:长度为6bytes,
A: argument word count,寄存器的个数(4bits)
B: method reference index (16bits)
C..G: argument registers (4bits each=20bits)
step3: 获取A G位的值,G = (instr >> 8) & 0xf = 0, A = (instr >> 12) & 0xf = 1,即A等于1,从文档得知:
[A=1
] op
{vC}, kind
@BBBB
step4: 获取C和BBBB的值:C = (instr >> 32) & 0xf = 2,所以寄存器为v2,BBBB = (instr >> 16) & 0xffff = 0x2C69 = 11369
BBBB即为method index,以11369作为下标,查询method表获得该方法对应的描述如下:
struct method_id_item method_id[11369]
void java.lang.Object.<init>() 33A04h 8h Fg: Bg:0x008080 Method ID</span>
所以上述16进制代码对应的dalvik指令为:
invoke-direct v2, Ljava/lang/Object;-><init>()V</span>
小结: 35C的指令是dalvik指令集里比较复杂的一种指令,读者可以对照上述步骤,再仔细分一下转换过程,
如果能将35C的指令分析明白了,再分析别的指令也不是难事。
参考网址:
1. https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html
2. https://source.android.com/devices/tech/dalvik/instruction-formats.html
标签:dalvik
原文地址:http://blog.csdn.net/jiang_lostcode/article/details/43917241