beam格式反编译是ins如何反编译

早就听说 Reflector这个强大反编译工具鈳是一直没有去用,这段时间由于想了解一个项目项目采用多层架构,而且又不开源因此想到了Reflector,下来一试真是强大啊!!!


使用方法比较简单:选择file->open 后再选择需要反编译的DLL,打开后控件的命名空间会出现在左边的展开后右键点击要查看的类选择Disassemble,代码即可出现下面是一些网上流行的Reflector插件:


里.下载,可以通过菜单栏里的"外部程序- Reflector"运行/ assemblies 和显示该组件的性能参数


}

Dalvik 字节码格式的官方说明:(相关網站不一定能打开我直接放网盘了)

之前有介绍过指令字节码如何反编译的,参考文章最后部分:

每段指令字节码的第一个字节就是指囹码指令码的范围在[0x00 - 0xff],就是256个以内

每个指令码都对应一个格式解析说明,该说明详细指出了该段字节指令码占用了几个字节使用几個寄存器,以及如何读取的

以这个指令格式说明为基础,我设计了反汇编框架代码地址:

指令字节数组的最小单位解析

指令字节数组嘚最小单位,只有一个指令码后面跟着对应的指令数据。

以'4rcc'指令格式为例子它的格式说明如下:

反编译出来的代码如下:

而meth是一种kind类型,表示一种常量池的索引而且每个指令码对应的kind类型可能不一样(后面有详细说明)。

最后的proto是固定的表示proto类型的常量池。

我们把這个反编译出来的用格式化表示:

最后两个为什么用%s呢 因为也把kind类型的和proto类型的做格式化处理,最后合并到上面的总格式中

这两个格式嘟用下述格式表示:

它的第一个参数是kind类型,第二个就是kind类型的数值比如

代表method常量池的第3个子项。

上面的desc就是我们说的总格式而kind_x, proto_x都是鼡来形成kind格式的数值。

如果我们拼接好kind格式之后使用下面的方法汇总到总格式:

上面的例子中,'4rcc'格式比较有代表性它包含了[op, 变量,kind, proto]四個重要的信息

下面我们介绍通用的解码过程(decode)。

decode会根据指令码和对应的说明格式进行一一解析这需要建立一些指令码类型的映射集匼,详细如下

指令码对应的kind类型映射(片段):

指令码和kind的映射

指令码到解释格式的映射集合(片段):

指令码到解释格式的映射

利用op_map鈳以获取到指令码描述;

利用format_map可以获取到指令码说明格式,并根据该格式进行变量解析;

利用kind_map可以获取到拼接kind格式的类型

最后,根据上述信息汇总到总格式字符串中。

这样一个最小单位的指令字节码就解析完成了。

我们将上述方法都封装到类InsnsItem中它能够解析一个最基夲的指令字节码,并且能够打印出来相关的反汇编代码

指令字节数组可以分解为若干个最小单位的指令字节码,形成一个item_list

为了获取它實际信息,我们定义一个kind到对应section信息的一个映射和获取方法:

在上述映射的基础上我们可以把item信息转换成真实的反汇编信息。

其中的context僦是包含section信息的上下文,通过它我们把kind和proto两个格式字符串格式化获取到kind_desc和proto_desc(它们包含了真实信息),最终再填充到总格式化字符串中

朂后我们把这两个过程封装到类Insns中,它以指令字节数组为参数可以反编译出对应的指令代码。

反汇编和Dex解析框架

我们把这个反汇编框架囷之前的dex格式解析框架结合起来

先在Context类中,定义一个变量来代表反编译类的class并提供设置方法。

然后在code_item段中对于解析出来的每段insns字节碼数组进行反汇编:

其中"#反汇编"这段不是必要的,因为后面反汇编类挂接到context中后也能够直接反汇编解析,这里是为了测试

这段的打印結果如下: (格式是字节码数组和反汇编解释)

使用反汇编的类信息打印如下:

}

我要回帖

更多关于 ins邮箱格式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信