`

CLASS 文件使用例子二

    博客分类:
  • JVM
阅读更多

 

上一节我看了一个简单的例子,我们通过直接改变二进制的class文件,改变程序的行为,

这一节继续上面的例子看一些其他的情况,用前面的HelloWorld为例

 先看java 文件:

 

 

public class HelloWorld{
	public static void main(String [] arvgs){
	  System.out.println("hello world");
}
}

 

 

它的class文件

 

 

00000000h: CA FE BA BE 00 00 00 2E 00 1D 0A 00 06 00 0F 09 ; 漱壕............
00000010h: 00 10 00 11 08 00 12 0A 00 13 00 14 07 00 15 07 ; ................
00000020h: 00 16 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29 ; .....<init>...()
00000030h: 56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E ; V...Code...LineN
00000040h: 75 6D 62 65 72 54 61 62 6C 65 01 00 04 6D 61 69 ; umberTable...mai
00000050h: 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 ; n...([Ljava/lang
00000060h: 2F 53 74 72 69 6E 67 3B 29 56 01 00 0A 53 6F 75 ; /String;)V...Sou
00000070h: 72 63 65 46 69 6C 65 01 00 0F 48 65 6C 6C 6F 57 ; rceFile...HelloW
00000080h: 6F 72 6C 64 2E 6A 61 76 61 0C 00 07 00 08 07 00 ; orld.java.......
00000090h: 17 0C 00 18 00 19 01 00 0B 68 65 6C 6C 6F 20 77 ; .........hello w
000000a0h: 6F 72 6C 64 07 00 1A 0C 00 1B 00 1C 01 00 0A 48 ; orld...........H
000000b0h: 65 6C 6C 6F 57 6F 72 6C 64 01 00 10 6A 61 76 61 ; elloWorld...java
000000c0h: 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 01 00 10 6A ; /lang/Object...j
000000d0h: 61 76 61 2F 6C 61 6E 67 2F 53 79 73 74 65 6D 01 ; ava/lang/System.
000000e0h: 00 03 6F 75 74 01 00 15 4C 6A 61 76 61 2F 69 6F ; ..out...Ljava/io
000000f0h: 2F 50 72 69 6E 74 53 74 72 65 61 6D 3B 01 00 13 ; /PrintStream;...
00000100h: 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 ; java/io/PrintStr
00000110h: 65 61 6D 01 00 07 70 72 69 6E 74 6C 6E 01 00 15 ; eam...println...
00000120h: 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 ; (Ljava/lang/Stri
00000130h: 6E 67 3B 29 56 00 21 00 05 00 06 00 00 00 00 00 ; ng;)V.!.........
00000140h: 02 00 01 00 07 00 08 00 01 00 09 00 00 00 1D 00 ; ................
00000150h: 01 00 01 00 00 00 05 2A B7 00 01 B1 00 00 00 01 ; .......*?.?...
00000160h: 00 0A 00 00 00 06 00 01 00 00 00 01 00 09 00 0B ; ................
00000170h: 00 0C 00 01 00 09 00 00 00 25 00 02 00 01 00 00 ; .........%......
00000180h: 00 09 B2 00 02 12 03 B6 00 04 B1 00 00 00 01 00 ; ..?...?.?....
00000190h: 0A 00 00 00 0A 00 02 00 00 00 03 00 08 00 04 00 ; ................
000001a0h: 01 00 0D 00 00 00 02 00 0E                      ; .........

 

 

找到第18号常量池,它是一个constant_utf8类型,在第 000000a0h 行  bytes=0X 68 65 6C 6C 6F 20 77 6F 72 6C 64表示的正好是我们要输出的内容,“hello world”,其中0X6F 表示 0,现在我们在0X6F 之前增加4个字节的 0x6F ,如下:

 

00000000h: CA FE BA BE 00 00 00 2E 00 1D 0A 00 06 00 0F 09 ; 漱壕............
00000010h: 00 10 00 11 08 00 12 0A 00 13 00 14 07 00 15 07 ; ................
00000020h: 00 16 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29 ; .....<init>...()
00000030h: 56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E ; V...Code...LineN
00000040h: 75 6D 62 65 72 54 61 62 6C 65 01 00 04 6D 61 69 ; umberTable...mai
00000050h: 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 ; n...([Ljava/lang
00000060h: 2F 53 74 72 69 6E 67 3B 29 56 01 00 0A 53 6F 75 ; /String;)V...Sou
00000070h: 72 63 65 46 69 6C 65 01 00 0F 48 65 6C 6C 6F 57 ; rceFile...HelloW
00000080h: 6F 72 6C 64 2E 6A 61 76 61 0C 00 07 00 08 07 00 ; orld.java.......
00000090h: 17 0C 00 18 00 19 01 00 0B 68 65 6C 6C 6F 20 77 ; .........hello w
000000a0h: 6F 6F 6F 6F 6F 72 6C 64 07 00 1A 0C 00 1B 00 1C ; ooooorld........
000000b0h: 01 00 0A 48 65 6C 6C 6F 57 6F 72 6C 64 01 00 10 ; ...HelloWorld...
000000c0h: 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 ; java/lang/Object
000000d0h: 01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 53 79 73 ; ...java/lang/Sys
000000e0h: 74 65 6D 01 00 03 6F 75 74 01 00 15 4C 6A 61 76 ; tem...out...Ljav
000000f0h: 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D ; a/io/PrintStream
00000100h: 3B 01 00 13 6A 61 76 61 2F 69 6F 2F 50 72 69 6E ; ;...java/io/Prin
00000110h: 74 53 74 72 65 61 6D 01 00 07 70 72 69 6E 74 6C ; tStream...printl
00000120h: 6E 01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F ; n...(Ljava/lang/
00000130h: 53 74 72 69 6E 67 3B 29 56 00 21 00 05 00 06 00 ; String;)V.!.....
00000140h: 00 00 00 00 02 00 01 00 07 00 08 00 01 00 09 00 ; ................
00000150h: 00 00 1D 00 01 00 01 00 00 00 05 2A B7 00 01 B1 ; ...........*?.?
00000160h: 00 00 00 01 00 0A 00 00 00 06 00 01 00 00 00 01 ; ................
00000170h: 00 09 00 0B 00 0C 00 01 00 09 00 00 00 25 00 02 ; .............%..
00000180h: 00 01 00 00 00 09 B2 00 02 12 03 B6 00 04 B1 00 ; ......?...?.?
00000190h: 00 00 01 00 0A 00 00 00 0A 00 02 00 00 00 03 00 ; ................
000001a0h: 08 00 04 00 01 00 0D 00 00 00 02 00 0E          ; .............

 

其他不改变,运行如下:

 

 



可以看到错误提醒tag 111 非法,为什么呢,回顾前面的知识,看第18号常量池:

 

第18个常量:tag=0X 01,为一个constant_UTF8类型(utf8编码的字符串),根据它的定义后面的长度可变,length=0X00 0B表示后面有11个字节属于它的内容:bytes=0X 68 65 6C 6C 6F 20 77 6F 6f 6f 6f    ,再往下为另外一个常量,tag=0X6F =111,而class 文件只定义了 tag=1,3,4...11,12.。11种类型(没有2),所以会找不到tag=111,那怎么样才能想程序中多输出字符呢,其实很简单,只是需要将第18号常量的长度增加4个,由0X0B ---》0X0F 。即如下:主要看  000000a0h 行 和 00000070h 行

 

00000000h: CA FE BA BE 00 00 00 2E 00 1D 0A 00 06 00 0F 09 ; 漱壕............
00000010h: 00 10 00 11 08 00 12 0A 00 13 00 14 07 00 15 07 ; ................
00000020h: 00 16 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29 ; .....<init>...()
00000030h: 56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E ; V...Code...LineN
00000040h: 75 6D 62 65 72 54 61 62 6C 65 01 00 04 6D 61 69 ; umberTable...mai
00000050h: 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 ; n...([Ljava/lang
00000060h: 2F 53 74 72 69 6E 67 3B 29 56 01 00 0A 53 6F 75 ; /String;)V...Sou
00000070h: 72 63 65 46 69 6C 65 01 00 0F 48 65 6C 6C 6F 57 ; rceFile...HelloW
00000080h: 6F 72 6C 64 2E 6A 61 76 61 0C 00 07 00 08 07 00 ; orld.java.......
00000090h: 17 0C 00 18 00 19 01 00 0F 68 65 6C 6C 6F 20 77 ; .........hello w
000000a0h: 6F 6F 6F 6F 6F 72 6C 64 07 00 1A 0C 00 1B 00 1C ; ooooorld........
000000b0h: 01 00 0A 48 65 6C 6C 6F 57 6F 72 6C 64 01 00 10 ; ...HelloWorld...
000000c0h: 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 ; java/lang/Object
000000d0h: 01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 53 79 73 ; ...java/lang/Sys
000000e0h: 74 65 6D 01 00 03 6F 75 74 01 00 15 4C 6A 61 76 ; tem...out...Ljav
000000f0h: 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D ; a/io/PrintStream
00000100h: 3B 01 00 13 6A 61 76 61 2F 69 6F 2F 50 72 69 6E ; ;...java/io/Prin
00000110h: 74 53 74 72 65 61 6D 01 00 07 70 72 69 6E 74 6C ; tStream...printl
00000120h: 6E 01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F ; n...(Ljava/lang/
00000130h: 53 74 72 69 6E 67 3B 29 56 00 21 00 05 00 06 00 ; String;)V.!.....
00000140h: 00 00 00 00 02 00 01 00 07 00 08 00 01 00 09 00 ; ................
00000150h: 00 00 1D 00 01 00 01 00 00 00 05 2A B7 00 01 B1 ; ...........*?.?
00000160h: 00 00 00 01 00 0A 00 00 00 06 00 01 00 00 00 01 ; ................
00000170h: 00 09 00 0B 00 0C 00 01 00 09 00 00 00 25 00 02 ; .............%..
00000180h: 00 01 00 00 00 09 B2 00 02 12 03 B6 00 04 B1 00 ; ......?...?.?
00000190h: 00 00 01 00 0A 00 00 00 0A 00 02 00 00 00 03 00 ; ................
000001a0h: 08 00 04 00 01 00 0D 00 00 00 02 00 0E          ; .............

 

再运行:

 


 

 

 

 

 

本站支持 pay for your wishes

 

  • 大小: 62.7 KB
  • 大小: 17.7 KB
3
2
分享到:
评论

相关推荐

    jclasslib修改class文件

    java修改class文件使用的jclasslib.jar、javassist.jar等等文件。相关步骤、还有一个idea项目示例。(当时找了好久的jclasslib.jar文件,最后才找到一个可用的)

    class文件格式分析实验

    自己结合class文件格式做的一个小实验,尽管小能直观的展示class文件内部的构造,这个文档对class文件中的每个字节都多了分析

    weak_classdump, Cycript实时classdump加密二进制文件的替代方案.zip

    weak_classdump, Cycript实时classdump加密二进制文件的替代方案 weak_classdump生成传递给函数的类的头文件的Cycript脚本。当你不能 classdump,当二进制文件被加密时,最有用的。用法示例:root# cycript -p Skype...

    Java文件转换为 Exe 可执行文件

    第二步:编译,得到 Hello.class 文件。并使用 jar.exe 生成 jar 文件: D:\&gt;javac test/Hello.java D:\&gt;jar cvf test.jar test/Hello.class 第三步:使用 j2e 工具,将 jar 文件转换为 exe 可执行文件,指定启动...

    java反编译class源码-JavaDecompiler:如何将.class文件反编译回.java文件以查看源代码

    2.语法和示例 java -cp org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -hdc = 0 -dgs = 1 -rsy = 1 -lit = 1 &lt;.class文件具有完整路径&gt; java -cp“ C:\ Downloads \ java-decompiler.jar”...

    【JavaScript源代码】vue 使用class创建和清除水印的示例代码.docx

    vue 使用class创建和清除水印的示例代码  页面添加水印的方法有很多,以下举例使用class定义的方法进行水印内容渲染: 1、新建文件:WatermarkClass.js export default class WatermarkClass { constructor({id=...

    qt调用JAVA文件示例

    本示例主要演示在QT开发android APP时,怎样通用调用JAVA文件,实现android原生操作

    60种C#窗体皮肤ssk文件(含使用方法及示例,使用超简单)

    1. 先把IrisSkin2.dll文件添加到当前项目引用(解决方案资源管理器-&gt;当前项目-&gt;引用-&gt;右键-&gt;添加引用 ,找到IrisSkin2.dll文件.....之后就不用我说了吧^_^).IrisSkin2.dll文件最好放在当前项目\bin\Debug文件中. 2. ...

    php HttpRequest class HTTP请求类及调用示例.rar

    一个牛人写的PHP HttpRequest class HTTP请求类,支持GET,POST,Multipart/form-data,类中函数的... sendMultipart multipart 方式,处理发送的数据,发送文件推荐使用此方式  用法请参考压缩包内的演示文件:demo.php

    基于jenkins发布编译后的class文件

    主要介绍了基于jenkins发布编译后的class文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    dex2jar:用于处理 android .dex 和 java .class 文件的工具

    用于处理 android .dex 和 java .class 文件的工具 ###组件: dex-reader 旨在读取 Dalvik Executable (.dex/.odex) 格式。 它具有类似于 ASM 的轻量级 API。 这里有一个例子 dex-translator 旨在完成转换工作...

    jquery采用oop模式class类的使用示例

    本文实例讲述了jquery采用oop模式class类的使用方法。分享给大家供大家参考,具体如下: 这里用class来管理jquery的各个function,我觉得很方便,并且代码可读性也很强。以前我喜欢建文件写function,再包括文件,到...

    Java中Class类工作原理详解

    换言之,每当编写并且编译了一个新类,就会产生一个Class对象(恰当地说,是被保存在一个同名的.class文件中)。在运行时,当我们想生成这个类的对象时,运行这个程序的 Java虚拟机(JVM)首先检查这个类的Class对象...

    java和js操作XML文件

    java和js操作XML文件,结合例子详细讲解java和js操作XML文件。

    Spring bean 动态注册,jar包热替换

    Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...

    Python 从一个文件中调用另一个文件的类方法

    如果是在同一个 module中(也就是同一个py文件里),直接用就可以 如果在不同的module里,例如 a.py里有 class A: b.py 里有 class B: 如果你要在class B里用class A 需要在 b.py的开头写上 from a import A 举个例子:...

    使用J2SE API读取Properties文件的六种方法

    1。使用java.util.Properties类的load()...使用class变量的getResourceAsStream()方法  示例: InputStream in = JProperties.class.getResourceAsStream(name);  Properties p = new Properties();  p.load(in);

    DELPHI搜索文件的示例

    搜索TXT 文件的示例unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ...

    Hibernate实践例子程序

    2. Hibernate Extention,用来自动生成与那些*.hbm.xml对应的POJO,也就是根据那些对象关系映射的配置文件生成相应的class文件。 HibernateEx里面有一个hbm2java工具,就是用来根据些配置文件生成相应的POJO class。...

    Java 动态加载jar和class文件实例解析

    主要介绍了Java 动态加载jar和class文件实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics