er),然后把廣播接收器這個類或者對象注冊到Android操作系統(tǒng)上來實現動態(tài)注冊廣播接收器。
[0086]由于此處的廣播文件包含有廣播類、發(fā)送廣播標志和調用程序的隱式調用Intent的特征源代碼,使得后續(xù)模擬調用程序的過程中只需要獲取廣播類中記錄的廣播名稱即可。
[0087]此處需要說明的是,上述廣播類通過以下任意一個或多個參數進行表征:
[0088]LocalBroadcastManager>
[0089]android, support.v4.content.LocalBroadcastManager、
[0090]LocalBroadcastManager.getlnstance。
[0091]發(fā)送廣播標志可以通過參數sendBroadcast表征,調用程序的隱式調用Intent的特征源代碼可以包括以下任意一個或多個參數:setAct1n()、putExtra。
[0092]即如果檢測上述廣播文件包含使用以上任意一個或多個參數的廣播類參數(LocalBroadcastManager、LocalBroadcastManager.getlnstance 和 android, support.v4.content.LocalBroadcastManager),且包含可以表征當前調用程序為隱式調用的參數setAct1n ()和/或putExtra,而且也包含發(fā)送廣播標志的參數sendBroadcast,則可以認為該廣播文件存在被劫持的風險。
[0093]方式三:從應用程序的源代碼文件中提取不包含有顯式調用特征的源代碼,得到具有劫持風險的調用程序。
[0094]上述方案檢測當前的調用程序是否是非顯式調用模式方法的調用(即不包含以下顯式調用方法,即如果調用程序包含以下任意一個或多個參數:setClass、setClassName、setComponent),則該調用程序是顯式調用,此時可以確認該調用程序不存在被劫持的風險。
[0095]分析上述方式一和方式二提供的方案可知,確定為具有劫持風險的規(guī)則中包含了方式三的條件,由此可知,上述方式三可以作為方式一和方式二的必要條件,也可以是方式一和方式二的補充條件,用于確定應用程序中具有劫持風險的調用程序。
[0096]此處需要進一步說明的是,本申請?zhí)峁┑纳鲜鋈N規(guī)則方式可以選擇其中一種、兩種或三種應用于提取具有劫持風險的調用程序,在三種方式都采用的應用過程中,可以依次采用三種方式順序進行提取的過程,這三種方式的提取順序可以進行任意組合,本申請在此不做限定。
[0097]基于上述三種確定具有劫持風險的調用程序的方式,本申請可以提供的一種可選的實施例中,上述步驟S24和S26實現的基于調用風險列表自動構造調用檢測模塊,并基于調用檢測模塊檢測調用風險列表中的調用程序,獲取調用程序的安全檢測結果的步驟可以通過如下方案實現:
[0098]步驟S241,通過調用檢測模塊模擬調用風險列表中的調用程序,得到調用程序對應的調用測試程序。
[0099]該步驟S241實現了針對具有劫持風險的調用程序進行模擬過程,模擬該調用程序對應的測試程序。
[0100]上述步驟S241提供的模擬過程如下:首先,循環(huán)檢測獲取到的調用風險列表;然后,讀取該調用風險列表中的調用程序的函數名稱、類型、函數內容等信息;接著,根據讀取到的上述信息構建新的調用程序,即模擬一個與該調用程序相似但具有劫持性質的新調用程序,得到一個與調用程序對應的調用測試程序;此時,在將調用測試序注入到源程序文件的預定位置之后,就可以模擬一個完整的劫持過程,從而應用程序在運行到調用測試程序之后,執(zhí)行對應該目標應用程序app的劫持。
[0101]步驟S243,將調用測試程序傳入應用程序。
[0102]上述步驟S243可以采用調用命令的方式來將調用測試程序傳入應用程序,調用命令的格式為:adb install測試程序名稱。
[0103]分析可知,上述步驟S241和步驟S243模擬的應用程序中的調用程序被劫持所實現的核心代碼可以如下:
[0104]Intent hi jacklntent = new Intent (getBaseContext (),
[0105]mHashMap.get (processName));
[0106]hijacklntent.addFlags(Intent.FLAG_ACTIVITY_NEff_TASK);
[0107]getApplicat1n().startActivity(hijacklntent);
[0108]可以注意到的是,本部分代碼關鍵的實現原理為:設置標志位為:Intent.FLAG_ACTIVITY_NEff_TASK,即實現了設置啟動的activity位于棧頂,也就是說可以利用設置標志位的方法將模擬得到的調用測試程序置在應用程序中的調用程序之前,或者直接替換調用程序。以應用程序中的界面功能為例,上述方案可以實現將正常應用程序app的界面(如登錄界面等)替換成為由調用測試程序偽造的界面了,進而實現了正常應用程序的劫持操作。
[0109]步驟S245,根據調用測試程序發(fā)送調用請求至應用程序,其中,如果應用程序成功返回調用結果或者返回的調用結果不為空,則執(zhí)行步驟S247,如果應用程序未返回調用結果或者返回的調用結果為空,則執(zhí)行步驟S249。
[0110]步驟S247,確定安全檢測結果為調用程序存在劫持漏洞。
[0111]步驟S249,確定安全檢測結果為調用程序不存在劫持漏洞。
[0112]基于上述三種確定具有劫持風險的調用程序的方式,本申請可以提供的另外一種可選的實施例中,上述步驟S24和步驟S26實現的基于調用風險列表自動構造調用檢測模塊,并基于調用檢測模塊檢測調用風險列表中的調用程序,獲取調用程序的安全檢測結果的步驟可以通過如下方案實現:
[0113]步驟S261,通過調用檢測模塊提取調用風險列表中的調用程序的廣播名稱。
[0114]步驟S262,根據廣播名稱在應用程序中注冊對應的廣播接收器。
[0115]步驟S263,模擬調用風險列表中的調用程序,得到調用程序對應的測試廣播。
[0116]步驟S264,發(fā)送包含了調用測試程序的測試廣播至應用程序中對應的廣播接收器。
[0117]步驟S265,提取測試廣播中包含的調用測試程序返回的調用結果,其中,如果廣播接收器成功返回調用結果或者返回的調用結果不為空,則執(zhí)行步驟S266,如果廣播接收器未返回調用結果或者返回的調用結果為空,則執(zhí)行步驟S267。
[0118]步驟S266,確定安全檢測結果為調用程序存在劫持漏洞。
[0119]步驟S267,確定安全檢測結果為調用程序不存在劫持漏洞。
[0120]優(yōu)選的,在另外一種可選實施例中,上述步驟S263和步驟S267還以通過如下方案來確定調用程序是否存在劫持漏洞:即在模擬調用風險列表中的調用程序,得到調用程序對應的測試廣播之后,檢測該測試廣播中是否包含調用測試程序(該調用測試程序是指通過本發(fā)明提供的檢測方法確定具有劫持風險的調用程序),其中,如果測試廣播中不包含該調用測試程序,則可以確定安全檢測結果為調用程序不存在劫持漏洞,如果測試廣播中包含調用測試程序,但如果調用測試程序的參數為空,則也可以確定安全檢測結果為調用程序不存在劫持漏洞,本申請中在測試廣播包含調用測試程序且調用測試程序的參數不為空,則可以確定安全檢測結果為調用程序存在劫持漏洞。
[0121]優(yōu)選地,本申請上述步驟S263實現的模擬調用風險列表中的調用程序,得到調用程序對應的測試廣播的方案可以通過如下步驟實現:
[0122]步驟S2631,獲取與調用風險列表中每個調用程序中的組件名稱和組件特征。
[0123]步驟S2633,使用組件名稱和組件特征構造調用程序對應的廣播,生成測試廣播。
[0124]此處需要說明的是,上述方案實現了模擬了每個具有劫持風險的調用程序,在構建對應的調用測試程序之后,將調試測試結果發(fā)送給應用程序,用來模擬調用程序的調用過程,通過被測應用程序app對其進行響應的結果來測試當前被模擬的調用程序是否為具有風險漏洞的組件。
[0125]綜上可知,本申請?zhí)峁┑膶嵤├恢械陌沧緼ndroid操作系統(tǒng)中,以調用程序為Intent為例,檢測intent組件是否具有劫持漏洞的檢測過程可以分為第三部分:第一部分,可以通過對應用程序的安裝壓縮包APK進行逆向工程處理,得到應用程序的源代碼(即java源代碼集合)和系統(tǒng)清單文件(即注冊廣播的AndroidManifest.xml文件);第二部分,通過按照組件調用漏洞規(guī)則文件對應用程序的源代碼文件進行匹配,獲得上述intent組件對應的調用風險列表(intent列表),其中,該組件調用漏洞規(guī)則文件保存了具有劫持風險的調用程序所包含的特征數據;第三部分,根據獲得的intent列表,模擬發(fā)送intent請求到應用程序,檢測應用程序返回數據,如果返回數據失敗或者返回數據成功但該返回數據為空,則確定當前檢測的intent組件不具備劫持漏洞,如果返回數據成功且返回數據不為空,則確定當前檢測的intent組件具備劫持漏洞。
[0126]檢測系統(tǒng)具體流程如下:
[0127]首先,輸入Android應用的APK安裝包,并獲取組件調用漏洞規(guī)則文件的廣播組件漏洞規(guī)則,可以通過特征數據進行表征上述組件調用漏洞規(guī)則。如前所述,通過該組件調用漏洞規(guī)則匹配得到調用風險列表可以包括三種方式。
[0128]然后,通過APK逆向模塊接收APK安裝包,通過逆向反編譯轉換為java源代碼文件集:
[0129](1)、解壓縮APK安裝包,獲取classes, dex文件。
[0130](2)、使用 dex2jar 程序,轉換 classes, dex 為 jar 文件。
[0131](3)、解壓縮jar文件,得到class類文件及其目錄結構。
[0132](4)、批量反編譯class類文件,得到java源文件及其目錄結構。
[0133]接著,針對java源代碼文件目錄結構中的一個未檢查的java源代碼文件,打開文件,并執(zhí)行以下操作:
[0134]al、按行讀取源代碼文件的內容,讀取下一行(或首行)文本內容,并執(zhí)行bl。
[0135]bl、將組件調用漏洞規(guī)則文件中記錄的可以用于確定intent調用程序具有劫持風險的特征數據作為規(guī)則,與源代碼文件的內容進行匹配(若規(guī)則需多行匹配,自動讀取后續(xù)行文本),若正確匹配,則記錄注冊的特征數據在源程序代碼文本中的源代碼行文本,并跳至dl ;否則跳至cl。