1.一種Android程序的執(zhí)行路徑的還原方法,其特征在于,包括以下步驟:
(1)對Android程序進(jìn)行分析與插樁,包括:
1)將Android程序包轉(zhuǎn)化成Android虛擬機(jī)字節(jié)碼文件;
2)從Android虛擬機(jī)字節(jié)碼文件中得到Android程序組件的字節(jié)碼文件;
3)根據(jù)Android生命周期函數(shù)對Android程序組件的字節(jié)碼文件分塊,生成Android程序的生命周期控制流文件;
4)從Android程序的生命周期控制流文件中得到用戶自定義函數(shù),并根據(jù)Android虛擬機(jī)字節(jié)碼語法對用戶自定義函數(shù)分塊,生成用戶自定義函數(shù)的控制流文件;
5)從Android程序的生命周期控制流文件和用戶自定義函數(shù)的控制流文件中得到Android程序的初始代碼塊、Android程序的終止代碼塊、所有多出邊起點(diǎn)代碼塊、所有多出邊終點(diǎn)代碼塊,從當(dāng)前出邊概率模型文件中得到所有多出邊起點(diǎn)代碼塊的各條出邊的執(zhí)行概率;
6)若當(dāng)前出邊概率模型文件為初始時的出邊概率模型文件,則先將當(dāng)前出邊概率模型文件中的所有多出邊起點(diǎn)代碼塊的各條出邊的概率設(shè)定為相等后再執(zhí)行步驟7),否則,直接執(zhí)行步驟7);
7)利用編碼算法得到所有多出邊起點(diǎn)代碼塊、所有多出邊終點(diǎn)代碼塊、Android程序的初始代碼塊以及Android程序的終止代碼塊的插樁內(nèi)容;
8)依據(jù)所有多出邊起點(diǎn)代碼塊、所有多出邊終點(diǎn)代碼塊、Android程序的初始代碼塊以及Android程序的終止代碼塊的插樁內(nèi)容,對Android虛擬機(jī)字節(jié)碼文件進(jìn)行插樁;
9)將插樁后的Android虛擬機(jī)字節(jié)碼文件打包成Android程序包;
(2)用戶安裝Android程序包;
(3)依據(jù)用戶使用Android程序產(chǎn)生的程序控制流日志文件,還原Android程序的執(zhí)行路徑,包括以下步驟:
(i)從程序控制流日志文件中得到Android程序的執(zhí)行路徑編碼數(shù)組;
(ii)根據(jù)Android程序的執(zhí)行路徑編碼數(shù)組、Android程序的生命周期控制流文件、以及用戶自定義函數(shù)的控制流文件,利用解碼算法還原Android程序的執(zhí)行路徑;
(iii)根據(jù)還原的Android程序的執(zhí)行路徑,統(tǒng)計(jì)執(zhí)行路徑中所有多出邊起點(diǎn)代碼塊的出邊的執(zhí)行頻率,從而計(jì)算出每條出邊的執(zhí)行概率,更新當(dāng)前出邊概率模型文件。
2.根據(jù)權(quán)利要求1所述的一種Android程序的執(zhí)行路徑的還原方法,其特征在于,所述步驟7)執(zhí)行有以下內(nèi)容:
在Android程序的初始代碼塊中最后一句代碼之后,生成插樁內(nèi)容,該插樁內(nèi)容按先后順序含有第一代碼、第二代碼,所述第一代碼用于輸出表示當(dāng)前Android程序開始執(zhí)行的信號,所述第二代碼用于將當(dāng)前編碼區(qū)間初始化;
在Android程序中的所有多出邊起點(diǎn)代碼塊中的最后一句代碼之后,分別生成同樣的插樁內(nèi)容,各插樁內(nèi)容含有第三代碼,各所述第三代碼用于將其所在的多出邊起點(diǎn)代碼塊配置為該多出邊起點(diǎn)代碼塊的所有出邊的起點(diǎn);
在Android程序中的所有多出邊終點(diǎn)代碼塊中的第一句代碼之前,分別生成同樣的插樁內(nèi)容,各插樁內(nèi)容按先后順序依次包含以下代碼:
a)第四代碼,所述第四代碼用于將其所在的多出邊終點(diǎn)代碼塊配置為該多出邊終點(diǎn)代碼塊的所有入邊的終點(diǎn);
b)第五代碼,所述第五代碼用于將其所在的多出邊終點(diǎn)代碼塊的Android程序執(zhí)行時經(jīng)過的入邊配置為該多出邊終點(diǎn)代碼塊的當(dāng)前邊;
c)第六代碼,所述第六代碼用于從當(dāng)前出邊概率模型文件中檢索出該第六代碼所在的多出邊終點(diǎn)代碼塊的當(dāng)前邊的執(zhí)行概率;
d)第七代碼,所述第七代碼用于將當(dāng)前編碼區(qū)間更新為從當(dāng)前出邊概率模型文件中檢索出的該第七代碼所在的多出邊終點(diǎn)代碼塊的當(dāng)前邊所對應(yīng)的編碼子區(qū)間;
e)第八代碼,所述第八代碼用于在當(dāng)前編碼區(qū)間的小數(shù)位數(shù)大于寄存器的容量時,記錄當(dāng)前編碼區(qū)間內(nèi)二進(jìn)制形式下的最小值、并按比例逐步擴(kuò)大該當(dāng)前編碼區(qū)間至其滿足以下公式(1):
公式(1)中,beg_bin表示當(dāng)前編碼區(qū)間[beg,end)擴(kuò)大后的beg的小數(shù)位數(shù),end_bin表示當(dāng)前編碼區(qū)間[beg,end)擴(kuò)大后的end的小數(shù)位數(shù),L表示寄存器的容量,max(x)表示x的最大小數(shù)位數(shù),sub.(x)表示beg_bin或end_bin滿足條件x的所有小數(shù)位數(shù);
f)第九代碼,所述第九代碼用于將其所在的多出邊終點(diǎn)代碼塊的當(dāng)前邊在當(dāng)前出邊概率模型文件中的執(zhí)行概率增加;
g)第十代碼,所述第十代碼用于將其所在的多出邊終點(diǎn)代碼塊的當(dāng)前邊的起點(diǎn)代碼塊的所有非當(dāng)前邊在當(dāng)前出邊概率模型文件中的執(zhí)行概率減少;
在Android程序的終止代碼塊中的最后一句代碼塊之前,生成插樁內(nèi)容,該插樁內(nèi)容含有第十一代碼,所述第十一代碼用于記錄當(dāng)前編碼區(qū)間內(nèi)二進(jìn)制形式下的最小值。
3.根據(jù)權(quán)利要求2所述的一種Android程序的執(zhí)行路徑的還原方法,其特征在于:在所述步驟(ii)中,“利用解碼算法還原Android程序的執(zhí)行路徑”包括以下步驟:
①進(jìn)行Android程序的執(zhí)行路徑還原的初始化操作,包含以下內(nèi)容:
初始化當(dāng)前編碼區(qū)間;
從Android程序的執(zhí)行路徑編碼數(shù)組中取出第一個元素作為當(dāng)前執(zhí)行路徑編碼值;
從Android程序的生命周期控制流文件中得到Android程序啟動時執(zhí)行的初始函數(shù),并以該初始函數(shù)為當(dāng)前函數(shù);
②從Android程序的生命周期控制流文件和用戶自定義函數(shù)的控制流文件中提取當(dāng)前函數(shù)中的初始代碼塊,并以該初始代碼塊為當(dāng)前代碼塊;
③查找當(dāng)前代碼塊是否含有調(diào)用函數(shù)的代碼,若有,則記錄調(diào)用函數(shù)的代碼所在文件名及其在該文件中所在的行數(shù),找到被調(diào)用函數(shù)所在的文件,將記錄的調(diào)用函數(shù)的代碼所在文件名及其該文件中所在的行數(shù)添加到被調(diào)用函數(shù)的所有終止代碼塊中,以該被調(diào)用函數(shù)作為當(dāng)前函數(shù),返回執(zhí)行步驟②;否則,執(zhí)行步驟④;
④判斷當(dāng)前代碼塊的類別是屬于僅有一條出邊的代碼塊、多出邊起點(diǎn)代碼塊、當(dāng)前函數(shù)的終止代碼塊中的哪一種,并執(zhí)行步驟⑤:
⑤如果判斷當(dāng)前代碼塊為僅有一條出邊的代碼塊且該判斷結(jié)論系首次得到,則將當(dāng)前代碼塊的出邊記錄在可變長的數(shù)組空間中;
如果判斷當(dāng)前代碼塊為僅有一條出邊的代碼塊且該判斷結(jié)論并非首先得到,則將當(dāng)前代碼塊的出邊記錄在可變長的數(shù)組空間中前一次記錄的出邊之后,并以該出邊直接指向的代碼塊作為當(dāng)前代碼塊,返回執(zhí)行步驟③;
如果判斷當(dāng)前代碼塊為多出邊起點(diǎn)代碼塊,則執(zhí)行有以下步驟:
i)從當(dāng)前出邊概率模型文件中選擇與當(dāng)前執(zhí)行路徑編碼值所在的編碼子區(qū)間對應(yīng)的出邊;
ii)將當(dāng)前編碼區(qū)間更新為當(dāng)前執(zhí)行路徑編碼值所在的編碼子區(qū)間;
iii)如果當(dāng)前編碼區(qū)間的小數(shù)位數(shù)大于寄存器的容量,則從執(zhí)行路徑編碼數(shù)組中取出下一個路徑編碼值作為當(dāng)前執(zhí)行路徑編碼值,且按所述步驟e)所述的比例逐步擴(kuò)大當(dāng)前編碼區(qū)間至其滿足所述公式(1);
iv)以步驟i)中所選擇的出邊直接指向的代碼塊為當(dāng)前代碼塊,返回執(zhí)行步驟③;
如果判斷當(dāng)前代碼塊為當(dāng)前函數(shù)的終止代碼塊,則進(jìn)一步判斷當(dāng)前代碼塊是否記錄有調(diào)用函數(shù)的代碼所在文件名及其在該文件中所在的行數(shù),若有,則根據(jù)該記錄找到調(diào)用函數(shù)的代碼,以該調(diào)用函數(shù)的代碼作為當(dāng)前代碼塊,返回執(zhí)行步驟④;若沒有,則執(zhí)行步驟(iii)。
4.根據(jù)權(quán)利要求2或3所述的一種Android程序的執(zhí)行路徑的還原方法,其特征在于:所述“按比例逐步擴(kuò)大當(dāng)前編碼區(qū)間”中的“比例”滿足以下公式(2):
公式(2)中,scale表示當(dāng)前編碼區(qū)間擴(kuò)大的比例;Bin(x)表示得到數(shù)值x的小數(shù)位數(shù);beg_bin表示當(dāng)前編碼區(qū)間擴(kuò)大后的beg的小數(shù)位數(shù);end_bin表示當(dāng)前編碼區(qū)間擴(kuò)大后的end的小數(shù)位數(shù);L表示寄存器的容量;表示按照比例scale擴(kuò)大編碼區(qū)間一次以上后,能令和同時成立。
5.根據(jù)權(quán)利要求1至4中任一項(xiàng)所述的一種Android程序的執(zhí)行路徑的還原方法,其特征在于:在所述步驟7)中,所述編碼算法為基于熵編碼的編碼算法。
6.根據(jù)權(quán)利要求5所述的一種Android程序的執(zhí)行路徑的還原方法,其特征在于:所述編碼算法為算術(shù)編碼的編碼算法或哈夫曼編碼的編碼算法。
7.根據(jù)權(quán)利要求1至6中任一項(xiàng)所述的一種Android程序的執(zhí)行路徑的還原方法,其特征在于:所述步驟(ii)中,所述解碼算法為基于熵編碼的解碼算法。
8.根據(jù)權(quán)利要求7所述的一種Android程序的執(zhí)行路徑的還原方法,其特征在于:所述解碼算法為算術(shù)編碼的解碼算法或哈夫曼編碼的解碼算法。