2017-10-18 85 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

我沒有安全管理員,但謝謝! –