我正在嘗試使用 ByteBuddy 附加到我的計算機上運行的正在運行的進程。我希望在我附加到正在運行的程序時,我的代理將導致重新加載加載的類并顯示我的 Transformer 的打印語句。相反,當我停止正在附加的正在運行的進程時,會發生一些來自我的 Transformer 的打印語句,用于某些 JDK 類。代碼貼在下面:import net.bytebuddy.ByteBuddy;import net.bytebuddy.agent.ByteBuddyAgent;import net.bytebuddy.dynamic.loading.ClassReloadingStrategy;import net.bytebuddy.implementation.FixedValue;import java.io.*;import static net.bytebuddy.matcher.ElementMatchers.named;public class Thief { public static void main(String[] args) throws Throwable { String pid = "86476"; // <-- modify this to attach to any java process running on your computer System.out.println(new Thief().guessSecurityCode(pid)); } public String guessSecurityCode(final String pid) throws Throwable { File jarFile = createAgent(); ByteBuddyAgent.attach(jarFile, pid); return "0000"; }
1 回答

蝴蝶不菲
TA貢獻1810條經驗 獲得超4個贊
僅僅添加一個轉換器不會導致重新加載已經加載的類。默認情況下,您的轉換器只會看到新加載的類,因此您在退出時看到一些類的原因是這些類以前沒有使用過,而是專門為關閉過程加載的。
要重新轉換您首先必須addTransformer(yourTransformer, true)
用于注冊的類,然后使用您要轉換retransformClasses
的類調用。注意getAllLoadedClasses的存在和getInitiatedClasses(ClassLoader)
作為附加說明,我強烈反對將 Java 代理嵌入為源代碼字符串的方法,需要將它們寫入臨時文件,調用編譯器并最終創建 jar 文件。您可以輕松地將代理類集成到您的普通源代碼中。然后,要生成僅包含代理類的 jar 文件,您只需將現有.class
文件從應用程序的代碼庫復制到代理 jar。對于簡單的情況,您可以同時使您的應用程序 jar 文件成為有效的代理 jar 文件,然后直接使用它,而無需任何額外的復制步驟。
此外,請記住, aClassFileTransformer
應該始終返回null
它不會更改的所有類。返回原始類文件字節在語義上是相同的,但是調用方需要付出額外的努力才能發現您沒有更改它。對于將為每個加載的類調用的代碼,但通常只對少數感興趣(或者只想打印信息而不更改任何內容),這樣的性能問題很重要。
添加回答
舉報
0/150
提交
取消