CTF-Misc:binwalk與010Editor的使用
阿新 • • 發佈:2022-02-09
類載入過程
.class 通過 JVM 載入到方法區的過程依賴於JVM的類載入器。
類載入的過程:
.class 檔案的載入 -> 連結(驗證 -> 準備 -> 解析) -> 初始化
.class檔案的載入方式
- 通過本地class檔案載入
- 執行時生成的class檔案:動態代理
- 通過網路的class檔案載入
- 通過jar war壓縮包形式載入
- 通過加密檔案載入
- ...
連結 (驗證 準備 解析)
驗證:主要是驗證class檔案的合法性
準備:
- 給static 變數分配空間,並初始化預設值
- 給 final static 變數進行初始化,分配空間在編譯時就已經確定了?
解析:將常量池的符號引用轉換為直接引用的過程
初始化
初始化階段會執行 類構造器
類載入器的分類
類載入器分為引導類類載入器和自定義載入器(擴充套件類載入器,應用類載入器和使用者自定義載入器)
引導類載入器是C/C++寫的,用途:
- 載入java javax開頭的核心類
- 載入擴張類載入器,應用類載入器,並指定他們為父類為bootstrap classloader
擴充套件類載入器實用類載入jre/lib/ext包下的所有class
其餘的類基本都是由應用類載入器實現。
沙箱機制
java中class是按需載入的,用到時才會載入。
當一個class需要被載入時,收到類載入請求的類載入器會看自己是否有父類如果有則向上委託父類載入器去載入。如果父類載入器無法載入此類,再由自己載入。
這樣做的好處就是防止核心類被隨意篡改。
當一個攻擊者自定義了一個類java.lang.String時,系統類載入器會一步一步交給引導類載入器載入,引導類載入器會優先載入rt.jar包中的java.lang.String類。達到保護的目的。
補充
判斷兩個.class物件相等不相等有兩個關鍵因素
- 這個類的完整類名
- 載入這個類的classloader
換句話說就是同一份class檔案被兩個不同的類載入器載入了,那麼這兩個class物件也是不相等的