【发布时间】:2017-10-18 21:53:04
【问题描述】:
大家好,我正在尝试拦截 sun.security.ssl.ServerHandshaker 的负载并添加字节码以打印几个私有字段。
这是我要添加的代码:
public static final String printCLIENT_RANDOM_CODE =
"System.out.println(\"this.clnt_random:\"+this.clnt_random);\n"
+ "System.out.println(\"this.session:\"+this.session);";
这是进行增强的函数。 classfileBuffer是原始字节码,className是类名,insertAfterJavaCode就是上面的printCLIENT_RANDOM_CODE
private byte[] instrument(byte[] classfileBuffer, String className, String insertAfterJavaCode) throws Exception {
System.out.println("Attempting to enhance " + className + "...");
ClassPool cp = ClassPool.getDefault();
cp.insertClassPath(new ByteArrayClassPath(className, classfileBuffer));
CtClass cc = cp.get(className);
CtConstructor[] declaredConstructors = cc.getDeclaredConstructors();
for (CtConstructor con : declaredConstructors) {
con.insertAfter(insertAfterJavaCode);
}
return cc.toBytecode();
}
但是,当它运行时,我得到了这个:
Attempting to enhance sun.security.ssl.ServerHandshaker...
this.clnt_random:null
this.session:null
这是为什么呢?如果您查看source code,这些字段应该在构造函数的末尾初始化。什么给了?
【问题讨论】:
-
您确定它们正在被初始化吗?它们未在您链接的源代码中的任何位置初始化。
标签: java ssl bytecode javassist javaagents