2017-10-18 209 views
0

嗨,我试图拦截sun.security.ssl.ServerHandshaker的负载并添加字节代码以打印几个私有字段。Javassist报告字段在构造函数初始化后为空

这里是我试图添加代码:

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这些字段应该在构造函数的末尾进行初始化。是什么赋予了?

+1

你确定他们正在初始化?它们不会在您链接的源代码中的任何位置初始化。 – Antimony

回答

3

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

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

+0

这样做,谢谢! –

0

在源代码中找不到任何东西。这是在这里开始的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。

+0

因为他没有提供他自己的安全管理器实例,*没有*安全管理器提供。什么例外? – EJP

+0

我没有安全管理员,但谢谢! –