大家好,我正在尝试拦截 sun.security.ssl.ServerHandshaker
的负载并添加字节代码以打印几个私有(private)字段。
这是我要添加的代码:
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这些字段应该在构造函数结束时初始化。给了什么?
最佳答案
您提到的字段未在构造函数中初始化。例如,如果您查看链接的源代码并搜索 clnt_random
,您会发现它只设置在一个地方:clientHello
方法。 (clnt_random
是在基类 Handshaker
中定义的,但是 Handshaker
也没有在任何地方初始化它)。
由于 clnt_random
是一个对象类型,它的初始值为 null,并且在构造函数的任何地方都没有为其分配新值,所以当您的代码被调用时它仍然是 null。
关于Javassist 报告字段在构造函数中初始化后为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46819845/