美文网首页
.class和.dex 文件的解析

.class和.dex 文件的解析

作者: Wi1ls努力努力再努力 | 来源:发表于2019-05-19 14:26 被阅读0次

.class 是 java 虚拟机使用的可执行文件,.dex 是在 Android Dalvik的可执行文件。
Art 虚拟机的可执行文件是.oat。以后有看再做。
两个文件的解析分别放在了两个 github 仓库,自己写的小程序,完成度80%还是有的。关键信息的解析都能包括


关于 Dalvik 虚拟机推荐<Android Dalvik 虚拟机结构及机制剖析 卷 1、卷 2>(清华大学出版社)


https://github.com/Wi1ls/ClassParse


https://github.com/Wi1ls/DexParse


言外:
.dex 的操作码是基于寄存器的,因此其 code 信息与 .class 的字节码不同。在 demo 中,解析sayHelloInTest1@Test1后的log 有

registers_size(寄存器个数)=8, ins_size(入参空间)=4, outs_size(内部函数调用空间)=0, tries_size(try 语句块数量)=0, debug_info_off=638, insns_size(指令数组)=7, insns(指令)=[-28160, 1285, -25342, 1542, -32512, -17632, 4096], 
codeBinary=[0x9200, 0x0505, 0x9d02, 0x0606, 0x8100, 0xbb20, 0x1000], padding(try 语句块对齐)=0, tries,handler先不解析}], 

现在来看原始的 codeBinary,方法对应的原始 code 信息

0x9200,0505,9d02,0606,8100,bb20,1000

当解析0x9200时,Android 平台使用小端存储,因此正确翻译后为0x0092,根据官方提供的可执行指令说明,在这里操作码为0x92,查看手册


0x92

且0x92的 id 为23x,继续查表


0x23

于是0x92 的完整指令是0x9200,0505,翻译为

0x9200,0505        mult-int v00,v05,v05

同理0x9d 的完整指令为0x9d02,0606,翻译为

0x9d02,0606      mul-long v02,v06,v06

同理 0x81 完整指令为0x8100,翻译为

0x8100       int-to-long v0,v0

同理0xbb 完整指令为0xbb20,翻译为

0xbb20       mul-int/2addr v0,v2

同理0x10完整指令为0x1000,翻译为

0x1000      return-wide v00

完整翻译:

0x9200  0505    mult-int v00,v05,v05
0x9d06  0606     mul-long v02,v06,v06
0x8100                int-to-long v0,v0
0xbb20                mul-int/2addr v0,v2
0x1000                 return-wide v00

验证,用 sdk 自定的 dexdump -d 指令


dexdump 反编译

说明自己写的 dex-parse 工具的正确性


Dalvik 可执行指令格式
字节码参考文档


相关文章

网友评论

      本文标题:.class和.dex 文件的解析

      本文链接:https://www.haomeiwen.com/subject/vwxqzqtx.html