日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、什么是 JAVA Agent ?

 

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

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

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

二、Java Agent 可以實現什么樣的功能?

 

從上面提到的字節碼轉換器的兩種執行方式來看可以實現如下功能:

  • Java Agent 能夠在加載 Java 字節碼之前進行攔截并對字節碼進行修改;
  • 在 Jvm 運行期間修改已經加載的字節碼;

 

因此,通過以上兩點即可實現在一些框架或是技術的采集點進行字節碼修改,對應用進行監控(比如通過 JVM CPU Profiler 從 CPU、Memory、Thread、Classes、GC 等多個方面對程序進行動態分析),或是對執行指定方法或接口時做一些額外操作,比如打印日志、打印方法執行時間、采集方法的入參和結果等;

 

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

 

  • 使用 JVMTI 對 class 文件加密:有時一些涉及到關鍵技術的 class 文件或者 jar 包我們不希望對外暴露,因而需要進行加密。使用一些常規的手段(例如使用混淆器或者自定義類加載器)來對 class 文件進行加密很容易被反編譯。反編譯后的代碼雖然增加了閱讀的難度,但花費一些功夫也是可以讀懂的。使用 JVMTI 我們可以將解密的代碼封裝成 .dll, 或 .so 文件。這些文件想要反編譯就很麻煩了,另外還能加殼。解密代碼不能被破解,從而也就保護了我們想要加密的 class 文件。
  • 使用 JVMTI 實現應用性能監控(APM)在微服務大行其道的環境下,分布式系統的邏輯結構變得越來越復雜。這給系統性能分析和問題定位帶來了非常大的挑戰?;?JVMTI 的 APM 能夠解決分布式架構和微服務帶來的監控和運維上的挑戰。APM 通過匯聚業務系統各處理環節的實時數據,分析業務系統各事務處理的交易路徑和處理時間,實現對應用的全鏈路性能監測。開源的 Skywalking、Pinpoint,、ZipKin、 Hawkular, 商業的 AppDynamics、OneAPM、google Dapper等都是個中好手。

 

另外來看看 Github 上有哪些開源工具和項目使用到了 Agent 技術:

 

  • 阿里巴巴開源的 Java 診斷工具—— Arthas,深受開發者喜愛。在線排查問題,無需重啟;動態跟蹤 Java 代碼;實時監控 JVM 狀態。
  • Apache Skywalking 的 Java Agent 則針對服務的調用鏈路、JVM 基礎監控信息進行采集。
  • Uber/jvm-profiler: 通過 Java Agent 采集 JVM CPU、Memory、IO 等指標并發送給 Kafka、Console 以及可以自定義的發送器。

三、Java Agent 的實現原理?

 

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

 

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

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

 

JVM 在類加載時觸發 JVMTI_EVENT_CLASS_FILE_LOAD_HOOK 事件調用添加的字節碼轉換器完成字節碼轉換,該過程時序如下:

 

破解 Java Agent 探針黑科技

 

 

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

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

JVMTI

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

JVMTIAgent

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

 

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

 

-agentlib:agent-lib-name=options

-agentpath:path-to-agent=options

 

JVMTIAgent主要有三個方法:

  • Agent_OnLoad 方法,如果 agent 在啟動時加載,就執行這個方法
  • Agent_OnAttach方法,如果agent不是在啟動的時候加載的,是我們先attach到目標線程上,然后對對應的目標進程發送load命令來加載agent,在加載過程中調用Agent_OnAttach函數
  • Agent_OnUnload 方法,在 agent 做卸載掉時候調用

Instrument Agent

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

那么什么是 JVM Attach 機制?

JVM Attach 機制

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

四、可以實現 Java Agent 的技術框架有哪些?

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

  • 修改字節碼
  • 加載新的字節碼
  • 替換舊的字節碼

 

通過上面對 Java Agent 介紹之后,是不是發現,我想要實現一個 Java Agent 還得去深入學習那么多東西嗎?

 

當然不用,這里就介紹幾個常用的字節碼增強工具:

  • ASM:對于需要手動操縱字節碼的需求,可以使用 ASM,它可以直接生成 .class 字節碼文件,也可以在類被加載入 JVM 之前動態修改類行為。
破解 Java Agent 探針黑科技

 

 

  • Javassist:ASM 是在指令層次上操作字節碼的,我們的直觀感受是在指令層次上操作字節碼的框架實現起來比較晦澀。故除此之外,再簡單介紹另外一類框架:強調源代碼層次操作字節碼的框架 Javassist。利用 Javassist 實現字節碼增強時,可以無須關注字節碼刻板的結構,其優點就在于編程簡單。直接使用 Java 編碼的形式,而不需要了解虛擬機指令,就能動態改變類的結構或者動態生成類。
  • Instrument:Instrument 是 JVM 提供的一個可以修改已加載類的類庫,專門為 Java 語言編寫的插樁服務提供支持。它需要依賴 JVMTI 的 Attach API 機制實現。
  • Byte Buddy:ByteBuddy 是一個開源 Java 庫,其主要功能是幫助用戶屏蔽字節碼操作,以及復雜的 InstrumentationAPI。ByteBuddy 提供了一套類型安全的API和注解,我們可以直接使用這些 API 和注解輕松實現復雜的字節碼操作。另外,Byte Buddy 提供了針對 Java Agent 的額外 API,幫助開發人員在 Java Agent 場景輕松增強已有代碼。

轉發+關注 私信我 回復頭條 666領取資料

分享到:
標簽:Java Agent
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定