Javassist报告字段在构造函数中初始化后为null

时间:2017-10-18 21:53:05

标签: java ssl bytecode javassist javaagents

嘿伙计们我试图拦截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那些字段应该在构造函数的末尾初始化。是什么给了什么?

2 个答案:

答案 0 :(得分:3)

您提到的字段未在构造函数中初始化。如果您查看链接的源代码并搜索clnt_random,例如,您会发现它只在一个地方设置:clientHello方法。 (clnt_random在基类Handshaker中定义,但Handshaker也未在任何位置初始化它。)

由于clnt_random是一个对象类型,它的初始值为null,并且在构造函数中的任何位置都没有赋值,因此在调用代码时它仍然为null。

答案 1 :(得分:0)

您在源代码中找不到任何内容。这是DEMO在这里开始的。

由于您没有提供自己的安全管理器实例,因此提供了默认值。默认Java安全管理器由${JAVA_HOME}/jre/lib/security/java.security配置。在此文件中,您将找到以下行:

...
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageAccess unless the
# corresponding RuntimePermission ("accessClassInPackage."+package) has
# been granted.
package.access=sun.,\
               com.sun.xml.internal.,\
...

这就是你的例外所在。

安全经理是一件好事。不同的沙箱需要不同的安全管理器。例如,Manger可以安全地运行applet。