亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ByteBuddy 附加到本地正在運行的進程

ByteBuddy 附加到本地正在運行的進程

動漫人物 2022-07-20 20:29:04
我正在嘗試使用 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它不會更改的所有類。返回原始類文件字節在語義上是相同的,但是調用方需要付出額外的努力才能發現您沒有更改它。對于將為每個加載的類調用的代碼,但通常只對少數感興趣(或者只想打印信息而不更改任何內容),這樣的性能問題很重要。


查看完整回答
反對 回復 2022-07-20
  • 1 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號