Java Agent" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 破解 Java Agent 探針黑科技

破解 Java Agent 探針黑科技

時間:2023-06-27 23:27:02 | 來源:網(wǎng)站運營

時間:2023-06-27 23:27:02 來源:網(wǎng)站運營

破解 Java Agent 探針黑科技:

一、什么是 Java Agent ?

籠統(tǒng)地來講,Java Agent 是一個統(tǒng)稱,該功能是 Java 虛擬機提供的一整套后門。通過這套后門可以對虛擬機方方面面進行監(jiān)控與分析。甚至干預(yù)虛擬機的運行。

Java Agent 又叫做 Java 探針,Java Agent 是在 JDK1.5 引入的,是一種可以動態(tài)修改 Java 字節(jié)碼的技術(shù)。Java 類編譯之后形成字節(jié)碼被 JVM 執(zhí)行,在 JVM 在執(zhí)行這些字節(jié)碼之前獲取這些字節(jié)碼信息,并且通過字節(jié)碼轉(zhuǎn)換器對這些字節(jié)碼進行修改,來完成一些額外的功能,這種就是 Java Agent 技術(shù)。

從用戶使用層面來看,Java Agent 一般通過在應(yīng)用啟動參數(shù)中添加 -javaagent 參數(shù)添加 ClassFileTransformer 字節(jié)碼轉(zhuǎn)換器。 在 Java 虛擬機啟動時,執(zhí) 行main() 函數(shù)之前,Java 虛擬機會先找到 -javaagent 命令指定 jar 包,然后執(zhí)行 premain-class 中的 premain() 方法。用一句概括其功能的話就是:main() 函數(shù)之前的一個攔截器。

二、Java Agent 可以實現(xiàn)什么樣的功能?

從上面提到的字節(jié)碼轉(zhuǎn)換器的兩種執(zhí)行方式來看可以實現(xiàn)如下功能:

因此,通過以上兩點即可實現(xiàn)在一些框架或是技術(shù)的采集點進行字節(jié)碼修改,對應(yīng)用進行監(jiān)控(比如通過JVM CPU Profiler 從CPU、Memory、Thread、Classes、GC等多個方面對程序進行動態(tài)分析),或是對執(zhí)行指定方法或接口時做一些額外操作,比如打印日志、打印方法執(zhí)行時間、采集方法的入?yún)⒑徒Y(jié)果等;

基于前面對 Java Agent 大致機制的描述,我們不難猜到,能夠干預(yù) Java JVM 虛擬機的運行,那么就可以解決不限于如下的問題:

另外來看看 Github 上有哪些開源工具、項目使用到了 Agent 技術(shù):

三、Java Agent 的實現(xiàn)原理?

從 JVM 類加載流程來看,字節(jié)碼轉(zhuǎn)換器的執(zhí)行方式有兩種:一種是在 main 方法執(zhí)行之前,通過 premain 來實現(xiàn),另一種是在程序運行中,通過 Attach Api 來實現(xiàn)。

對于 JVM 內(nèi)部的 Attach 實現(xiàn),是通過 tools.jar 這個包中的 com.sun.tools.attach.VirtualMachine 以及 VirtualMachine.attach(pid) 這種方式來實現(xiàn)的。底層則是通過 JVMTI 在運行前或者運行時,將自定義的 Agent 加載并和 VM 進行通信。

了解 Java Agent 的實現(xiàn)原理就必須先了解 Java 的類加載機制(這里不做過多介紹),這個是了解 Java Agent 的前提。

JVM 在類加載時觸發(fā) JVMTI_EVENT_CLASS_FILE_LOAD_HOOK 事件調(diào)用添加的字節(jié)碼轉(zhuǎn)換器完成字節(jié)碼轉(zhuǎn)換,該過程時序如下:

Java Agent 所使用的 Instrumentation 依賴 JVMTI 實現(xiàn),當(dāng)然也可以繞過 Instrumentation 直接使用 JVMTI 實現(xiàn) Agent。因此,JVMTI 與 JDI 組成了 Java 平臺調(diào)試體系(JPDA)的主要能力。

如果想要深入了解 Java Agent,就得需要了解 JVMTI 以及 JVMTIAgent,下面分別介紹下:

JVMTI

JVMTI 是JVM Tool Interface 的縮寫,是 JVM 暴露出來給用戶擴展使用的接口集合,JVMTI 是基于事件驅(qū)動的,JVM每執(zhí)行一定的邏輯就會調(diào)用一些事件的回調(diào)接口,這些接口可以給用戶自行擴展來實現(xiàn)自己的邏輯。JVMTI是實現(xiàn) Debugger、Profiler、Monitor、Thread Analyser 等工具的統(tǒng)一基礎(chǔ),在主流 Java 虛擬機中都有實現(xiàn)。

JVMTIAgent

JVMTI 并不一定在所有的 Java 虛擬機上都有實現(xiàn),不同的虛擬機的實現(xiàn)也不盡相同。不過在一些主流的虛擬機中,比如 Sun 和 IBM,以及一些開源的如 Apache Harmony DRLVM 中,都提供了標(biāo)準(zhǔn) JVMTI 實現(xiàn)。

JVMTI 是一套本地代碼接口,因此使用 JVMTI 需要我們與 C/C++ 以及 JNI 打交道。事實上,開發(fā)時一般采用建立一個 Agent 的方式來使用 JVMTI,它使用 JVMTI 函數(shù),設(shè)置一些回調(diào)函數(shù),并從 Java 虛擬機中得到當(dāng)前的運行態(tài)信息,并作出自己的判斷,最后還可能操作虛擬機的運行態(tài)。把 Agent 編譯成一個動態(tài)鏈接庫之后,我們就可以在 Java 程序啟動的時候來加載它(啟動加載模式),也可以在 Java 5 之后使用運行時加載(活動加載模式)。

-agentlib:agent-lib-name=options-agentpath:path-to-agent=optionsJVMTIAgent主要有三個方法,

Instrument Agent

說到 javaagent,必須要講的是一個叫做 instrument 的 JVMTIAgent(Linux下對應(yīng)的動態(tài)庫是 libinstrument.so) instrument agent 實現(xiàn)了上面 Agent_OnLoad 方法和 Agent_OnAttach 方法,也就是即能在啟動的時候加載 agent,也可以在運行期來加動態(tài)加載 agent,運行期動態(tài)加載 agent 依賴 JVM 的 attach 機制實現(xiàn),通過發(fā)送 load 命令來加載 agent

那么什么是 JVM Attach 機制?

JVM Attach 機制

Jvm attach 機制是指 JVM 提供的一種 JVM 進程間通信的功能,能讓一個進程傳命令給另一個進程,并進行一些內(nèi)部的操作,比如進行線程 dump,那么就需要執(zhí)行 jstack 進行,然后把 pid 等參數(shù)傳遞給需要 dump 的線程來執(zhí)行,這就是一種 java attach。

四、可以實現(xiàn) Java Agent 的技術(shù)框架有哪些?

原理了解清楚了就需要實現(xiàn),Java Agent 從實現(xiàn)上來看主要涉及到字節(jié)碼增強的過程,其到過程大概是:

  1. 修改字節(jié)碼
  1. 加載新的字節(jié)碼
  1. 替換舊的字節(jié)碼
通過上面對 Java Agent 介紹之后,是不是發(fā)現(xiàn),我想要實現(xiàn)一個 Java Agent 還得去深入學(xué)習(xí)那么多東西嗎?

當(dāng)然不用,這里就介紹幾個常用的字節(jié)碼增強工具:



關(guān)鍵詞:科技

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉