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