本申請涉及通信領(lǐng)域,尤其涉及一種app內(nèi)部權(quán)限的檢測方法及裝置。
背景技術(shù):
android是一個(gè)以linux為基礎(chǔ)的開源操作系統(tǒng),由于其開放性和可移植性,可以被用在大部分電子產(chǎn)品上,因此android系統(tǒng)已經(jīng)成為全球最大的智能手機(jī)操作系統(tǒng)。
在android系統(tǒng)中,對于各類系統(tǒng)權(quán)限,尤其針對各類系統(tǒng)敏感權(quán)限的使用和管控,會(huì)直接影響到app的規(guī)范性和用戶體驗(yàn)。而目前針對android系統(tǒng)各類權(quán)限的使用和管控,通常是通過第三方的權(quán)限監(jiān)控軟件來實(shí)現(xiàn),已無法滿足在實(shí)際應(yīng)用中的管控需求。
技術(shù)實(shí)現(xiàn)要素:
本申請?zhí)岢鲆环Napp內(nèi)部權(quán)限的檢測方法,該方法包括:
獲取app使用的外部權(quán)限,并基于所述外部權(quán)限的信息創(chuàng)建第一權(quán)限記錄列表;
獲取所述app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段,并基于所述代碼片段中記錄的與權(quán)限使用相關(guān)的信息創(chuàng)建第二權(quán)限記錄列表;其中,所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表中的權(quán)限記錄數(shù)據(jù)結(jié)構(gòu)相同;
針對所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表執(zhí)行匹配以確定所述app編譯后的代碼中使用到權(quán)限的代碼片段以及對應(yīng)的使用權(quán)限。
可選的,所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表中的權(quán)限記錄 的數(shù)據(jù)結(jié)構(gòu)至少包括以下字段:
權(quán)限名稱字段,用于記錄權(quán)限名稱;
權(quán)限類型字段,用于記錄所述權(quán)限的使用方式;所述使用方式包括基于api使用或基于權(quán)限名稱使用;
權(quán)限內(nèi)容字段,用于記錄所述權(quán)限的使用信息;所述使用信息包括以下信息中的任一:使用所述權(quán)限的api、所述權(quán)限名稱,使用所述權(quán)限的代碼類和與該代碼類對應(yīng)的代碼方法;
權(quán)限使用記錄字段,用于記錄使用所述權(quán)限的代碼片段的地址。
可選的,所述獲取app使用的外部權(quán)限包括:
讀取app的權(quán)限配置列表以獲取所述app使用的外部權(quán)限名稱;
解析系統(tǒng)文檔獲取系統(tǒng)定義的全部權(quán)限的信息;
在所述系統(tǒng)定義的全部權(quán)限的信息中查找與所述外部權(quán)限名稱對應(yīng)的外部權(quán)限的信息。
可選的,所述獲取所述app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段包括:
解析所述app編譯后的代碼;
查找所述app編譯后的代碼中與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段;
將查找到的所述與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段作為與權(quán)限使用相關(guān)的代碼片段進(jìn)行獲取。
可選的,所述將查找到的所述與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段作為與權(quán)限使用相關(guān)的代碼片段進(jìn)行獲取之前,還包括:
針對查找到的代碼片段進(jìn)行代碼識別;
過濾查找到的代碼片段中與權(quán)限無關(guān)的代碼片段。
可選的,所述針對所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表執(zhí)行匹配以確定所述app編譯后的代碼中使用到權(quán)限的代碼片段以及對應(yīng)的使用權(quán)限包括:
遍歷所述第一權(quán)限記錄列表以及所述第二權(quán)限記錄列表,將所述第一權(quán)限記錄列表中的權(quán)限記錄與所述第二權(quán)限記錄列表中的權(quán)限記錄依次執(zhí)行匹配;
當(dāng)所述第一權(quán)限記錄列表中的任一權(quán)限記錄與所述第二權(quán)限記錄列表中的任一權(quán)限記錄包括至少一個(gè)記錄的信息完全匹配的字段時(shí),確定二者匹配;
針對所述第一權(quán)限記錄列表以及所述第二權(quán)限記錄列表中相匹配的權(quán)限記錄中各字段記錄的信息進(jìn)行合并,生成對應(yīng)的權(quán)限使用記錄列表,以基于該權(quán)限使用記錄列表確定所述app編譯后的代碼中使用到權(quán)限的代碼片段的地址以及對應(yīng)的使用權(quán)限的信息。
本申請還提出一種app內(nèi)部權(quán)限的檢測裝置,該裝置包括:
第一獲取模塊,用于獲取app使用的外部權(quán)限,并基于所述外部權(quán)限的信息創(chuàng)建第一權(quán)限記錄列表;
第二獲取模塊,用于獲取所述app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段,并基于所述代碼片段中記錄的與權(quán)限使用相關(guān)的信息創(chuàng)建第二權(quán)限記錄列表;其中,所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表中的權(quán)限記錄數(shù)據(jù)結(jié)構(gòu)相同;
匹配模塊,用于針對所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表執(zhí)行匹配以確定所述app編譯后的代碼中使用到權(quán)限的代碼片段以及對應(yīng)的使用權(quán)限。
可選的,所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表中的權(quán)限記錄的數(shù)據(jù)結(jié)構(gòu)至少包括以下字段:
權(quán)限名稱字段,用于記錄權(quán)限名稱;
權(quán)限類型字段,用于記錄所述權(quán)限的使用方式;所述使用方式包括基于api使用或基于權(quán)限名稱使用;
權(quán)限內(nèi)容字段,用于記錄所述權(quán)限的使用信息;所述使用信息包括以下信息中的任一:使用所述權(quán)限的api、所述權(quán)限名稱,使用所述權(quán)限的代碼類和與該代碼類對應(yīng)的代碼方法;
權(quán)限使用記錄字段,用于記錄使用所述權(quán)限的代碼片段的地址。
可選的,所述第一獲取模塊具體用于:
讀取app的權(quán)限配置列表以獲取所述app使用的外部權(quán)限名稱;
解析系統(tǒng)文檔獲取系統(tǒng)定義的全部權(quán)限的信息;
在所述系統(tǒng)定義的全部權(quán)限的信息中查找與所述外部權(quán)限名稱對應(yīng)的外部權(quán)限的信息。
可選的,所述第二獲取模塊具體用于:
解析所述app編譯后的代碼;
查找所述app編譯后的代碼中與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段;
將查找到的所述與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段作為與權(quán)限使用相關(guān)的代碼片段進(jìn)行獲取。
可選的,所述第二獲取模塊進(jìn)一步用于:
在將查找到的所述與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段作為與權(quán)限使用相關(guān)的代碼片段進(jìn)行獲取之前,針對查找到的代碼片段進(jìn)行代碼識別;過濾查找到的代碼片段中與權(quán)限無關(guān)的代碼片段。
可選的,所述匹配模塊具體用于:
遍歷所述第一權(quán)限記錄列表以及所述第二權(quán)限記錄列表,將所述第一權(quán)限記錄列表中的權(quán)限記錄與所述第二權(quán)限記錄列表中的權(quán)限記錄依次執(zhí)行匹配;
當(dāng)所述第一權(quán)限記錄列表中的任一權(quán)限記錄與所述第二權(quán)限記錄列表中的任一權(quán)限記錄包括至少一個(gè)記錄的信息完全匹配的字段時(shí),確定二者匹配;
針對所述第一權(quán)限記錄列表以及所述第二權(quán)限記錄列表中相匹配的權(quán)限記錄中各字段記錄的信息進(jìn)行合并,生成對應(yīng)的權(quán)限使用記錄列表,以基于該權(quán)限使用記錄列表確定所述app編譯后的代碼中使用到權(quán)限的代碼片段的地址以及對應(yīng)的使用權(quán)限的信息。
本申請中,通過基于app使用的外部權(quán)限的信息創(chuàng)建第一權(quán)限記錄列表, 以及基于app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段中記錄的與權(quán)限使用相關(guān)的信息創(chuàng)建第二權(quán)限記錄列表,并為第一權(quán)限記錄列表與第二權(quán)限記錄列表中的權(quán)限記錄定義相同的數(shù)據(jù)結(jié)構(gòu),然后通過針對第一權(quán)限記錄列表與第二權(quán)限記錄列表執(zhí)行匹配來確定app編譯后的代碼中使用到權(quán)限的代碼片段以及對應(yīng)的使用權(quán)限,從而實(shí)現(xiàn)了可以針對app代碼中使用到的內(nèi)部權(quán)限更加便利的進(jìn)行管控。
附圖說明
圖1是本申請一實(shí)施例提供的一種app內(nèi)部權(quán)限的檢測方法的流程圖;
圖2是本申請一實(shí)施例提供的一種獲取app外部使用權(quán)限的處理流程圖;
圖3是本申請一實(shí)施例提供的一種獲取所述app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段的處理流程圖;
圖4是本申請一實(shí)施例提供的一種針對第一權(quán)限記錄列表以及第二權(quán)限記錄列表執(zhí)行匹配流程圖;
圖5是本申請一實(shí)施例提供的一種app內(nèi)部權(quán)限的檢測裝置的邏輯框圖;
圖6是本申請一實(shí)施例提供的承載所述一種app內(nèi)部權(quán)限的檢測裝置的客戶端的硬件結(jié)構(gòu)圖。
具體實(shí)施方式
在相關(guān)技術(shù)中,針對android系統(tǒng)各類權(quán)限的使用和管控,通常是通過第三方的權(quán)限監(jiān)控軟件來實(shí)現(xiàn)。然而通過第三方的權(quán)限監(jiān)控軟件,僅能對app(application,應(yīng)用)使用的外部權(quán)限進(jìn)行監(jiān)控,并不能對app代碼中實(shí)際使用到的內(nèi)部權(quán)限進(jìn)行監(jiān)控,因此已無法滿足開發(fā)人員在實(shí)際應(yīng)用中針對app代碼中使用到的內(nèi)部權(quán)限進(jìn)行管控的需求。
有鑒于此,本申請?zhí)岢鲆环Napp內(nèi)部權(quán)限的檢測方法,通過基于app使用的外部權(quán)限的信息創(chuàng)建第一權(quán)限記錄列表,以及基于app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段中記錄的與權(quán)限使用相關(guān)的信息創(chuàng)建第二權(quán)限 記錄列表,并為第一權(quán)限記錄列表與第二權(quán)限記錄列表中的權(quán)限記錄定義相同的數(shù)據(jù)結(jié)構(gòu),然后通過針對第一權(quán)限記錄列表與第二權(quán)限記錄列表執(zhí)行匹配來確定app編譯后的代碼中使用到權(quán)限的代碼片段以及對應(yīng)的使用權(quán)限,從而實(shí)現(xiàn)了可以針對app代碼中使用到的內(nèi)部權(quán)限更加便利的進(jìn)行管控。
下面通過具體實(shí)施例并結(jié)合具體的應(yīng)用場景對本申請進(jìn)行描述。
請參考圖1,圖1是本申請一實(shí)施例提供的一種app內(nèi)部權(quán)限的檢測方法,應(yīng)用于客戶端,所述方法執(zhí)行以下步驟:
步驟101,獲取app使用的外部權(quán)限,并基于所述外部權(quán)限的信息創(chuàng)建第一權(quán)限記錄列表;
上述客戶端可以包括面向app開發(fā)人員提供針對系統(tǒng)中的app進(jìn)行內(nèi)部權(quán)限監(jiān)控服務(wù)的客戶端軟件,開發(fā)人員可以通過該客戶端軟件來監(jiān)控app的源代碼中使用到的權(quán)限。
在本例中,客戶端在獲取app使用的外部權(quán)限時(shí),可以通過解析該app的權(quán)限配置列表,來獲取該app所使用的外部權(quán)限名稱,然后在系統(tǒng)定義的全部權(quán)限的信息中查找與該外部權(quán)限名稱對應(yīng)的外部權(quán)限信息。
請參見圖2,圖2為示出的一種獲取app外部使用權(quán)限的處理流程圖,包括以下步驟:
步驟201,讀取app的權(quán)限配置列表以獲取所述app使用的外部權(quán)限名稱;
在本例中,客戶端可以在系統(tǒng)目錄中讀取該app的權(quán)限配置列表,其中,在該權(quán)限配置列表中記錄了該app使用到的所有外部權(quán)限的名稱。當(dāng)客戶端讀取到該app的權(quán)限配置列表后,可以解析該權(quán)限配置列表來獲取該app所使用的所有外部權(quán)限名稱。當(dāng)然,在實(shí)際應(yīng)用中,在獲取app使用的外部權(quán)限時(shí),也可以由開發(fā)人員編輯查詢指令來手動(dòng)查詢app所使用的外部權(quán)限。
步驟202,解析系統(tǒng)文檔獲取系統(tǒng)定義的全部權(quán)限的信息;
在本例中,上述權(quán)限的信息可以包括權(quán)限的名稱、權(quán)限的使用方式以及權(quán)限的使用信息等。上述系統(tǒng)文檔可以是android系統(tǒng)中的api(application programminginterface,應(yīng)用程序編程接口)文檔,在api文檔中記錄了android系統(tǒng)定義的全部權(quán)限的名稱,以及使用這些權(quán)限的api。
其中,android系統(tǒng)定義的權(quán)限使用方法通常包括基于api來使用權(quán)限和基于權(quán)限名稱來使用權(quán)限兩種。
當(dāng)api文檔中針對某一權(quán)限定義了使用該權(quán)限的api時(shí),那么該權(quán)限的使用方法則為基于api來使用,該權(quán)限的使用信息則可以包括使用該權(quán)限的api。當(dāng)api文檔中針對某一權(quán)限未定義使用該權(quán)限的api,或者明確記載了該權(quán)限基于權(quán)限名稱來使用時(shí),那么該權(quán)限的使用方法則為基于權(quán)限名稱來使用,該權(quán)限的使用信息則可以包括該權(quán)限的使用名稱(即該權(quán)限的規(guī)范名稱)。
客戶端可以在系統(tǒng)的指定目錄中讀取api文檔,然后解析api文檔中定義的上述信息,來獲取android系統(tǒng)定義的全部權(quán)限的信息。
步驟203,在所述系統(tǒng)定義的全部權(quán)限的信息中查找與所述外部權(quán)限名稱對應(yīng)的外部權(quán)限的信息。
在本例中,當(dāng)客戶端通過解析api文檔獲取到android系統(tǒng)定義的全部權(quán)限的信息后,可以在android系統(tǒng)定義的全部權(quán)限的信息中來查找與app所使用的外部權(quán)限名稱對應(yīng)的權(quán)限信息(app使用到的外部權(quán)限的信息為android系統(tǒng)定義的全部權(quán)限的信息的子集),此時(shí)查找到的權(quán)限信息即為該app所使用到的外部權(quán)限的信息。
在本例中,當(dāng)客戶端基于步驟201至203的技術(shù)方案,獲取到app使用的外部權(quán)限時(shí),此時(shí)可以基于app使用的外部權(quán)限的信息來創(chuàng)建第一權(quán)限記錄列表。
在示出的一種實(shí)施方式中,上述第一權(quán)限記錄列表可以記為perm_api_list??蛻舳嗽诨赼pp使用的外部權(quán)限的信息來創(chuàng)建perm_api_list時(shí),首先可以基于開發(fā)人員預(yù)定義的數(shù)據(jù)結(jié)構(gòu),針對每一個(gè)外部權(quán)限生成一個(gè)對應(yīng)的permrecord(權(quán)限記錄)。
上述permrecord的數(shù)據(jù)結(jié)構(gòu)可以是開發(fā)人員預(yù)定義的一種大字段結(jié)構(gòu), 可以包括perm_name字段(權(quán)限名稱字段)、perm_use_type字段(權(quán)限類型字段)、perm_use_content字段(權(quán)限內(nèi)容字段)以及perm_use_record字段(權(quán)限使用記錄字段)。
其中:
perm_name字段,用于記錄權(quán)限名稱。
perm_use_type字段,用于記錄權(quán)限的使用方式;在android系統(tǒng)中定義的權(quán)限使用方式包括基于api使用或基于權(quán)限名稱使用兩種。
perm_use_content字段,用于記錄權(quán)限的使用信息;該使用信息可以包括使用該權(quán)限的api、該權(quán)限的使用名稱(即該權(quán)限的名稱),app的源代碼中使用該權(quán)限的代碼類以及與該代碼類對應(yīng)的代碼方法。
perm_use_record字段,用于記錄使用該權(quán)限的代碼片段的地址。
客戶端在針對任一外部權(quán)限生成對應(yīng)的permrecord時(shí),可以將權(quán)限名稱填入perm_name字段。當(dāng)api文檔中針對該權(quán)限定義了使用該權(quán)限的api時(shí),可以在perm_use_type字段中將該權(quán)限的使用方式記錄為“api”(表示基于api來使用),并在perm_use_content字段中記錄使用該權(quán)限的api。當(dāng)api文檔中針對該權(quán)限未定義使用該權(quán)限的api,或者明確記載了該權(quán)限基于權(quán)限名稱來使用時(shí),可以在perm_use_type字段中將該權(quán)限的使用方式記錄為“permname”(表示基于權(quán)限名稱來使用),并在perm_use_content字段中記錄該權(quán)限的使用名稱。
其中,需要指出的是,api文檔中可能針對單一權(quán)限定義多個(gè)使用該權(quán)限的api,針對這種情況,可以針對單一權(quán)限創(chuàng)建多個(gè)permrecord,每一個(gè)permrecord中的perm_use_content字段,可以分別記錄一個(gè)使用該權(quán)限的api。
另外,由于android系統(tǒng)的api文檔中,僅僅定義了全部權(quán)限的名稱、使用方式以及使用信息等信息,并不包含使用權(quán)限的代碼片段的地址,因此客戶端為app使用的所有外部權(quán)限生成的permrecord中的perm_use_record字段可以為空值。
當(dāng)然,在實(shí)際應(yīng)用中,上述數(shù)據(jù)結(jié)構(gòu)中的字段,并不局限于perm_name字段、perm_use_type字段、perm_use_content字段以及perm_use_record字段等,在實(shí)際應(yīng)用中,開發(fā)人員還可以將以上四種字段作為上述數(shù)據(jù)結(jié)構(gòu)中的核心字段,然后基于實(shí)際的需求,在以上四種字段的基礎(chǔ)上進(jìn)行字段擴(kuò)展。
當(dāng)客戶端基于以上數(shù)據(jù)結(jié)構(gòu),為所有外部權(quán)限生成了對應(yīng)的permrecord后,可以基于為所有權(quán)限生成的permrecord來創(chuàng)建上述perm_api_list。此時(shí)在創(chuàng)建完成的perm_api_list中,可以包括若干條permrecord,每一條permrecord都對應(yīng)一個(gè)app所使用的外部權(quán)限。
在示出的另一種實(shí)施方式中,客戶端基于app使用的外部權(quán)限的信息來創(chuàng)建perm_api_list之前,客戶端首先可以基于開發(fā)人員預(yù)定義的上述數(shù)據(jù)結(jié)構(gòu),針對解析api文檔獲取到的由android系統(tǒng)定義的全部權(quán)限的信息,分別生成一個(gè)對應(yīng)的permrecord。
其中,該permrecord的數(shù)據(jù)結(jié)構(gòu)與客戶端在為app所使用的外部權(quán)限創(chuàng)建permrecord時(shí),所使用的數(shù)據(jù)結(jié)構(gòu)相同。
當(dāng)客戶端基于以上數(shù)據(jù)結(jié)構(gòu),針對android系統(tǒng)定義的全部權(quán)限的信息分別生成了一個(gè)對應(yīng)的permrecord后,可以基于為android系統(tǒng)定義的全部權(quán)限的信息生成的permrecord來創(chuàng)建一個(gè)權(quán)限記錄索引列表。
在本例中,該權(quán)限記錄索引列表可以記為perm_dict。
其中,在創(chuàng)建完成的該perm_dict中,包括android系統(tǒng)定義的所有權(quán)限的名稱與客戶端為android系統(tǒng)定義的所有權(quán)限生成的permrecord之間的對應(yīng)關(guān)系。
當(dāng)客戶端基于app使用的外部權(quán)限的信息來創(chuàng)建perm_api_list時(shí),可以在perm_dict中查找與app使用的外部權(quán)限的名稱來查找對應(yīng)的permrecord,然后基于查找到的permrecord來創(chuàng)建perm_api_list。
步驟102,獲取所述app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段,并基于所述代碼片段中記錄的與權(quán)限使用相關(guān)的信息創(chuàng)建第二權(quán)限記錄列表;其中,所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表中的權(quán)限記錄數(shù)據(jù)結(jié) 構(gòu)相同;
在本例中,當(dāng)客戶端基于app所使用的所有外部權(quán)限的信息創(chuàng)建了perm_api_list(即第一權(quán)限記錄列表)后,此時(shí)客戶端還可以獲取app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段,并基于這些代碼片段中記錄的與權(quán)限使用相關(guān)的信息,來創(chuàng)建第二權(quán)限記錄列表。在本例中,第二權(quán)限記錄列表可以記為perm_api_list。
請參見圖3,圖3為示出的一種獲取所述app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段的處理流程圖,包括以下步驟:
步驟301,解析所述app編譯后的代碼;
在本例中,客戶端在解析app編譯后的源代碼時(shí),可以通過第三方的代碼解析器,或者客戶端內(nèi)置的代碼解析模塊來完成。
步驟302,查找所述app編譯后的代碼中與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段;
步驟303,將查找到的所述與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段作為與權(quán)限使用相關(guān)的代碼片段進(jìn)行獲取。
在本例中,android系統(tǒng)定義的權(quán)限使用方法通常包括基于api來使用權(quán)限和基于權(quán)限名稱來使用權(quán)限兩種。
一方面,對于基于api來使用權(quán)限的這種方式,由于api通常會(huì)基于外部函數(shù)來進(jìn)行調(diào)用,因此對于app源代碼中與外部函數(shù)調(diào)用相關(guān)的代碼片段來說,則很可能通過調(diào)用api使用了系統(tǒng)權(quán)限。在這種情況下,客戶端可以解析app編譯后的源代碼,查找與外部函數(shù)調(diào)用相關(guān)的代碼片段,然后將查找到的代碼片段作為與權(quán)限使用相關(guān)的代碼片段進(jìn)行獲取和保存,
另一方面,對于基于權(quán)限名稱來使用權(quán)限的這種方式,由于android系統(tǒng)中通常會(huì)通過一些字符定義指令來調(diào)用權(quán)限名稱,因此對于app源代碼中與字符定義相關(guān)的代碼片段來說,則很可能通過字符定義指令定義權(quán)限名稱使用了系統(tǒng)權(quán)限。在這種情況下,客戶端可以解析app編譯后的源代碼,查找與字符定義相關(guān)的代碼片段,將查找到的代碼片段作為與權(quán)限使用相關(guān)的 代碼片段進(jìn)行獲取和保存。
其中,需要指出的是,由于客戶端在app編譯后的代碼中查找到的與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段中,可能會(huì)包含一些與權(quán)限使用無關(guān)的代碼,因此客戶端在將查找到的與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段作為與權(quán)限使用相關(guān)的代碼片段進(jìn)行獲取和保存之前,還可以對查找的代碼片段中與權(quán)限使用無關(guān)的代碼片段進(jìn)行過濾。
在示出的一種實(shí)施方式中,客戶端在對查找的代碼片段中的無效代碼片段進(jìn)行過濾時(shí),可以針對查找到的代碼片段進(jìn)行代碼識別,通過代碼識別客戶端可以識別出查找到的代碼片段中的與權(quán)限使用無關(guān)的代碼片段,比如這些代碼片段可以包括客戶端可以明確識別出的一些與權(quán)限使用無關(guān)的函數(shù)、通用指令,非目標(biāo)指令,等等。對于識別出的上述與權(quán)限使用無關(guān)的代碼片段,可以由客戶端進(jìn)行過濾,從查找到的代碼片段中清除。通過這種方式,可以盡可能的避免查找到的代碼片段均為與權(quán)限使用相關(guān)的代碼片段。
在本例中,當(dāng)客戶端基于步驟301至303的技術(shù)方案,獲取到app編譯后的源代碼中與權(quán)限使用相關(guān)的代碼片段后,此時(shí)可以基于這些代碼片段中記錄的與權(quán)限使用相關(guān)的信息創(chuàng)建第二權(quán)限記錄列表。
其中,上述第二權(quán)限記錄列表可以記為perm_code_list。
在示出的一種實(shí)施方式中,客戶端在基于app的源代碼中與權(quán)限相關(guān)的代碼片段中記錄的與權(quán)限使用相關(guān)的信息創(chuàng)建perm_code_list時(shí),首先可以基于開發(fā)人員預(yù)定義的數(shù)據(jù)結(jié)構(gòu),針對每一個(gè)代碼片段分別生成一個(gè)對應(yīng)的permrecord(權(quán)限記錄)。
其中,需要強(qiáng)調(diào)的是,客戶端在針對每一個(gè)代碼片段生成對應(yīng)的permrecord時(shí)所采用的上述permrecord的數(shù)據(jù)結(jié)構(gòu),與客戶端在基于app所使用的外部權(quán)限的信息創(chuàng)建perm_api_list(即第一權(quán)限記錄列表)時(shí)所使用的數(shù)據(jù)結(jié)構(gòu)相同。在該數(shù)據(jù)結(jié)構(gòu)中仍然可以包括perm_name字段(權(quán)限名稱字段)、perm_use_type字段(權(quán)限類型字段)、perm_use_content字段(權(quán)限內(nèi)容字段)以及perm_use_record字段(權(quán)限使用記錄字段),而且這些字 段記錄的信息保持不變,不再贅述。
客戶端在針對任一代碼片段生成對應(yīng)的permrecord時(shí),可以將權(quán)限名稱填入perm_name字段。由于上述代碼片段中,通常并不會(huì)包含權(quán)限名稱、權(quán)限的使用方式等信息,因此perm_name字段和perm_use_type字段可以為空值。對于perm_use_content字段,一方面,如果上述代碼片段為與外部函數(shù)調(diào)用相關(guān)的代碼片段,此時(shí)該代碼片段中通常并不包含api,但組成api的代碼類以及與該代碼類對應(yīng)的方法卻可能會(huì)出現(xiàn)在上述代碼片段中,因此客戶端可以提取該代碼片段中調(diào)用的代碼類,以及與該代碼類對應(yīng)的方法,然后將提取出的代碼類與該代碼類對應(yīng)的方法組成api的格式填入perm_use_content字段;另一方面,如果上述代碼片段為與字符定義相關(guān)的代碼片段,此時(shí)客戶端可以提取該代碼片段中定義的字符串(該字符串可能是權(quán)限名稱),然后將提取出的該字符串填入perm_use_content字段。對于perm_use_content字段,客戶端可以從該代碼片段中讀取該代碼片段的地址(通常在代碼片段的起始位置),然后將讀取到的地址填入perm_use_record字段。
步驟103,針對所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表執(zhí)行匹配以確定所述app編譯后的代碼中使用到權(quán)限的代碼片段以及對應(yīng)的使用權(quán)限。
在本例中,當(dāng)perm_api_list(即第一權(quán)限記錄列表)以及perm_code_list(即第二權(quán)限記錄列表)創(chuàng)建完成后,由于perm_api_list以及perm_code_list中的permrecord(權(quán)限記錄)具有相同的數(shù)據(jù)結(jié)構(gòu),因此在這種情況下,客戶端可以直接針對perm_api_list以及perm_code_list執(zhí)行匹配來確定app編譯后的代碼中使用到權(quán)限的代碼片段以及對應(yīng)的使用權(quán)限。
請參見圖4,圖4為示出的一種針對perm_api_list以及perm_code_list執(zhí)行匹配的處理流程圖,包括以下步驟:
步驟401,遍歷所述第一權(quán)限記錄列表以及所述第二權(quán)限記錄列表,將所述第一權(quán)限記錄列表中的權(quán)限記錄與所述第二權(quán)限記錄列表中的權(quán)限記錄 依次執(zhí)行匹配;
在本例中,客戶端在遍歷之前,可以基于相同的排序方法,針對perm_api_list以及perm_code_list中的permrecord進(jìn)行排序,排序完成后,客戶端可以遍歷perm_api_list以及perm_code_list,將perm_api_list以及perm_code_list中的permrecord的各字段逐一進(jìn)行內(nèi)容匹配。
其中,由于perm_api_list以及perm_code_list中permrecord的部分字段為空值,因此在匹配的過程中,如果perm_api_list或者perm_code_list中permrecord的某一個(gè)字段為空值,可以直接順序匹配下一個(gè)字段。
步驟402,當(dāng)所述第一權(quán)限記錄列表中的任一權(quán)限記錄與所述第二權(quán)限記錄列表中的任一權(quán)限記錄包括至少一個(gè)記錄的信息完全匹配的字段時(shí),確定二者匹配;
在本例中,客戶端在將perm_api_list以及perm_code_list中的permrecord的各字段逐一進(jìn)行內(nèi)容匹配的過程中,一旦perm_api_list中任一permrecord,與perm_code_list中的任一permrecord包括至少一個(gè)記錄的信息完全匹配的字段時(shí),即二者至少包含一個(gè)內(nèi)容相同的字段時(shí),此時(shí)客戶端可以確定這兩個(gè)permrecord為相同的permrecord。
步驟403,針對所述第一權(quán)限記錄列表以及所述第二權(quán)限記錄列表中相匹配的權(quán)限記錄中各字段記錄的信息進(jìn)行合并,生成對應(yīng)的權(quán)限使用記錄列表,以基于該權(quán)限使用記錄列表確定所述app編譯后的代碼中使用到權(quán)限的代碼片段的地址以及對應(yīng)的使用權(quán)限的信息。
在本例中,當(dāng)perm_api_list以及perm_code_list遍歷完成,客戶端完成整個(gè)匹配過程后,此時(shí)客戶端可以將perm_api_list以及perm_code_list中確定相同的permrecord中各字段記錄的信息進(jìn)行合并,生成最終的權(quán)限使用記錄列表。
在本例中,該權(quán)限使用記錄列表可以記為perm_used_list,該列表中的permrecord即為信息合并后的各permrecord。在這些permrecord中,各字段記錄的信息,即為app的源代碼中使用到的內(nèi)部權(quán)限的信息。后續(xù),客戶 端可以基于該列表中各permrecord記錄的信息,來對app的源代碼中使用的內(nèi)部權(quán)限進(jìn)行監(jiān)控??蛻舳送ㄟ^解析該列表中各permrecord記錄的信息,就可以確定出app的源代碼中使用到權(quán)限的代碼片段的地址以及該代碼片段所使用到的權(quán)限的信息,以方便開發(fā)人員對app代碼中使用到的內(nèi)部權(quán)限進(jìn)行管控。
以下結(jié)合android系統(tǒng)的應(yīng)用場景通過具體的應(yīng)用實(shí)例對本申請的技術(shù)方案進(jìn)行說明。
在本例中,假設(shè)客戶端需要對android系統(tǒng)中的某一app源代碼中使用的內(nèi)部權(quán)限進(jìn)行監(jiān)控。
在初始狀態(tài)下,客戶端可以在指定目錄讀取android系統(tǒng)中的api文檔,然后解析該api文檔來獲取android系統(tǒng)中定義的全部權(quán)限的信息,并按照以下數(shù)據(jù)結(jié)構(gòu)根據(jù)解析出的權(quán)限的信息生成permrecord:
{
perm_name:權(quán)限名稱
perm_use_type:權(quán)限的使用方式
perm_use_content:權(quán)限的使用信息
perm_use_record:使用權(quán)限的代碼片段地址
}
其中,以上數(shù)據(jù)結(jié)構(gòu)中各字段記錄的信息的內(nèi)容不再贅述。
1)創(chuàng)建perm_api_list(即第一權(quán)限記錄列表)
假設(shè)api文檔中包括如下片段:
permission:android.permission.read_phone_state
1callers:
<android.telephony.telephonymanager:java.lang.stringgetsubscriberid()>
其中,read_phone_state為api中定義的“讀取電話狀態(tài)”的系統(tǒng)權(quán)限。android.telephony.telephonymanager:java.lang.stringgetsubscriberid()為api文檔定義的可以使用權(quán)限r(nóng)ead_phone_state的api。
客戶端可以通過解析上述片段創(chuàng)建perm_api_list,其中創(chuàng)建過程不再贅述。
其中,針對以上代碼片段,客戶端可以將權(quán)限名稱填入perm_name字段。
將perm_use_type字段的使用方式記錄為“api”。
將android.telephony.telephonymanager:java.lang.stringgetsubscriberid()填入perm_use_content字段。
perm_use_record字段填入空值null。
最終創(chuàng)建完成的第一permrecord如下所示:
{
perm_name:android.permission.read_phone_state
perm_use_type:api
perm_use_content:android.telephony.telephonymanager:java.lang.stringgetsubscriberid()
perm_use_record:null
}
2)創(chuàng)建perm_code_list(即第二權(quán)限記錄列表)
假設(shè)客戶端查找到的與權(quán)限使用相關(guān)的代碼片段如下所示:
getoriginalimsi(landroid/content/context;)ljava/lang/string;
ivk:android.telephony.telephonymanager:getsubscriberid
以上代碼片段為對外函數(shù)調(diào)用相關(guān)的代碼片段,在該代碼片段中,getoriginalimsi(landroid/content/context;)為該代碼段的地址,在該代碼片段中還包含代碼類android.telephony.telephonymanager和java.lang.string,以及與以上代碼類對應(yīng)的函數(shù)方法getsubscriberid()。
客戶端可以通過上述代碼片段中記錄的與權(quán)限相關(guān)的信息創(chuàng)建perm_code_list,其中創(chuàng)建過程不再贅述在這種情況下。
其中,針對以上代碼片段,客戶端可以在perm_name字段以及perm_use_type中分別填入空值null。
客戶端提取該代碼片段中的代碼類android.telephony.telephonymanager 和java.lang.string,以及函數(shù)方法getsubscriberid(),然后將上述代碼類和函數(shù)方法組成api的格式填入perm_use_content字段。
客戶端可以提取地址getoriginalimsi(landroid/content/context;),將上述代碼片段的地址填入perm_use_record字段。
最終創(chuàng)建完成的第二permrecord可以如下所示:
{
perm_name:null
perm_use_type:null
perm_use_content:android.telephony.telephonymanager:java.lang.stringgetsubscriberid()
perm_use_record:getoriginalimsi(landroid/content/context;)}
3)遍歷匹配perm_api_list和perm_code_list
在本例中,客戶端在遍歷perm_api_list和perm_code_list中的permrecord進(jìn)行匹配的過程中,在匹配以上示出的第一permrecord和第二permrecord時(shí),由于第一permrecord和第二permrecord中perm_use_content字段記錄的內(nèi)容完全相同,因此客戶端可以對第一permrecord和第二permrecord各字段記錄的信息進(jìn)行合并,合并后的permrecord如下所示:
{
perm_name:android.permission.read_phone_state
perm_use_type:api
perm_use_content:android.telephony.telephonymanager:java.lang.stringgetsubscriberid()
perm_use_record:null
}
此時(shí),以上合并后得到的permrecord,即為最終創(chuàng)建生成的perm_used_list中的permrecord,客戶端通過解析該permrecord中記錄的信息,就可以確定在當(dāng)前app的源代碼中存在使用了系統(tǒng)權(quán)限r(nóng)ead_phone_state的代碼片段,并且可以相應(yīng)的確定出該代碼片段的地 址為getoriginalimsi(landroid/content/context;)。
在以上實(shí)施例中,通過基于app使用的外部權(quán)限的信息創(chuàng)建第一權(quán)限記錄列表,以及基于app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段中記錄的與權(quán)限使用相關(guān)的信息創(chuàng)建第二權(quán)限記錄列表,并為第一權(quán)限記錄列表與第二權(quán)限記錄列表中的權(quán)限記錄定義相同的數(shù)據(jù)結(jié)構(gòu),然后通過針對第一權(quán)限記錄列表與第二權(quán)限記錄列表執(zhí)行匹配來確定app編譯后的代碼中使用到權(quán)限的代碼片段以及對應(yīng)的使用權(quán)限,從而實(shí)現(xiàn)了可以針對app代碼中使用到的內(nèi)部權(quán)限更加便利的進(jìn)行管控。
與上述方法實(shí)施例相對應(yīng),本申請還提供了裝置的實(shí)施例。
請參見圖5,本申請?zhí)岢鲆环Napp內(nèi)部權(quán)限的檢測裝置50,應(yīng)用于客戶端;其中,請參見圖6,作為承載所述客戶端的電子設(shè)備所涉及的硬件架構(gòu)中,通常包括cpu、內(nèi)存、非易失性存儲(chǔ)器、網(wǎng)絡(luò)接口以及內(nèi)部總線等;以軟件實(shí)現(xiàn)為例,所述app內(nèi)部權(quán)限的檢測裝置50通??梢岳斫鉃榧虞d在內(nèi)存中的計(jì)算機(jī)程序,通過cpu運(yùn)行之后形成的軟硬件相結(jié)合的邏輯裝置,所述裝置50包括:
第一獲取模塊501,用于獲取app使用的外部權(quán)限,并基于所述外部權(quán)限的信息創(chuàng)建第一權(quán)限記錄列表;
第二獲取模塊502,用于獲取所述app編譯后的代碼中與權(quán)限使用相關(guān)的代碼片段,并基于所述代碼片段中記錄的與權(quán)限使用相關(guān)的信息創(chuàng)建第二權(quán)限記錄列表;其中,所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表中的權(quán)限記錄數(shù)據(jù)結(jié)構(gòu)相同;
匹配模塊503,用于針對所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表執(zhí)行匹配以確定所述app編譯后的代碼中使用到權(quán)限的代碼片段以及對應(yīng)的使用權(quán)限。
在本例中,所述第一權(quán)限記錄列表與所述第二權(quán)限記錄列表中的權(quán)限記錄的數(shù)據(jù)結(jié)構(gòu)至少包括以下字段:
權(quán)限名稱字段,用于記錄權(quán)限名稱;
權(quán)限類型字段,用于記錄所述權(quán)限的使用方式;所述使用方式包括基于api使用或基于權(quán)限名稱使用;
權(quán)限內(nèi)容字段,用于記錄所述權(quán)限的使用信息;所述使用信息包括以下信息中的任一:使用所述權(quán)限的api、所述權(quán)限名稱,使用所述權(quán)限的代碼類和與該代碼類對應(yīng)的代碼方法;
權(quán)限使用記錄字段,用于記錄使用所述權(quán)限的代碼片段的地址。
在本例中,所述第一獲取模塊501具體用于:
讀取app的權(quán)限配置列表以獲取所述app使用的外部權(quán)限名稱;
解析系統(tǒng)文檔獲取系統(tǒng)定義的全部權(quán)限的信息;
在所述系統(tǒng)定義的全部權(quán)限的信息中查找與所述外部權(quán)限名稱對應(yīng)的外部權(quán)限的信息。
在本例中,所述第二獲取模塊502具體用于:
解析所述app編譯后的代碼;
查找所述app編譯后的代碼中與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段;
將查找到的所述與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段作為與權(quán)限使用相關(guān)的代碼片段進(jìn)行獲取。
在本例中,所述第二獲取模塊502進(jìn)一步用于:
在將查找到的所述與外部函數(shù)調(diào)用以及字符定義相關(guān)的代碼片段作為與權(quán)限使用相關(guān)的代碼片段進(jìn)行獲取之前,針對查找到的代碼片段進(jìn)行代碼識別;過濾查找到的代碼片段中與權(quán)限無關(guān)的代碼片段。
在本例中,所述匹配模塊503具體用于:
遍歷所述第一權(quán)限記錄列表以及所述第二權(quán)限記錄列表,將所述第一權(quán)限記錄列表中的權(quán)限記錄與所述第二權(quán)限記錄列表中的權(quán)限記錄依次執(zhí)行匹配;
當(dāng)所述第一權(quán)限記錄列表中的任一權(quán)限記錄與所述第二權(quán)限記錄列表中的任一權(quán)限記錄包括至少一個(gè)記錄的信息完全匹配的字段時(shí),確定二者匹配;
針對所述第一權(quán)限記錄列表以及所述第二權(quán)限記錄列表中相匹配的權(quán)限記錄中各字段記錄的信息進(jìn)行合并,生成對應(yīng)的權(quán)限使用記錄列表,以基于該權(quán)限使用記錄列表確定所述app編譯后的代碼中使用到權(quán)限的代碼片段的地址以及對應(yīng)的使用權(quán)限的信息。
本領(lǐng)域技術(shù)人員在考慮說明書及實(shí)踐這里公開的發(fā)明后,將容易想到本申請的其它實(shí)施方案。本申請旨在涵蓋本申請的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本申請的一般性原理并包括本申請未公開的本技術(shù)領(lǐng)域中的公知常識或慣用技術(shù)手段。說明書和實(shí)施例僅被視為示例性的,本申請的真正范圍和精神由下面的權(quán)利要求指出。
應(yīng)當(dāng)理解的是,本申請并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并且可以在不脫離其范圍進(jìn)行各種修改和改變。本申請的范圍僅由所附的權(quán)利要求來限制。
以上所述僅為本申請的較佳實(shí)施例而已,并不用以限制本申請,凡在本申請的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請保護(hù)的范圍之內(nèi)。