一般情况下,使用 JavaRebel 时都配置两个 JVM 参数:-noverify 和 -javaagent
一、-javaagent 参数
这个参数是 JDK5 引入的,可以通过 java -h 查看其帮助信息
// 省略
-javaagent:<jarpath>[=<options>]
load Java programming language agent, see java.lang.instrument
// 省略
通过使用 -javaagent 参数,用户可以在执行 main 函数前执行指定 javaagent 包中的特定代码,甚至可以动态的修改替换类中代码。
javaagent 的代码与你的 main 方法在同一个 JVM 中运行,并被同一个 system classloader 装载,被同一的安全策略(security policy) 和上下文(context)所管理。
如何写一个 javaagent 程序呢?实现很简单,只需要在类中实现 premain 接口:
public static void premain(String agentArgs, Instrumentation inst)
例如可以动态将下面方法中的 true 改为 false
package testagent;
public class TestAgent {
public boolean isOK() {
return true;
}
public static void main(String[] args) {
System.out.println(new TestAgent().isOK());
}
}
package testagent;
import java.lang.instrument.Instrumentation;
public class MyTestAgent {
public static void premain(String agentArgs,Instrumentation inst) {
inst.addTransformer(new MyTestTransformer());
}
}
package testagent;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
public class MyTestTransformer implements ClassFileTransformer {
@Override
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
if(!className.equals("testagent/TestAgent"))
return null;
for(int i=0; i<classfileBuffer.length; i++) {
if(classfileBuffer[i] == (byte)0x04
&& classfileBuffer[i+1] == (byte)0xAC) {
classfileBuffer[i] = (byte)0x03;
}
}
return classfileBuffer;
}
}
// 注意:提前创建 META-INF/MANIFEST.MF 文件
jar -cvfm myagent.jar META-INF/MANIFEST.MF testagent/MyTestAgent.class testagent/MyTestTransformer.class
其中的 MANIFEST.MF 的内容如下:
Manifest-Version: 1.0
Created-By: 1.6.0_16 (Sun Microsystems Inc.)
Premain-Class: testagent.MyTestAgent
而运行方法则如下:
java -javaagent:myagent.jar testagent.TestAgent
二、-noverify 参数
通过使用 -noverify 参数,关闭 Java 字节码的校验功能。
当 ClassLoader 加载的Java 字节码时,字节码首先接受校验器(verifier)的校验。校验器负责检查那些指令无法执行的明显的破坏性的操作。校验器执行的检查操作:
1、变量要在使用之前进行初始化。
2、方法调用与对象应用类型之间要匹配。
3、访问私有数据和方法的规则没有被违反。
4、对本地变量的访问都在运行时堆栈内。
5、运行时堆栈没有溢处。
下面实际演示一下,手动修改 class 文件前后的情况。测试类文件如下:
package testverify;
public class TestVerify {
public int test() {
int i = 0, j = 1;
return i+j;
}
public static void main(String[] args) {
System.out.println(new TestVerify().test());
}
}
执行: java testverify.TestVerify
结果:1
手动将十六进制代码 03 3C 04 3D 1B 1C 60 AC 部分 3D 改成 3C ,即从 istore_2 改为 istore_1 ,局部变量 1 被初始化两次,而局部变量 2 未被初始化。
执行:java testverify.TestVerify
结果:Exception in thread "main" java.lang.VerifyError: (class: testverify/TestVerify,
method: test signature: ()I) Accessing value from uninitialized register 2
Could not find the main class: testverify.TestVerify. Program will exit.
执行:java -noverify testverify.TestVerify
结果:1
分享到:
相关推荐
破解版本的JAR包,放到本地磁盘,ECLIPUS直接用,到JVM设置直接加 -noverify -javaagent:D:\javarebel.jar
解压后包含以下3个文件 javarebel.jar javarebel.stats javarebel-bootstrap.jar 使用方法: 打开MyeEclispe->Window->Prefrence窗口,找到设置tomcat位置下JDK设置...-noverify-javaagent:d:\javatools\javarebel.jar
Java agent使用大全-编辑再发
代理Java包,用于生成JVM的健康的数据,jmx_prometheus_javaagent-0.12.0.jar
主要介绍了javaagent的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
它使用多种智能技术对一个应用程序的内容和功能进行全面的清查。 Burp Spider 通过跟踪 HTML 和 JavaScript 以及提交的表单中的超链接来映射目标应用程序,它还使用了一些其他的线索,如目录列表,资源类型的注释,...
这个版本网上很多地方都要积分才可以下载,现在免积分提供给需要的人下载
基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip...
不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马...
环境JDK1.8 IDEA项目 javaagent+javassist 下载后导入即可
java 代理例子 -javaagent,premain方式实现
java服务端热更新案例-javaagent
2. Premain‐Class 指定的那个类必须实现 premain 方法 1. 定义一个 MANIFEST.MF 文件,必须包含 Premain‐Class
java启动参数中就有javaagent,你只需要在JAVA_OPTS中加入-javaagent:/opt/javaagent/javaagent.jar=/opt/javaagent/agent.properties就实现了方法级监控。其中=前指定的是jar包的路径,=后指定的是对agent的一些配置...
调试!!
在此和大家分享JADE(全称Java Agent DEvelopment Framework)一个很酷的在Java上进行Agent开发的框架。你可以用这个框架很轻易的搭建一个MAS(多智能体系统),在这些系统中,各个Agent是自治的,而且可以互相通信...
JavaAgent技术的Demo,agentmain方式 采用Javaassist技术实现字节码修改,VirtualMachine技术实现运行时代码织入
https://pan.baidu.com/s/15TPev6CpXCRIPvXCIreMzA sbnh
JavaAgent Javassist 与 Asm JavaAgent 字节码动态编程项目
增加set JAVA_OPTS=-noverify -javaagent:d:/javarebel.jar 发布项目时可设置:reloadable="false" \apache-tomcat-5.5.36\conf\Catalina\localhost 目录下.xml文件 测试看看。。。。。。 说明:对于只修改java类...