上一节我们分析了一个简单的HelloWorld的class文件,那知道了这个结构有什么用呢,接下来我们通过几个例子来简单的了解一下。
一、先看一个简单的例子,这个例子了,我们通过直接改变二进制的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,现在我们将其替换为0X 70 表示 p ,替换后如下:
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: 70 72 6C 64 07 00 1A 0C 00 1B 00 1C 01 00 0A 48 ; prld...........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 ; .........
发现出了红色的不一样之外,其他都是一样的,运行看到如下结果: 发现 o--->p ,查看ASCII表 0X 6F=o ,0x 70 =p,因为UTF8 英文跟ASCII码一样,所以有这样的结果。
本站支持 pay for your wishes
相关推荐
2. **找到并修改class文件**:在解压后的目录中找到需要修改的class文件,使用反编译工具(如jd-gui或jd-core-java)查看其源代码,理解并进行必要的修改。修改完成后,需要使用Java编译器(javac)重新编译修改过的...
1. **Java源代码与Class文件**: Java源代码文件以`.java`为扩展名,它包含了用Java语言编写的程序。这些源代码需要通过Java编译器(Javac)转换成字节码,即`.class`文件,以便于Java虚拟机(JVM)执行。`.class`...
jad -r -s <output_directory> *.class # 使用jad反编译所有Class文件,将输出存放在 ``` 这将把所有反编译后的Java源代码保存在指定的输出目录下,方便进一步查看和分析。 总的来说,Eclipse结合JadClipse和Jad...
总的来说,ClassFinal作为一款Java class文件安全加密工具,为开发者提供了一种简单、高效的代码保护方案,尤其适合于那些重视代码安全但又不想改动大量代码的企业级项目。其兼容性和易用性使其在Java开发领域具有...
#### 一、Java与JVM中的Class文件加载机制概述 Java作为一种动态性极强的解释型编程语言,在程序运行时,Java虚拟机(JVM)负责将编译生成的`.class`文件加载到内存中进行执行。在Java环境中,每个类(Class)以及...
将class文件打包成jar文件是Java开发中常见的需求,尤其在使用WebService的SOAP协议时,为了实现远程调用,往往需要将本地的类文件(.class)打包成jar包进行分发。本文将深入探讨这一过程,包括手动压缩和利用...
本压缩包文件提供了两个示例项目,分别展示了JDK动态代理和CGLib动态代理的实现,帮助我们理解这两种技术的工作原理以及它们生成的class文件结构。 首先,我们来详细了解JDK动态代理。JDK动态代理基于Java的接口...
#### 一、Class文件概述 Class文件是Java程序编译后的产物,由编译器生成并被Java虚拟机(JVM)加载执行。它以8位字节流的形式组织数据,共包含15个有意义的组成部分。每个部分紧密相连,不存在任何无意义的填充字节...
java修改class文件使用的jclasslib.jar、javassist.jar等等文件。相关步骤、还有一个idea项目示例。(当时找了好久的jclasslib.jar文件,最后才找到一个可用的)
下面是如何创建和使用这个文件的例子: 1. **创建 `manifest.mf` 文件**: - 在 `.class` 文件所在目录创建一个名为 `manifest.txt` 的文件。 - 在文件中添加以下内容:`Manifest-Version: 1.0` - 将文件重命名...
这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...
**Proguard:免费的Class文件压缩、优化与混淆工具** Proguard是一款强大的Java类文件处理工具,主要用于压缩、优化和混淆Java代码。它在Android开发中尤其重要,因为默认情况下,Android Studio会使用Proguard来...
本教程将详细介绍如何使用工具jclasslib和编写Java程序来修改.class文件的内容。 首先,我们需要了解.jclasslib工具。jclasslib是一款强大的类文件查看器,它允许开发者以图形化的方式查看和分析Java字节码。在给定...
如果是在同一个 module中(也就是同一个py文件里),直接用就可以 如果在不同的module里,例如 a.py里有 class A: b.py 里有 class B: 如果你要在class B里用class A 需要在 b.py的开头写上 from a import A 举个例子:...
### 如何使用Java命令将Class文件打包成JAR包 在Java开发中,将多个`.class`文件打包成一个`.jar`文件是常见的需求,这不仅便于管理代码,也利于软件的分发与运行。本文将详细介绍如何通过Java命令行工具`jar`,将...
1. **选择项目**:在MyEclipse的项目浏览器中,找到包含`.class`文件的Java项目或JAR文件。 2. **右键菜单**:右键点击目标`.class`文件,选择`Open With` -> `JadClipse Class File Viewer`。 3. **查看字节码**:...
"jd-gui"是一款常用的Java Class文件反编译工具,它可以图形化地显示`Class`文件的源代码。这款工具提供了用户友好的界面,允许开发者快速浏览、搜索和分析反编译出的代码。使用jd-gui,你可以: 1. 打开`Class`...
下面是一个简单的自定义Gradle插件示例,展示了如何使用ByteBuddy修改编译后的class文件: 1. 创建一个新的Gradle插件项目,包含以下目录结构: ``` my-plugin/ ├── src/main/groovy │ └── ...
同时,提供的"test.java"文件是一个未编译的Java源代码文件,可以作为示例,编译成.class文件后,用jclasslib进行分析和可能的修改。这个过程可以帮助开发者理解从源代码到字节码的转换过程,并且在遇到问题时,能更...