999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Java Reflection自動逆向生成類間方法關系圖的解析器

2016-11-09 01:07:27朱雄泳陳慧妍
廣東第二師范學院學報 2016年5期
關鍵詞:故障分析方法

薛 亮, 朱雄泳, 陳慧妍

(1.廣東第二師范學院 實訓中心, 廣東 廣州 510303; 2.廣東第二師范學院 計算機科學系,廣東 廣州 510303; 3.中山大學 傳播與設計學院, 廣東 廣州 510006)

?

基于Java Reflection自動逆向生成類間方法關系圖的解析器

薛亮1, 朱雄泳2, 陳慧妍3

(1.廣東第二師范學院 實訓中心, 廣東 廣州 510303; 2.廣東第二師范學院 計算機科學系,廣東 廣州 510303; 3.中山大學 傳播與設計學院, 廣東 廣州 510006)

在大型系統中,一旦發生軟件錯誤,系統會出現異常甚至故障. 而檢查錯誤產生的位置、來源,需要耗費較多的人力物力.如能預先分析出軟件中類方法之間的相互關系,建立一個關系圖,可以幫助人們判斷、分析、定位故障產生的來源,及時采取應對措施,避免發生更嚴重的故障. 本文探討了如何使用Java Reflection(反射)的編程方法,設計一個能逆向分析Java源程序或編譯后的.class文件的解析器,得到類結構和信息,通過導入測試樣例Java文件,分析出類方法之間的關系,并將結果存儲到特定格式的數組中. 利用該數組創建一個類方法的關系圖,能進一步擴展為軟件錯誤傳遞圖,為分析軟件故障提供一個直觀的依據.

Java;Java Reflection;類;類方法關系;逆向分析

0 引言

在一個用Java語言開發的大型軟件系統中,一旦發生軟件的錯誤,往往會導致整個系統產生故障.只有找到故障發生的真正原因,才能從根本上排除故障.定位大型系統中的故障來源,需要耗費較多的時間和人力.如果能為系統建立起一個軟件錯誤傳遞圖,輔助分析和定位故障的來源,就能幫助操作員、系統分析員快速定位故障的來源,找到解決故障的辦法[1-2].

Java作為一門面向對象的語言,其程序由類、類成員、方法和方法的參數等構成.類方法之間存在互相依賴、互相調用的關系.建立起一個類方法關系圖,并將其擴展成為軟件的錯誤傳遞圖,如果故障發生在軟件的某個模塊或類方法中,在傳遞圖上就會顯示故障的位置,結合一定的算法,就能找出故障產生的來源.建立類方法的關系圖,還需要分析出類方法的名稱、包含的參數、返回類型及方法之間的關系.

1 逆向分析Java文件的現狀與實踐

在有源代碼的情況下,要分析出類方法之間的關系,前提就是去閱讀和理解源代碼.現實中往往因商業機密得不到源代碼,比如只有Java類文件(.class的擴展名).這類文件經編譯器編譯過,用戶看不到源代碼,只能看到字節碼(byte code),即二進制代碼,難以理解,無從下手,必須另尋途徑.

有一種辦法是通過逆向分析Java文件,得到類結構和信息,人們在這方面做過不少有益的嘗試.比如說有一種方法是在一個類中,通過識別類方法的行號,來找出該類及其方法[3].這種方法需要逐行讀取程序.

還有一種是利用Javassist(Java Programming Assistant)工具來打開Java類文件,得到類包含的方法、構造函數等.Javassist是一個Java字節代碼類庫,允許編輯Java字節代碼,使Java程序在運行時能定義一個新類,當JVM(Java虛擬機)載入類文件時可以修改這個類文件.它提供了兩種類型的API供調用,一種是源代碼API,另外一種是字節碼API.利用源代碼API,無需懂得Java字節碼,就可編輯一個類文件,且源代碼API也是用Java語言來設計的,支持在源代碼窗口中插入字節碼,再經Javaassit在運行時編譯.字節碼API則允許用戶像使用其他編輯器一樣,來編輯一個類文件[4].這種方法通過打開類文件,從字節碼得出類方法,還可以編輯這個文件.

圖1 實現思路

類方法的定義語句和調用語句格式不同,類方法還存在有重載現象,需要區分出名字相同,但參數不同的方法.Java Reflection是Java自帶的類,允許使用一個類或對象,去分析另一個Java源程序或者.class文件,從而得到該程序或文件所包含的類名稱、方法和方法的參數,最終可得到整個類結構.Java Reflection提供了許多詳細的工具集來操作Java代碼,能提供Visual Basic用戶熟悉的那些工具.新的類可以在設計和運行時被加入,使用快速開發工具還可以動態查詢新增加類的容量[5]. Java Reflection的API(Application Program Interface)存在于Java.lang.reflect類內.譬如,調用java.lang.reflect.Field,java.lang.reflect.Method,java.lang.reflect.Constructor[6],就能得到類成員、方法和構造函數.本文探討了如何使用Java Reflection設計逆向解析Java源程序或者.class 文件的解析器,實現思路可分為以下三方面,如圖1所示:

1) 使用Java Reflection創建一個解析器程序,具備識別和分析Java源程序或者類(class)文件的功能,能搜索到類的構造函數、類方法名稱和定義、類方法的返回類型和作用范圍.

2) 導入一個Java樣例程序文件,分析文件的類結構.

3) 對搜索到的類及類方法信息,予以整理,并以特定格式的動態數組保存,為分析類方法之間的關系和生成類關系圖奠定基礎.

2 用Java Reflection逆向分析Java程序文件的具體步驟

Java Reflection存在于Java.lang.reflect類中,導入了這個類后,才能調用其中的代碼,步驟如圖2所示:

圖2 逆向分析Java程序文件的具體步驟

2.1獲取類名稱

分析一個Java文件(以.java或者.class為擴展名),先要分析該文件包含了哪些類.通過調用方法“Class.forName”可以得到.java或者.class文件中包含的類名稱[7],如以下代碼所示:

/* CVSClass.java */

System.out.println("尋找類" + className);

this.className=className;

2.2獲取類方法

當找出Java文件中的類之后,調用getMethod( )可以得到類中全部的公有(public)方法,以及繼承(inherited)方法.如果調用getDeclaredMethods( ),可以得到類中已聲明的公有和非公有方法,但不能得到從superclasses繼承來的方法.代碼中methodSet使用了HashSet(哈希集合),methodList存儲類型使用了ArrayList(數組類型)來存儲類方法信息,目的是為了對比兩種不同存儲類型的存取速度,在實際應用中只要選擇一個即可.以下是如何得到類中已聲明方法的部分代碼:

/* CVSClass.java */

Method methods=cls.getDeclaredMethods(); //得到所有已聲明的方法

cvsMethodArray=new CVSMethod[methods.length]; // 初始化數組

/* 找到的類方法名存放在methodSet和methodList中 */

if (methods != null) { for (int i=0; i < methods.length; i++) {

cvsMethodArray[i]=new CVSMethod(methods[i],className);

methodSet.add(new CVSMethod(methods[i],className));

methodList.add(new CVSMethod(methods[i],className)); }

2.3獲取構造函數

為得到類中的構造函數,調用getDeclaredConstructors() 方法可以得到構造函數的名字.面向對象編程中,構造函數有時可以被重載(Overloading),因此一個類可以包含不止一個構造函數.如以下代碼所示:

/* CVSClass.java */

//創建數組來存儲構造函數的名字

Constructor[] constructors=cls.getDeclaredConstructors();

cvsConstructorArray=new CVSConstructor[constructors.length];

if (constructors != null) { for (int i=0; i < constructors.length; i++) {

/*給constructorSet 和cvsConstructorArray數組添加搜尋到的構造函數名稱 */

constructorSet.add (new CVSConstructor(constructors[i]));

cvsConstructorArray[i]=new CVSConstructor(constructors[i]); }

2.4獲取類方法的返回類型

在Java中除了構造函數之外,每個類方法均有一個返回類型.返回類型可以是空值、整數型、字符串型、雙精度型等.調用method.getReturnType().getName() 可以得到類方法返回類型的名稱,如以下所示:

/* CVSMethod.java */

this.refMethod=refMethod;

this.cvsMethodName=refMethod.getName(); //得到類名稱

this.cvsMethodReturnType=refMethod.getReturnType().getName(); //得到返回類型

this.className=className;

2.5獲取類方法的參數

一個類方法通常帶有一個或多個參數的聲明.面向對象編程中,類方法允許被重載,即多個類方法可以有相同名字,但返回參數可以不一樣.逆向分析時,需要知道類方法的名字、參數名稱和數量,才能區別出哪些是重載的方法.讀取類方法的參數部分代碼如下:

/* CVSMethod.java */

public CVSMethod(Method refMethod,String className) {

/* 創建methodParameterClasses類數據來存放參數的類型 */

Class[] methodParameterClasses=refMethod.getParameterTypes();

/* 把類方法的參數存儲進數組 */

for(int i=0;i

cvsMethodParameterSet.add(CVSUtil.toShortName(methodParameterClasses[i].getName())); methodParameters.append(CVSUtil.toShortName(methodParameterClasses[i].getName())); }

}

/* MethInfo.java

/* MethodInfo類用于存取類方法的名稱、類型、起止行信息 */

this.shortMethodName=CVSUtil.getShortMethodInfoName(methodName);/* 類方法名字 */

this.methodNameArgu=CVSUtil.getMethodNameArgu(methodName); /*類方法參數聲明*/

2.6在類方法內讀取括號類型、所在行號,識別方法的定義行和作用域

Java類方法的定義語句,由一對小括號“(”和“)”表示開始和結束.用一對花括號”{”和“}”表示一個類或方法的作用域開始和結束.通過識別這些成對括號的開始和結束的行號,就能知道哪些語句屬于類方法的定義語句,哪些語句屬于作用域語句,以及哪些語句才是類方法的內容.Bracket類定義了存儲括號類型和行號,CVSUtil類識別類方法定義和作用域,部分代碼如下所示:

/* Bracket.java */

this.bracketType=bracketType; //存放括號類型

this.lineNumber=lineNumber; //存放行號 }

public String getBracketType() { return bracketType; } //返回括號類型

public int getLineNumber() { return lineNumber; } //返回行號

/*CVSUtil.java */

/*判斷是否含類方法定義和作用域語句 */

{ //探測讀入的語句是否存在“(”,“)”,“{”,“}”,以及表示方法語句結束的符號“;”

if ((containMethodLines.indexOf(cvsMethod.toPartString()) != -1)

&& (containMethodLines.indexOf("(") != -1) && (containMethodLines.indexOf(")") != -1)

&& ((containMethodLines.indexOf("{") != -1) || (containMethodLines.indexOf(";") != -1)))......}

2.7尋找注釋語句

注釋語句在程序運行時不會被編譯,Java語言用兩種注釋符號,一種是以“//”開始,另一種是“/*”和“*/”來表示注釋的部分.在逆向分析時,必須識別出這些注釋語句,并將其忽略掉.在Bracket.java代碼中,isCommentBracket方法使用字符串函數IndexOf來搜索注釋符號“//”,如下:

readLineString.indexOf("http://"); //在字符串中尋找”//”符號

2.8搜索類方法之間的關系

在類中的一個方法內,往往需要調用其他的方法.類方法之間存在著相互調用和依賴的關系.在搜索一個類方法內的語句時,解析器并不知道具體在哪行代碼調用其他方法,所以需要讀取類方法內的每一行代碼,保證調用其他方法的語句不會被遺漏.在SechDep.java中,readline方法用于讀取行并找出方法之間的關系.MethArr數組儲存了類中所有聲明的方法.代碼請參照SechDep.Java文件.

2.9保存搜索到的類方法信息到數組

當類方法的名稱、返回類型、參數、參數的數量以及類方法之間的關系被識別出來后,這些信息就可以儲存在一定格式的數組中.在SechDep.java的readline方法中,定義了一個名為finalResult的數組存放這些信息.代碼請參照SechDep.Java文件.

3 導入樣例文件進行測試

導入一個樣例文件SafeExp.java,然后運行逆向分析解析器程序,搜索到類方法信息并存儲到數組中.類方法數組存儲的信息如表1所示.

表1 搜索到SafeExp.java中所包含類方法的信息的存儲數組

在存儲完類方法數組后,將存儲類方法之間相互調用的關系,用另一個名為“finalResult”的數組來存放,存儲信息如表2所示.

表2 SafeExp.java中類方法之間的關系存儲在finalResult數組

利用類方法和方法之間關系的數組,使用Java 圖形編程,可生成類方法關系圖,如圖3中由節點和有向邊構成的圖形.

4 結語

對于Java源程序或者.class文件,使用Java Reflection設計逆向分析解析器程序,獲得類的名稱、方法名、方法參數、構造函數等信息,并搜索出每個類方法與其他方法之間的關系.然后,將這些信息用特定格式的數組存儲起來.該數組存儲的信息就可作為生成類方法關系圖所用.

類方法關系圖可進一步擴展成為軟件錯誤傳遞圖,供操作員或系統分析員監測軟件運行的狀況, 幫助他們在故障發生時,分析和確定故障產生的來源,及時采取相應措施.目前,對于大型的軟件系統,逆向分析類方法之間的關系還存在一定的困難,需要更多地研究、實踐和改進解析器程序.比如,當系統的文件內部結構(邏輯結構)非常復雜,存在各種不同類型的類(子類、抽象類、內部類等等)時,類方法之間互相調用的關系更加錯綜復雜,分析工作更為艱巨.文中使用JavaReflection進行逆向分析的解析器源代碼,限于篇幅無法詳盡列出,完整的代碼可通過訪問網盤鏈接“http://pan.baidu.com/s/1c1H7Ksg”下載.源代碼在JDK1.6和NetBeans中調試通過.

main(1)SafeExp(1)fun_B(1)fun_C(1)fun_D(1)fun_A(1)fun_E(1) 圖3 分析SafeExp.java后生成的類 方法關系圖

[1] 薛亮,建立和分析安全關鍵系統的錯誤傳遞圖[J],現代計算機,2011(10):21-29.

[2] 薛亮,優化安全關鍵系統中警報器放置[J],信息技術與安全,2012(9):100-105.

[3] 佚名.定位Java類中的每個方法在類文件中的位置(終結篇),[EB/OL].(2007-08-15).[2016-02-03].http://xmp123.blogjava.net.

[4] Javassist,Java bytecode engineering toolkit[EB/OL].(2016-01-05).[2016-02-03].http://www.csg.is.titech.ac.jp/~chiba/javassist.

[5] HORTSMANN C S,CORNELL G. Core Java[M].California,Pearson Education,2008:217-225.

[6] NIEMEYER P,KNUDSEN J Learning Java [M].Fourth Edition,O’Reilly media,2014:209-216.

[7] Classes of the reflection API in Java tutorials[EB/OL].(2015-06-15).[2016-2-3].http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html.

A Parser Using Java Reflection to Reversely Analyse the Dependency of Java Class Methods and Create Dependency Graph

XUE Liang1, ZHU Xiong-yong2, CHEN Hui-yan3

(1. Training Center, Guangdong University of Education, Guangzhou, Guangdong, 510303, P.R.China; 2. Department of Computer Science, Guangdong University of Education, Guangzhou, Guangdong, 510303, P.R.China; 3. School of Communication and Design, Sun Yat-sen University, Guangzhou, Guangdong, 510006, P.R.China)

In order to obtain the dependency automatically between Java class methods, one of the possible solutions is doing analysis on Java compiled class file or source code to find out the relationship between class methods. This paper proposes a programming approach using the Java Reflection package to reversely analyse Java class files or source code, figuring out the dependencies between class methods. Then store method name, method arguments and its dependency into a specific defined format array. With the array, a dependencies diagram of class methods can be generated. Eventually it is feasible to extend the diagram into a software fault propagation graph, in terms of providing an intuitive analytical basis for system analysts or operators.

Java; Java reflection; Java class method; method dependency; reverse analysis

2016-02-24

廣東省科技計劃項目(2013A011403002,2014A010103040);廣州市科技計劃項目(201510010203)

薛亮,男,廣東臺山人,廣東第二師范學院實訓中心工程師.

TP311.1

A

2095-3798(2016)05-0092-06

猜你喜歡
故障分析方法
隱蔽失效適航要求符合性驗證分析
故障一點通
電力系統不平衡分析
電子制作(2018年18期)2018-11-14 01:48:24
電力系統及其自動化發展趨勢分析
奔馳R320車ABS、ESP故障燈異常點亮
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
捕魚
故障一點通
江淮車故障3例
主站蜘蛛池模板: 57pao国产成视频免费播放| 国产精品一线天| 99久久亚洲综合精品TS| 九九热视频精品在线| 丁香婷婷久久| 国产精品va| 97青草最新免费精品视频| 日韩一区二区三免费高清| 国产黄在线免费观看| 国产精品免费电影| 欧美高清国产| 国产第一色| 亚洲精品大秀视频| av一区二区人妻无码| 国产极品美女在线观看| 一级在线毛片| 亚洲一级毛片在线观播放| 国产成人久久综合777777麻豆| 国产日韩欧美在线播放| 国产一级二级在线观看| 夜精品a一区二区三区| 国产丝袜第一页| 午夜精品一区二区蜜桃| 成色7777精品在线| 国产一级毛片yw| 久久久久亚洲AV成人人电影软件| 亚洲成人免费看| 日韩不卡免费视频| 极品av一区二区| 黄色a一级视频| 99精品国产高清一区二区| 亚洲国产成人自拍| 午夜日b视频| 3344在线观看无码| 白浆免费视频国产精品视频| 亚洲一欧洲中文字幕在线 | 久久久久国产精品熟女影院| 99热免费在线| 精品少妇人妻一区二区| 亚洲91在线精品| 亚洲综合香蕉| 日本免费精品| 无码乱人伦一区二区亚洲一| 91国内在线观看| 国产丝袜一区二区三区视频免下载| 国产精欧美一区二区三区| 国产福利影院在线观看| 国产鲁鲁视频在线观看| 久久成人18免费| 91人妻在线视频| 天天综合网站| 久久99国产精品成人欧美| 高清不卡毛片| 欧美激情视频二区| 成人在线亚洲| 澳门av无码| 一区二区午夜| 国产精品成人久久| 亚洲黄网视频| a在线亚洲男人的天堂试看| 国产主播在线一区| 国产在线精品网址你懂的 | 一本大道无码高清| a毛片基地免费大全| 一级全黄毛片| 亚洲av无码人妻| 亚洲AV一二三区无码AV蜜桃| 色综合中文| 玖玖精品视频在线观看| 国产人成乱码视频免费观看| 久久久精品久久久久三级| 成人中文字幕在线| 国内自拍久第一页| 欧美亚洲国产精品久久蜜芽| 欧美在线视频a| 国产成人无码综合亚洲日韩不卡| 五月天婷婷网亚洲综合在线| 亚洲欧美另类久久久精品播放的| av天堂最新版在线| 美女一区二区在线观看| 美女国产在线| 四虎永久免费地址在线网站|