Java安全-類的動態加載

類的加載過程

先在方法區找class信息,有的話直接調用,沒有的話則使用類加載器加載到方法區(靜態成員放在靜態區,非靜態成功放在非靜態區),靜態代碼塊在類加載時自動執行代碼,非靜態的不執行;先父類后子類,先靜態后非靜態;靜態方法和非靜態方法都是被動調用,即不調用就不執行。

在這里插入圖片描述

public class LoadClassTest {public static void main(String[] args) {new Person();//靜態代碼塊//構造代碼塊//無參Personnew Person("a",22);//靜態代碼塊//構造代碼塊//有參PersonPerson.staticAction();//靜態代碼塊//靜態方法Person.id=1;//靜態代碼塊Class c=Person.class;//無結果動態加載Class.forName("Person");//靜態代碼塊ClassLoader cl =ClassLoader.getSystemClassLoader();Class.forName("com.example.fastjson122.demos.web.Person",true,cl);//初始化//靜態代碼塊ClassLoader cl =ClassLoader.getSystemClassLoader();Class.forName("com.example.fastjson122.demos.web.Person",false,cl);//不初始化//無結果c.newInstance();//靜態代碼塊//構造代碼塊//無參PersonClass<?>c=cl.loadClass("com.example.fastjson122.demos.web.Person");//不初始化的c.newInstance();//靜態代碼塊//構造代碼塊//無參Person        }
}

類加載機制
1、類加載與反序列化
類加載的時候會執行代碼
初始化:加載靜態代碼塊
實例化:加載構造代碼塊、無參構造函數
2、動態類加載方法
Class.forname
初始化/不初始化
ClassLoader.loadClass不進行初始化
底層的原理,實現加載任意的類
ClassLoader(父類)->SecureClassLoader->URLClassLoader->AppClassLoader(繼承關系)
(調用關系)loadClass->findClass(重寫的方法)->defineClass(從字節碼加載類)

public class LoadClassTest {public LoadClassTest() {}public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, MalformedURLException {ClassLoader cl =ClassLoader.getSystemClassLoader();URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{new URL("file:///C:\\JAVA\\")});URLClassLoader urlClassLoader=new URLClassLoader(new URL[]{new URL("http://localhost:8080/")});URLClassLoader urlClassLoader=new URLClassLoader(new URL[]{new URL("jar:http://localhost:8080/Test2.jar/")});   URLClassLoader urlClassLoader=new URLClassLoader(new URL[]{new URL("jar:file://D:\\tmp\\classes\\Test2.jar/")});Class<?> c = urlClassLoader.loadClass("Test2");c.newInstance();Method defineClassMethod = ClassLoader.class.getDeclaredMethod("defineClass",String.class,byte[].class,int.class,int.class);defineClassMethod.setAccessible(true);byte[] code= Files.readAllBytes(Paths.get("D:\\tmp\\classes\\Test2.class"));Class c=(Class) defineClassMethod.invoke(cl,"Test",code,0,code.length);c.newInstance();}
}

一下兩個類是反序列化中常用的兩個類都調用了defineClass
在這里插入圖片描述
漏洞利用
URLClassLoader 任意類加載:file/http/jar
ClassLoder.defineClass字節碼加載任意類 私有(好用,常用)
Unsafe.defineClass 字節碼加載 public 類不能直接生成 Spring里可以直接生成

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74221.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ROS多機通信功能包——Multibotnet

引言 這是之前看到一位大佬做的集群通信中間件&#xff0c;突發奇想&#xff0c;自己也來做一個&#xff0c;實現更多的功能、更清楚的架構和性能更加高效的ROS多機通信的功能包 鏈接&#xff1a;https://blog.csdn.net/benchuspx/article/details/128576723 Multibotnet Mu…

C++:背包問題習題

1. 貨幣系統 1371. 貨幣系統 - AcWing題庫 給定 V 種貨幣&#xff08;單位&#xff1a;元&#xff09;&#xff0c;每種貨幣使用的次數不限。 不同種類的貨幣&#xff0c;面值可能是相同的。 現在&#xff0c;要你用這 V 種貨幣湊出 N 元錢&#xff0c;請問共有多少種不同的…

IT工具 | node.js 進程管理工具 PM2 大升級!支持 Bun.js

P(rocess)M(anager)2 是一個 node.js 下的進程管理器&#xff0c;內置負載均衡&#xff0c;支持應用自動重啟&#xff0c;常用于生產環境運行 node.js 應用&#xff0c;非常好用&#x1f44d; &#x1f33c;概述 2025-03-15日&#xff0c;PM2發布最新版本v6.0.5&#xff0c;這…

2025年01月02日浙江鼎永前端面試

目錄 webpack 和 vite 區別react fiber 架構vue diff 算法react diff 算法hooks 源碼垂直水平布局項目介紹單點登錄大文件上傳微前端 1. webpack 和 vite 區別 Webpack 和 Vite 是兩種不同的前端構建工具&#xff0c;它們在設計理念、性能表現和使用場景上存在顯著差異。以下…

1.企業級AD活動目錄核心解析:架構、組件與集成實踐

在當今數字化時代&#xff0c;企業級網絡環境日益復雜&#xff0c;高效、安全的資源管理和用戶認證成為企業 IT 運營的關鍵。AD&#xff08;Active Directory&#xff09;活動目錄作為微軟 Windows 系列服務器中的重要目錄服務&#xff0c;為企業級網絡管理提供了強大的解決方案…

【數據分享】2014-2024年我國各城市逐年空氣質量指數(AQI)數據

空氣質量指數&#xff08;AQI&#xff09;是一個衡量空氣污染程度的綜合指標&#xff0c;它并不直接表示具體污染物的濃度值&#xff0c;而是基于多種污染物的濃度進行的綜合評價&#xff0c;具體基于六種主要污染物的濃度&#xff1a;PM2.5、PM10、SO?、NO?、O?和CO。AQI是…

【C++】深入理解list迭代器的設計與實現

深入理解list迭代器的設計與實現 引言1、鏈表基礎結構2、鏈表迭代器的封裝2.1 初步封裝迭代器類2.2 引入const迭代器2.2.1 參考STL源代碼2.2.2 完善迭代器 3、迭代器實現機制結語 引言 在STL容器中&#xff0c;list作為經典的雙向鏈表容器&#xff0c;其迭代器設計體現了C模板編…

C語言基礎系列【27】typedef

博主介紹&#xff1a;程序喵大人 35- 資深C/C/Rust/Android/iOS客戶端開發10年大廠工作經驗嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手《C20高級編程》《C23高級編程》等多本書籍著譯者更多原創精品文章&#xff0c;首發gzh&#xff0c;見文末&#x1f447;&#x1f…

【CXX-Qt】2.5 繼承

某些 Qt API 要求你從抽象基類中重寫某些方法&#xff0c;例如 QAbstractItemModel。 為了支持直接從 Rust 中創建這樣的子類&#xff0c;CXX-Qt 提供了多種輔助工具。 某些基類可能需要特殊的構造參數。這可以通過使用自定義構造函數來實現。 訪問基類方法 要在 Rust 中訪…

磁盤清理工具-TreeSize Free介紹

TreeSizeFree是一個磁盤空間管理工具&#xff0c;主要用于分析磁盤使用情況&#xff0c;幫助用戶找到占用空間大的文件和文件夾: 特點&#xff1a;按大小排序&#xff1a;快速找到占用空間最大的文件或文件夾 一般可以刪除: 掃描 C:\Users\XXX\AppData\Local\Temp 或 C:\Window…

OpenCV中距離公式

一、各類距離公式總結 常見距離公式 歐氏距離&#xff1a; 曼哈頓距離&#xff08;L1&#xff09;?&#xff1a; 切比雪夫距離&#xff08;Chessboard&#xff09;?&#xff1a; 1、點與點距離(歐氏距離) ?二維空間? 設兩點坐標為 P1(x1,y1)、P2(x2,y2)&#xff0c;其距離…

Vue.js 模板語法全解析:從基礎到實戰應用

引言 在 Vue.js 的開發體系中&#xff0c;模板語法是構建用戶界面的核心要素&#xff0c;它讓開發者能夠高效地將數據與 DOM 進行綁定&#xff0c;實現動態交互效果。通過對《Vue.js 快速入門實戰》中關于 Vue 項目部署章節&#xff08;實際圍繞 Vue 模板語法展開&#xff09;…

論文筆記(七十三)Gemini Robotics: Bringing AI into the Physical World

Gemini Robotics: Bringing AI into the Physical World 文章概括1. 引言2. Gemini 2.0的具身推理2.1. 具身推理問答&#xff08;ERQA&#xff09;基準測試2.2. Gemini 2.0的具身推理能力2.3. Gemini 2.0支持零樣本和少樣本機器人控制 3. 使用 Gemini Robotics 執行機器人動作3…

centos7搭建postgresql12主從

主從搭建 192.168.159.101 node1 主庫&#xff08;讀寫&#xff09; 192.168.159.102 node2 備庫&#xff08;只讀&#xff09; 兩臺機器首先安裝postgrsql 主庫 postgres用戶操作&#xff1a; 修改postgresql.conf # 在文件中修改(此配置僅用于遠程訪問, 流復制后續還有額外…

嵌入式基礎知識學習:SPI通信協議是什么?

SPI&#xff08;Serial Peripheral Interface&#xff09;是串行外設接口的縮寫&#xff0c;是一種廣泛應用于嵌入式系統的高速同步串行通信協議&#xff0c;由摩托羅拉公司于20世紀80年代提出。以下是其核心要點&#xff1a; 一、SPI的核心定義與特點 基本特性 全雙工同步通信…

996引擎-接口測試:背包

996引擎-接口測試:背包 背包測試NPC參考資料背包測試NPC CONSTANT = require("Envir/QuestDiary/constant/CONSTANT.lua"); MsgUtil = require("Envir/QuestDiary/utils/996/MsgUtil.lua");

vulnhub靶場之【hack-me-please靶機】

前言 靶機&#xff1a;billu_b0x2靶機&#xff0c;IP地址為192.168.10.8 攻擊&#xff1a;kali&#xff0c;IP地址為192.168.10.6 靶機和攻擊機都采用VMware虛擬機&#xff0c;都采用橋接網卡模式 文章涉及的靶機及工具&#xff0c;都可以自行訪問官網或者項目地址進行獲取&…

機器學習——KNN模型評價

一、主要函數 sklearn.metrics.accuracy_score() 是 scikit-learn 中用于計算分類模型準確率的函數&#xff0c;適用于評估分類任務的整體性能。 1、核心功能 作用&#xff1a;計算模型預測的準確率&#xff0c;即正確分類的樣本數占總樣本數的比例。公式&#xff1a;Accurac…

美國國家數據浮標中心(NDBC)

No.大劍師精品GIS教程推薦0地圖渲染基礎- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入門教程】 - 【源代碼示例 300】 2Leaflet 【入門教程】 - 【源代碼圖文示例 150】 3MapboxGL【入門教程】 - 【源代碼圖文示例150】 4Cesium 【入門教程】…

Qt調用Miniconda的python方法

1、 Win 64環境下載及安裝 Miniconda 首先下載Windows 版Miniconda&#xff0c;https://docs.conda.io/en/latest/miniconda.html或 https://repo.anaconda.com/miniconda/ 安裝界面及選擇如下圖所示&#xff1a; 安裝完python3.12版報錯如下。 說明&#xff1a;python3.11版…