破解class文件的第一步:深入理解JAVA Class文件

摘要: java定义了一套与操作系统,硬件无关的字节码格式,这个字节码就是用java class文件来表示的,java class文件内部定义了虚拟机可以识别的字节码格式,这个格式是平台无关性的。

java语言是跨平台的,所谓一次编写,到处运行。之所以是跨平台的,就是java定义了一套与操作系统,硬件无关的字节码格式,这个字节码就是用java class文件来表示的,java class文件内部定义了虚拟机可以识别的字节码格式,这个格式是平台无关性的,在linux系统或者在windows系统上都是一致的。这个就好比html文件,我们定义好规范,这个系统只要去按照规范显示出来里面的内容就好了。

一.JVM的语言无关性

JVM是干什么用的?

运行java的啊,难不成是运行python的?

这句话是对的,但不完整,JVM并不是只能运行java程序。

事实上,JVM上运行的本身也不是java文件,而是class文件。

而能够编译转化为class文件的,并不只有java一种。

这就是JVM的语言无关性。

至于能不能运行python,取决于是否有一个能将python转成class文件的工具。

当然这样做没有太多的意义,毕竟python也有其运行环境,且在某种意义上,比java更强大,核心类库更完善。

各种语言也有各自的平台,所以没有必要强制编译。

破解class文件的第一步:深入理解JAVA Class文件

但掌握class文件还是很有意义的。

作为一个程序员,你是否有过或者曾经有过创建一门语言的奢望?最好还是用汉语开发。

但现实,或者大学里的某个导师,却给你兜头一盆冷水。

先花个三五年研究汇编,再考虑实现这些。

三五年,黄花菜都凉了。

现在,有了JVM,似乎看到了一点希望的曙光。

二.class文件的本质

要实现之前的设想,或者说,想开发一个编译工具。首先要做的,就是要解构class文件本身。

无论如何得来,class文件的本质都是一组以 8 位字节为基础单位的2进制流。

记住,是2进制。

为了证明这一点,我们还是要用到一些工具。比如,Sublime。

它并不是一个直接查看2进制的工具,而是16 进制的编辑器(2进制和16进制可以无缝切换)。

破解class文件的第一步:深入理解JAVA Class文件

这里面似乎还有python的事情哦。使用时,直接点击sublime_text.exe文件即可。

然后选择class文件,打开,如下图的样子。

破解class文件的第一步:深入理解JAVA Class文件

看的人眼花对不对?这都什么玩意!

前文说了,2进制,不,这就是16进制啊。

如果你不想去看16进制,也可以使用javap,直接去查看字节码指令(详细内容见前文《一段java代码是如何执行的》)。

如果你也不想打开命令行,还有一个叫jclasslib的工具,可提供图形化界面,它还有适用于idea的插件。

但它不是重点,暂且忽略。

三.class文件结构揭秘

class文件格式中只有两种数据类型,无符号数和表。

其中,无符号数包含所有的基础数据类型和字符串,索引引用等,根据字节长度又可以分为u1,u2,u4,u8,分别代表无符号数的长度为1,2,4,8。

而表,即对象类型。

破解class文件的第一步:深入理解JAVA Class文件

接下来,以sublime文件解析的内容为蓝本,按顺序说说的class文件的构成。

(1)class文件的头四个字节被称为魔数,它的作用是确定这个文件是否为一个能被虚拟机接受的 Class 文件。

如,上文中魔数的值为:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwwgp.html