`

11、字节码文件解析

 
阅读更多

         实现语言与操作系统的无关性基础仍然是虚拟机和字节码储存格式,jvm不与java及其他任何语言绑定,只和.class文件这种特定的二进制格式绑定, class文件包含jvm的指令集和符号表等其他信息;使用javac可以将java语言编译成.class文件,使用JRuby编译器可以讲JRuby编译成.class文件,jvm并不关心.class的来源是何种语言。

 

        .class字节码命令提供的描述能力比java语言本身还要强大;.class文件是一组以8位字节(64位)为基础的二进制流,中间没有任何分隔符(如逗号,句号,换行等);jvm规定:.class文件采用一种类似c语言结构体的伪结构来储存数据,这种伪结构只有两种数据类型:无符号数和表

        无符号数属于基本的数据类型,以u1,u2,u4,u8来分别表示一个字节,两个字节,四个字节和8个字节的无符号数,无符号数用来描述数字,索引引用,数量值或按照UTF8编码构成字符串数;

        表是由多个无符号数或其他表作为数据项构成的复合数据类型,所有表都习惯性的以"_info"结尾,表用于描述有层次关系的复合结构的数据。整个CLASS文件本质上是一张表。

一个字节码文件大楷内容:

在一个class文件中,同一类型的数据前都会有个计数器,通过上图查看各个数据类型所占的长度。 

这是一个等待编译的接口:

package org;
public interface Demo {}

 执行编译后,执行javap -berbose Demo

E:\side1\Smart\src\test\java\org>javap -verbose Demo
Warning: Binary file Demo contains org.Demo
Classfile /E:/side1/Smart/src/test/java/org/Demo.class
  Last modified 2014-10-19; size 93 bytes
  MD5 checksum 43c458c35524acf338255261e9495239
  Compiled from "Demo.java"
public interface org.Demo
  SourceFile: "Demo.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
  #1 = Class              #5              //  org/Demo
  #2 = Class              #6              //  java/lang/Object
  #3 = Utf8               SourceFile
  #4 = Utf8               Demo.java
  #5 = Utf8               org/Demo
  #6 = Utf8               java/lang/Object
{
}

打印了类文件路径、源文件、版本、md5、类文件长度(size)、类型标识和常量池内容;

使用WinHex软件打开这个类文件:

 

1、魔数和版本

从长度上为93个字符,是将class文件的二进制数组转换为16进制数组,

前4个字节称为魔数(0xCAFEBABE) ,现在很多文件采用魔数来识别文件类型,而不使用扩展名;

第5、6、7、8个字节是版本号,56是次版本号,78(0x0000 0000 67)是主版本号33,查到33对应的是51;

2、常量池

第9、10(0x0000 0000 89)是显示有多少个常量,这里显示的是7个,要减去一个;表示有6个常量,因为常量是从1开始索引而读取时从0开始读取的;

如果是26则表示(2*16+6-1)为37个常量;

常量池存放两种类型的常量:字面值(直接赋值如“ok”,23,literal)、符号引用(接口类的引用、方法的引用、字段?)

第A (11)字节表示该类文件是 是一个什么类型的引用:7 表示是一个类或接口的符号引用;

 


 
查看constant_class_info是含有u1,u2字节的,u1表示自己占了一个字节,u2表示后面的2个字节(0xBC)是显示这个calss或接口信息的 ,

0xC的值是5,表示指向常量池中的第#5项,为 #5 = Utf8 org/Demo,如果是类的值是2,#6是object;

0xD的值又是7,同上查6-3,但后面F的值是6,表示一个Object

到0x0000 00010 0,的值是1,查6-3,是constant_utf8_info,查6-6,要占4个字节,length:0A(10),打印的是sourcefile 10个字符,后又为1,值为9打印的是Demo.java

长度为9,后又为1,值为8,打印的是org/Demo长度为8,后有为1,值为10(16),打印java/lang/object长度为16;在74之后即字符t之后接着的2个字符0601表示访问标识符acess_flag,从javap中可以看到: flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT

0x0001|0x0200|0x0400  ---> 0x0601 就是这么来的;一般的类为flags: ACC_PUBLIC, ACC_SUPER,为21

  • 大小: 208.5 KB
  • 大小: 187.8 KB
  • 大小: 251.4 KB
  • 大小: 112.6 KB
  • 大小: 171.8 KB
  • 大小: 170.9 KB
  • 大小: 204.7 KB
  • 大小: 112.4 KB
分享到:
评论

相关推荐

    class文件结构解析字节码后文件

    class文件结构解析字节码后文件

    java字节码分析工具

    Java字节码分析工具,系统分析了java字节码文件,即java class类文件,对该文件中的各种成分以树的形式描述出来,只能针对未加密的class文件,一般由标准java编译器编译生成的class文件都未加密,该系统在vs2003下面...

    从一个class文件深入理解Java字节码结构

    我们都知道,Java程序最终是转换成class文件执行在虚拟机上的,那么class文件是个怎样的结构,虚拟机又是如何处理去执行class文件里面的内容呢,这篇文章带你深入理解Java字节码中的结构。 1.Demo源码 首先,编写一...

    jclasslib,JClullb字节码查看器是一种工具,它可以可视化编译的Java类文件和包含的字节码的所有方面。.zip

    jclasslib,JClullb字节码查看器是一种工具,它可以可视化编译的Java类文件和包含的字节码的所有方面。.zip

    字节码解析01.rar

    使用Java编程语言,对.class文件进行解析,类似于javap -v filename指令的效果,但是没有对attibutes属性进行解析,需要学习的可以下载,程序运行的效果在本人的博客的附录中

    解析TS文件

    解析传输流188或204byte的Ts文件

    java实现dex文件方法字节码隐藏

    基于一个dex文件解析程序修改而成,指定要隐藏的方法的sig即可。

    Java字节码操纵框架 asm-3.1组件包大集合

    Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    class文件解析

    一个解析java class文件的代码

    Java虚拟机字节码.zip

    详细介绍ASM框架的API、Class文件结构解析、HotSpot虚拟机类加载源码分析、动态代理与字节码插桩的实现。

    H.264视频字节流解析成NALU

    该程序完成从XXX.h264编码文件中解析出视频的基本单元NALU,NALU是H.264码流解码的基本单元。NALU包括起始码和数据部分,对于起始码,程序可以解析出0x000001或者0x00000001开头的NALU。程序由main()、int parse_h...

    java解析txt

    * 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取 * 3:读取到输入流后,需要读取生成字节流 * 4:一行一行的输出。readline()。 * 备注:需要考虑的是异常情况 * @param filePath */...

    JavaBytecodeAnalyzer:解析学习 Java 字节码

    JavaBytecodeAnalyzer 解析 Java 字节码,学习字节码指令集 解析 class 文件为字节码,以熟悉 class 文件结构 学习 java bytecode 指令集

    视频文件文件头解析--avi

    视频文件文件头解析--avi AVI 格式是音频视频交错(Audio Video Interleaved)的英文缩写,它是 Microsoft 公司开发的一种符合 RIFF 文件规范的数字音频与视频文件格式。AVI 格式允许视频和音频交错在一起同步播放...

    still:月光虚拟机的蒸馏脚本。 将 lua 5.1 字节码转换为 json 格式

    Still.lua 文件导出一个解析器对象,可用于(使用方法语法)将包含 lua5.1 字节码的字符串解析为要加载到 Moonshine vm 中的 json 字符串。 (请注意,moonshine vm 对其 json 格式相当挑剔,因此请确保不要在字符串...

    python反编译学习之字节码详解

    你可能还见过另一种类型的文件是 .pyc 结尾的,它们就是 Python “字节码”文件。(在 Python3 的时候这个 .pyc 后缀的文件不太好找了,它在一个名为__pycache__的子目录下面。).pyc文件可以防止Python每次运行时都...

    电力系统COMTRADE二进制数据文件状态量的快速解析算法.pdf

    传统的二进制文件解析算法需要进行14次除法运算及一系列字符串累加操作,对于计算机而言,除法运算相对加减运算是十分耗时的,而字符串累加操作更是最耗时的操作之一。当对海量录波记录文件进行解析时,传统算法效率...

    国南网报文解析V9.9.9.exe(698.45报文解析,南网规约报文解析,376报文解析,101/104报文解析)

    本人写的电力行业报文解析工具,单文件免安装,随存随用,详细解析到每个字节。支持如下规约: 1.698.45报文解析;2.南网规约报文解析;3.376.2报文解析(茜茜写的);4.376.1规约帧结构解析;5.645.07表规约帧结构解析...

    字节码小处理函数库

    私人使用的一些小函数集合文件 作为自己的函数库一直经常使用 效率优,无错误

    Java反编译

    Java反编译工具,解析class字节码文件。 解析class字节码文件

Global site tag (gtag.js) - Google Analytics