gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

實例詳解Java反序列化之反射機制

本篇文章給大家帶來了關于java的相關知識,其中主要介紹了java反射機制的相關問題,動態獲取程序信息以及動態調用對象的功能稱為Java語言的反射機制,希望對大家有幫助。

實例詳解Java反序列化之反射機制

推薦學習:《java教程》

每次聽到大佬在講或者看論壇等一些方式學java反序列化漏洞時,都會有一個詞叫做反射機制,大佬順勢借著這個詞,就給你造出一個payload,對于剛學java反序列化的我們,可能有點會懵圈,反正我是懵了,所以就趕緊學了一波,不然和大佬差距越來越大。所以這篇文章主要講述java反射機制

Java反射機制

Java的反射(reflection)機制是指在程序的運行狀態中,可以構造任意一個類的對象,可以了解任意一個對象所屬的類,可以了解任意一個類的成員變量和方法,可以調用任意一個對象的屬性和方法。這種動態獲取程序信息以及動態調用對象的功能稱為Java語言的反射機制。反射被視為動態語言的關鍵。

我不太擅長文字表達,還是上圖操作把

不用反射機制的例子

//定義一個animals接口interface animals {     public abstract void print();}//定義類來實現animals接口的抽象方法class Dog implements animals {     public void print() {         System.out.println("Dog");     }}class Cat implements animals {     public void print() {         System.out.println("Cat");     }}// 構造一個zoo類// 之后如果我們在添加其他的實例的時候只需要修改zoo類class zoo {      public static animals getInstance(String animalsName) {         animals a = null;         if ("Dog".equals(animalsName)) {             a = new Dog();         }         if ("Cat".equals(animalsName)) {             a = new Cat();         }         return a;     }}public class reflection {     public static void main(String[] args) {         //借助zoo類尋找對應的類來實現接口         animals a=zoo.getInstance("Cat");         if(a!=null)             a.print();     }}

這時候添加動物,只需要

  • 添加類
  • 修改zoo
  • 修改main函數的動物類

把上面修改為反射機制

//定義一個animals接口interface animals {     public abstract void print();}//定義類來實現animals接口的抽象方法class Dog implements animals {     public void print() {         System.out.println("Dog");     }}class Cat implements animals {     public void print() {         System.out.println("Cat");     }}// 構造一個zoo類// 之后如果我們在添加其他的實例的時候只需要修改zoo類class zoo {      public static animals getInstance(String className) {         animals a = null;         try {             //借助Class.forName尋找類名,并用newInstance實例化類似于new             a = (animals) Class.forName(className).newInstance();         } catch (Exception e) {             e.printStackTrace();         }         return a;     }}public class reflection {     public static void main(String[] args) {         //借助zoo類尋找對應的類來實現接口(classname為當前包名加類名)         animals a = zoo.getInstance("com.cc1.Dog");         if (a != null)             a.print();     }}

這時候添加動物只需要

  • 添加類
  • 修改main函數的動物類

省了一步,傳入類名可控,發現好像是存在的類都可以調

反射機制方法

我們用的最多的可能是

  • forName(調用類)
  • getMethod(調用類下方法)
  • invoke(執行)
  • newInstance(實例化對象)
Class.forName(className).getMethod(methodName).invoke(Class.forName(className).newInstance());

下面我們用反射機制來彈出計算機(calc)或者記事本(notepad)

由于彈出計算機有點多這次我就彈記事本把,總而言之,能彈出來就很美妙

Runtime.getRuntime().exec("notepad");

實例詳解Java反序列化之反射機制
我們看下getRuntime函數
實例詳解Java反序列化之反射機制
得知,該函數是Runtime類獲取對象的方式,個人感覺是每用一次就調一次比較麻煩,為了不調用一次建立一個對象所以封裝成了函數

類對象獲取方式

  • Class.forName(類名獲取)
  • zoo.class(已經加載過的類)
  • obj.class(實例)
    實例詳解Java反序列化之反射機制

類初始化

修改zoo類,增加初始塊、靜態初始塊、和構造函數

class zoo {     //初始塊     {         System.out.println("1  " + this.getClass());     }      //靜態初始塊     static {         System.out.println("2  " + zoo.class);     }      public zoo() {         System.out.println("3  " + this.getClass());     }      public static animals getInstance(String className) {         animals a = null;         try {             //借助Class.forName尋找類名,并用newInstance實例化類似于new             a = (animals) Class.forName(className).newInstance();         } catch (Exception e) {             e.printStackTrace();         }         return a;     }}

類初始化執行順序:靜態初始塊
實例詳解Java反序列化之反射機制
類實例化執行順序:靜態初始塊 – > 初始塊 – > 構造函數
實例詳解Java反序列化之反射機制
由此得知,類初始化和類實例化不一樣

接下來增加zoo1類繼承zoo類

class zoo1 extends zoo{     //初始塊     {         System.out.println("11  " + this.getClass());     }      //靜態初始塊     static {         System.out.println("12  " + zoo.class);     }      public zoo1() {         System.out.println("13  " + this.getClass());     }}

子類初始化順序:父類靜態初始化塊 – > 子類靜態初始化塊
實例詳解Java反序列化之反射機制
子類實例化順序:父類靜態初始化塊 – > 子類靜態初始化塊 – > 父類初始化塊 – > 父類構造函數 – > 子類初始化塊 – >子類構造函數
實例詳解Java反序列化之反射機制
以上可以得知,當使用Class.forName時,且類靜態初始化塊可控,可以執行任意代碼

調用內部類

Class.forName(“java.lang.Runtime”)來獲取類(java.lang.Runtime是Runtime類的完整路徑)

getMethod

getMethod 的作用是通過反射獲取類的某個特定的公有方法。
java支持類重載,但不能僅通過一個函數名確定一個函數,所以在調用getMethod時,需要傳給它方法的參數類型列表
Class.forName(“java.lang.Runtime”).getMethod(“exec”, String.class)

invoke

靜態和動態方法的區別
實例詳解Java反序列化之反射機制

invoke方法在getMethod類下,作用時傳遞參數,執行方法
public Object invoke(Object obj, Object… args)
第一個參數是getMethod獲取的方法的類對象(如果方法是靜態方法則傳類)
獲取exec函數的類對象
Class.forName(“java.lang.Runtime”).getMethod(“getRuntime”).invoke(Class.forName(“java.lang.Runtime”))
由于getRuntime是靜態方法,所以傳類
invoke(Class.forName(“java.lang.Runtime”).getMethod(“getRuntime”).invoke(Class.forName(“java.lang.Runtime”)),“calc.exe”)

最后我們合并一下

Class.forName("java.lang.Runtime").                 getMethod("exec", String.class).                 invoke(Class.forName("java.lang.Runtime").getMethod("getRuntime").invoke(Class.forName("java.lang.Runtime")), "notepad");

實例詳解Java反序列化之反射機制

指定構造方法生成實例

String str="notepad";ProcessBuilder pb = new ProcessBuilder(str);pb.start();

getConsturctor(函數可以選定指定接口格式的構造函數(由于構造函數也可以根據參數來進行重載)
選定后我們可以通過newInstance(),并傳入構造函數的參數執行構造函數

ProcessBuilder類有兩個構造函數

  • public ProcessBuilder(String… command)(String…變長的字符串數組String[].class)
  • public ProcessBuilder(List command)

分別使用構造方法

  • Class.forName(“java.lang.ProcessBuilder”).getConstructor(String[].class).newInstance(new String[][]{{“notepad”}})
  • Class.forName(“java.lang.ProcessBuilder”).getConstructor(List.class).newInstance(Arrays.asList(“notepad”))

執行完構造方法實例后,在進行強制轉化使用start函數即可

( (ProcessBuilder) Class.forName(“java.lang.ProcessBuilder”).getConstructor(List.class).newInstance(Arrays.asList(“notepad”))).start();

實際中,肯定用不了,哪有這么好的事,還是接著反射把

Class.forName(“java.lang.ProcessBuilder”).getMethod(“start”).invoke(clazz.getConstructor(List.class).newInstance(Arrays.asList(“notepad”)));
實例詳解Java反序列化之反射機制
這里可能有人會好奇我寫的里那的另一個構造函數,String…command這個傳參為什么用new String[][]{{“notepad”}},不應該是new String[]{“notepad”},現在用應該的

((ProcessBuilder) Class.forName(“java.lang.ProcessBuilder”).getConstructor(String[].class).newInstance(new String[]{“notepad”})).start();

在這行打斷點調試
實例詳解Java反序列化之反射機制
我們傳的是一個字符串數組到了實例化的時候變成了一個字符串,再看看另一個構造函數(List)

( (ProcessBuilder) Class.forName(“java.lang.ProcessBuilder”).getConstructor(List.class).newInstance(Arrays.asList(“notepad”))).start();

依舊還是這行打斷點

實例詳解Java反序列化之反射機制
由此可知,List傳入時會被當作Object的第一項,而String[]會被當做Object,所以多加一層[]{}

執行私有方法

通過函數getDeclaredConstructor獲取私有方法,再利用setAccessible(true)打破私有方法限制

Class cls = Class.forName("java.lang.Runtime");  Constructor m = cls.getDeclaredConstructor();  m.setAccessible(true);   cls.getMethod("exec", String.class).invoke(m.newInstance(), "notepad");

推薦學習:《java視頻教程》

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产av第一区| 污污的视频免费观看| 国产成人免费高清视频| 视频免费1区二区三区| 超碰网在线观看| 韩国日本在线视频| 免费国产成人av| 中文字幕永久有效| 五月六月丁香婷婷| 精品一区二区成人免费视频 | 亚洲 欧美 日韩系列| 亚洲午夜无码av毛片久久| 69堂免费视频| 一本久道中文无码字幕av| 成人免费视频久久| 午夜啪啪小视频| 超碰10000| 欧美精品色婷婷五月综合| 日本中文字幕片| 在线观看国产一级片| 天天看片天天操| 91成人综合网| 手机在线看福利| 亚洲av综合色区| 99热成人精品热久久66| 中文字幕在线综合| 一卡二卡三卡视频| www.色就是色| 久久手机在线视频| 少妇一级淫免费放| 免费人成自慰网站| 91视频这里只有精品| 国产成人艳妇aa视频在线 | 亚洲 中文字幕 日韩 无码| 性欧美在线视频| 国产日韩一区二区在线| 在线播放av中文字幕| 欧美在线观看成人| 精品一区二区成人免费视频 | 大桥未久一区二区| 日本久久久精品视频| 国产av不卡一区二区| 日韩精品免费播放| 欧美亚洲日本一区二区三区| 欧美日韩理论片| 成年人在线看片| 黄页免费在线观看视频| 无码毛片aaa在线| 日韩在线不卡一区| 天天影视综合色| 国产精品亚洲αv天堂无码| 成人在线免费高清视频| 亚洲欧美自拍另类日韩| 91看片就是不一样| 国产 日韩 亚洲 欧美| 香蕉精品视频在线| av在线免费看片| 色91精品久久久久久久久| 99视频免费播放| 国产l精品国产亚洲区久久| 草草视频在线免费观看| 成人短视频在线观看免费| www.日本久久| 中文字幕乱码免费| 97在线免费视频观看| 精品一区二区成人免费视频| www.污网站| 奇米777在线视频| 日本在线视频www色| 国产欧美激情视频| 手机在线视频你懂的| 粉嫩av一区二区三区天美传媒 | 国产精品亚洲a| 无码人妻精品一区二区三区66| 国产肥臀一区二区福利视频| 一二三四视频社区在线| 日本成年人网址| 中日韩av在线播放| 男插女免费视频| 日韩精品在线观看av| 青青青免费在线| 日av中文字幕| av污在线观看| www.国产亚洲| 岳毛多又紧做起爽| 九一精品久久久| 国产美女主播在线播放| 激情六月丁香婷婷| 污视频在线观看免费网站| 欧美日韩一级在线| 国产精品秘入口18禁麻豆免会员| 韩国视频一区二区三区| 午夜啪啪福利视频| 国内外成人激情视频| 国产精品探花在线播放| 99久久国产综合精品五月天喷水| 成人精品视频一区二区| 色乱码一区二区三区熟女| 激情五月开心婷婷| 9999在线观看| 欧美视频免费播放| 99热这里只有精品免费| 欧美两根一起进3p做受视频| 在线观看成人免费| 国产精品视频黄色| 欧美 国产 综合| 看一级黄色录像| 一区二区免费av| 久久9精品区-无套内射无码| 26uuu成人| 亚洲xxxx2d动漫1| a在线视频观看| 久久免费一级片| 91 视频免费观看| 污版视频在线观看| 虎白女粉嫩尤物福利视频| 国产一级黄色录像片| 色天使在线观看| 亚洲性生活网站| 凹凸日日摸日日碰夜夜爽1| 欧美中文字幕在线观看视频| 网站在线你懂的| 爱情岛论坛亚洲首页入口章节| 国产二级片在线观看| 欧美日韩dvd| 成人免费网站入口| 少妇久久久久久被弄到高潮| 超碰中文字幕在线观看| 51自拍视频在线观看| 亚洲精品性视频| 亚洲自拍第三页| 99中文字幕在线| 免费成人深夜夜行网站视频| 激情在线观看视频| 超碰免费在线公开| 潘金莲一级淫片aaaaa免费看| 久久久九九九热| 午夜久久久久久久久久久| 亚洲精品在线视频播放| 中国女人做爰视频| 人妻少妇精品无码专区二区| 久久综合九色综合88i| 91九色在线观看视频| 日韩网址在线观看| 91制片厂毛片| 日日夜夜精品视频免费观看| 黄色一级视频播放| 久久久久免费看黄a片app| 久久久久久久久久久久久国产精品| 无码日韩人妻精品久久蜜桃| 伊人国产精品视频| 大胆欧美熟妇xx| 国产a级一级片| www.com久久久| 精品人妻大屁股白浆无码| 黄色片一级视频| 老司机av福利| 欧美少妇性生活视频| 日本黄色播放器| 男人靠女人免费视频网站| 欧美wwwwwww| 久艹在线免费观看| 污污网站免费看| 97视频在线免费| 91亚洲精品久久久蜜桃借种| 国产肉体ⅹxxx137大胆| 欧美黄色性生活| 日本少妇高潮喷水视频| 亚洲一区精品视频在线观看| 人人妻人人澡人人爽欧美一区双| 一区二区三区免费播放| 800av在线免费观看| 日本美女视频一区| 少妇高清精品毛片在线视频| 成年人免费观看的视频| 在线观看免费黄网站| av免费看网址| 欧洲xxxxx| 777一区二区| 91视频免费版污| 欧美一级片免费播放| 亚洲第一综合网站| 又色又爽又黄视频| 狠狠躁狠狠躁视频专区| 日日碰狠狠躁久久躁婷婷| 亚洲人成无码网站久久99热国产| 国产又爽又黄ai换脸| 一女二男3p波多野结衣| 免费日韩中文字幕| 日韩免费高清在线| 六月丁香婷婷激情| 少妇高清精品毛片在线视频| av片在线免费| 狠狠干 狠狠操| 欧美二区在线视频| 国产午夜福利100集发布| 日韩国产一级片| 69堂免费视频| 在线观看av日韩| 鲁一鲁一鲁一鲁一av|