標籤:分享圖片 輸出 利用 window src att 介紹 alt with
前言
在分析一個 jar 包時發現他把關鍵類採用了運行時使用 classloader 的方式載入了。懶得分析演算法了,可以使用 jdk 內建的工具 dump 出需要的class.
本文
從啟動並執行java進程裡dump出運行中的類的class檔案的方法,所知道的有兩種
本文介紹的就是使用 sd-jdi.jar 來dump. sd-jdi.jar裡內建的的 sun.jvm.hotspot.tools.jcore.ClassDump 可以把類的class內容dump到檔案裡。
ClassDump 裡可以設定兩個 System properties:
- sun.jvm.hotspot.tools.jcore.filter Filter的類名
- sun.jvm.hotspot.tools.jcore.outputDir 輸出的目錄
樣本
首先寫一個 filter 類
import sun.jvm.hotspot.tools.jcore.ClassFilter;import sun.jvm.hotspot.oops.InstanceKlass;import sun.jvm.hotspot.tools.jcore.ClassDump;public class MyFilter implements ClassFilter { @Override public boolean canInclude(InstanceKlass kls) { String klassName = kls.getName().asString(); return klassName.startsWith("com/fr/license/selector/"); }}
代碼很顯而易見了, 作用是 dump 所有 以 com/fr/license/selector/ 開頭的 類的· 位元組碼。
然後編譯成class檔案
要使用這個首先需要把 sa-jdi.jar 加到 java 的 classpath 裡。
進入 剛剛寫的 filter 類的class檔案的目錄下。執行
java -Dsun.jvm.hotspot.tools.jcore.filter=MyFilter -Dsun.jvm.hotspot.tools.jcore.outputDir=d:\dump sun.jvm.hotspot.tools.jcore.ClassDump 5308
把MyFilter 改為你自己的類名, 5308 為目標 java進程的 pid(可以使用 jps 查看)。然後就會在 d:\dump 產生相應的 class 檔案。
問題解決
如果直接點擊應用的 exe, 來啟動應用,使用 jps 擷取到的 pid, 可能沒有辦法附加, 所以我們要找到啟動的命令, 比如 bat指令碼裡面。
- 一般大型應用會內建 jre, 我們要使用上面的技術,替換 jre,為我們的,才能正常dump, 否則會出現版本不匹配。
windows下還需把 sawindbg.dll 放到 jre/bin/ 和java.exe 同目錄下。否則可能會遇到 載入不了這個 dll 的問題。
最後
搞java應用第一步還是找到啟動的命令,便於後面的分析。一般別使用 exe啟動應用
使用sa-jdi.jar dump 記憶體中的class