一種將JAR文件解析成java的方法及系統(tǒng)的制作方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及網(wǎng)絡(luò)安全
技術(shù)領(lǐng)域:
,尤其涉及一種將JAR文件解析成java的方法及系統(tǒng)?!?br>背景技術(shù):
】[0002]就像MP3格式的文件記錄著聲音信息,avi格式的文件記錄著視頻信息,與此相同,Jar文件是class的集合,按照class文件規(guī)范,保存著一系列二進(jìn)制的數(shù)據(jù),紀(jì)錄著信息。Jar文件中二進(jìn)制數(shù)據(jù)的可讀性不高,用java語言復(fù)述出這段二進(jìn)制數(shù)據(jù)的含義可以方便分析者讀懂Jar文件的內(nèi)容。這里用Java語言復(fù)述Jar文件的過程叫做Jar轉(zhuǎn)Java。[0003]class文件是JVM(java虛擬機(jī))可執(zhí)行文件,其中二進(jìn)制代碼中包含內(nèi)容信息有順序結(jié)構(gòu),選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。JVM按照J(rèn)VM規(guī)范可以從上到下執(zhí)行class的二進(jìn)制文件。由于計(jì)算機(jī)不懂JVM規(guī)范,class文件想表達(dá)的順序結(jié)構(gòu),選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)在計(jì)算機(jī)看來則是雜亂無章的。[0004]傳統(tǒng)方式解析出的java文件含有g(shù)oto標(biāo)簽,這樣比較繁瑣并且導(dǎo)致java可讀性不聞?!?br/>發(fā)明內(nèi)容】[0005]針對(duì)上述技術(shù)問題,本發(fā)明提供了一種將JAR文件解析成java的方法及系統(tǒng),該方法將計(jì)算機(jī)無法識(shí)別而JVM可以識(shí)別的跳轉(zhuǎn)、選擇和判斷等指令轉(zhuǎn)化為計(jì)算機(jī)可以識(shí)別的順序執(zhí)行的指令,并且利用本發(fā)明所述的技術(shù)方案最終得到的java文件是不帶goto標(biāo)簽的,從而達(dá)到簡(jiǎn)易解析JAR文件,并提高了可讀性。[0006]本發(fā)明采用如下方法來實(shí)現(xiàn):一種將JAR文件解析成java的方法,包括:基于class文件的結(jié)構(gòu)規(guī)范,解析獲得二進(jìn)制字節(jié)碼并存入數(shù)組A;基于class文件的結(jié)構(gòu)規(guī)范,獲取except1n_table異常表;所述except1n_table異常表內(nèi)包含一些數(shù)值,是try_catch的索引;提取except1n_table異常表中的每條內(nèi)容并保存在預(yù)定義結(jié)構(gòu)中,所述結(jié)構(gòu)為:struct{intstart—pc;intend—pc;inthandler;};所述start_pc為起始指令與起始位置的偏移值,所述end_pc為結(jié)束指令與起始位置的偏移值,所述handler為預(yù)設(shè)的異常處理方式;將得到的各結(jié)構(gòu)存入數(shù)組B;將數(shù)組B中的各結(jié)構(gòu)中具備相同start_pc和end_pc的handler進(jìn)行合并后形成新結(jié)構(gòu),并將各新結(jié)構(gòu)存入數(shù)組C;遍歷數(shù)組A,基于JVM指令規(guī)范識(shí)別與跳轉(zhuǎn)或者被跳轉(zhuǎn)相關(guān)的指令并進(jìn)行分割標(biāo)記,基于分割標(biāo)記形成分割模塊,并將所述分割模塊添加至數(shù)組D;基于JVM指令的邏輯關(guān)系,將所述分割模塊按照?qǐng)?zhí)行順序進(jìn)行重新排列,并存入數(shù)組E;其目的在于消除計(jì)算機(jī)不能夠識(shí)別的需要跳轉(zhuǎn)的指令,例如條件判斷指令、跳轉(zhuǎn)指令和選擇分支指令等,重新排序成不懂JVM規(guī)范的計(jì)算機(jī)能識(shí)別的順序;將數(shù)組C中的各結(jié)構(gòu)的start_pc和end_pc,與E中的各分割模塊的offset進(jìn)行比較,如果start_pc和end_pc在E的相鄰兩個(gè)分割模塊的offset之間,則將C中的該結(jié)構(gòu)的handler內(nèi)容保存在E的trycatchbranch中;所述offset為指令與起始位置的偏移值;遞歸輸出每個(gè)分割模塊自身的內(nèi)容,然后讀取branch信息和trycatchbranch信息,并判斷所述branch信息和trycatchbranch信息所指向的模塊是否輸出過,若輸出過,貝丨』不輸出該模塊內(nèi)容,否則輸出該模塊內(nèi)容。[0007]進(jìn)一步地,所述基于JVM指令規(guī)范識(shí)別與跳轉(zhuǎn)或者被跳轉(zhuǎn)相關(guān)的指令前,還包括:基于JVM指令規(guī)范將指令按照功能分為16類,包括但不限于:條件判斷類、跳轉(zhuǎn)類和選擇分支類。[0008]進(jìn)一步地,所述將數(shù)組B中的各結(jié)構(gòu)中具備相同start_pc和end_pc的handler進(jìn)行合并后形成的新結(jié)構(gòu)為:struct{intstart_pc;intend_pc;int[]handler;};所述start_pc和end_pc為指令與起始位置的偏移值,所述handler為預(yù)設(shè)的異常處理方式。[0009]進(jìn)一步地,所述branch信息中保存的是邏輯索引信息;所述trycatchbranch信息中保存的是except1n_table的索引信息。所述branch是類似鏈表的指針。[0010]本發(fā)明采用如下系統(tǒng)來實(shí)現(xiàn):一種將JAR文件解析成java的系統(tǒng),包括:數(shù)組A生成模塊,基于class文件的結(jié)構(gòu)規(guī)范,解析獲得二進(jìn)制字節(jié)碼并存入數(shù)組A;異常表獲取模塊,基于class文件的結(jié)構(gòu)規(guī)范,獲取except1n_table異常表;所述except1n_table異常表內(nèi)包含一些數(shù)值,是try_catch的索引;數(shù)組B生成模塊,用于提取exc印t1n_table異常表中的每條內(nèi)容并保存在預(yù)定義結(jié)構(gòu)中,所述結(jié)構(gòu)為:struct{intstart—pc;intend—pc;inthandler;};所述start_pc為起始指令與起始位置的偏移值,所述end_pc為結(jié)束指令與起始位置的偏移值,所述handler為預(yù)設(shè)的異常處理方式;將得到的各結(jié)構(gòu)存入數(shù)組B;數(shù)組C生成模塊,用于將數(shù)組B中的各結(jié)構(gòu)中具備相同start_pc和end_pc的handler進(jìn)行合并后形成新結(jié)構(gòu),并將各新結(jié)構(gòu)存入數(shù)組C中;數(shù)組D生成模塊,用于遍歷數(shù)組A,基于JVM指令規(guī)范識(shí)別與跳轉(zhuǎn)或者被跳轉(zhuǎn)相關(guān)的指令并進(jìn)行分割標(biāo)記,基于分割標(biāo)記形成分割模塊,并將所述分割模塊添加至數(shù)組D中;數(shù)組E生成模塊,基于JVM指令的邏輯關(guān)系,將所述分割模塊按照?qǐng)?zhí)行順序進(jìn)行重新排列,并存入數(shù)組E;其目的在于消除計(jì)算機(jī)不能夠識(shí)別的需要跳轉(zhuǎn)的指令,例如條件判斷指令、跳轉(zhuǎn)指令和選擇分支指令等,重新排序成不懂JVM規(guī)范的計(jì)算機(jī)能識(shí)別的順序;數(shù)組E完善模塊,用于將數(shù)組C中的各結(jié)構(gòu)的start_pc和end_pc,與E中的各分割模塊的offset進(jìn)行比較,如果start_pc和end_pc在E的相鄰兩個(gè)分割模塊的offset之間,則將C中的該結(jié)構(gòu)的handler內(nèi)容保存在E的trycatchbranch中;所述offset為指令與起始位置的偏移值;遞歸輸出模塊,用于遞歸輸出每個(gè)分割模塊自身的內(nèi)容,然后讀取branch信息和trycatchbranch信息,并判斷所述branch信息和trycatchbranch信息所指向的模塊是否輸出過,若輸出過,則不輸入該模塊內(nèi)容,否則輸出該模塊內(nèi)容。[0011]進(jìn)一步地,還包括指令分類模塊:基于JVM指令規(guī)范將指令按照功能分為16類,包括但不限于:條件判斷類、跳轉(zhuǎn)類和選擇分支類。[0012]進(jìn)一步地,數(shù)組C生成模塊中所述的新結(jié)構(gòu)為:struct{intstart—pc;intend—pc;int口handler;};所述start_pc為起始指令與起始位置的偏移值,所述end_pc為結(jié)束指令與起始位置的偏移值,所述handler為預(yù)設(shè)的異常處理方式。[0013]進(jìn)一步地,所述branch信息中保存的是邏輯索弓I信息;所述trycatchbranch信息中保存的是except1n_table的索引信息。[0014]綜上所述,本發(fā)明提供了一種將JAR文件解析成java的方法及系統(tǒng),本發(fā)明所提供的技術(shù)方案基于class文件本身的結(jié)構(gòu)規(guī)范,首先獲取字節(jié)碼和except1n_table異常表;并基于異常表中的每條內(nèi)容生成新的結(jié)構(gòu)形式,該結(jié)構(gòu)中包括起始指令或結(jié)束指令與起始位置的偏移值,還有預(yù)設(shè)的異常處理方式。同時(shí),從頭到尾遍歷字節(jié)碼,在遇到涉及到跳轉(zhuǎn)或者被跳轉(zhuǎn)的指令處進(jìn)行分割,形成所述字節(jié)碼的最小分割模塊,并基于JVM指令的邏輯關(guān)系,將上述分割模塊按照?qǐng)?zhí)行順序進(jìn)行重新排列,并經(jīng)過一定的完善后遞歸輸出,從而消除了傳統(tǒng)解析結(jié)果中包含的goto-label,并形成了可讀性較高的java文件?!靖綀D說明】[0015]為了更清楚地說明本發(fā)明的技術(shù)方案,下面將對(duì)實(shí)施例中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明中記載的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。[0016]圖1為本發(fā)明提供的一種將JAR文件解析成ja當(dāng)前第1頁1 2 3