【问题标题】:Javassist reports fields are null after being initialized in constructorJavassist 报告字段在构造函数中初始化后为空
【发布时间】: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


【解决方案1】:

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

由于clnt_random是一个对象类型,它的初始值为null,并且在构造函数的任何地方都没有赋予它新的值,所以当你的代码被调用时它仍然是null。

【讨论】:

    【解决方案2】:

    您不会在源代码中找到任何内容。这是Java Security Manager 在这里启动。

    由于您没有提供自己的安全管理器实例,因此提供了默认值。默认的 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。

    【讨论】:

    • 由于他没有提供自己的安全管理器实例,因此没有提供了安全管理器。还有什么例外?
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2010-11-28
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多