发明内容
本申请提出一种APP内部权限的检测方法,该方法包括:
获取APP使用的外部权限,并基于所述外部权限的信息创建第一权限记录列表;
获取所述APP编译后的代码中与权限使用相关的代码片段,并基于所述代码片段中记录的与权限使用相关的信息创建第二权限记录列表;其中,所述第一权限记录列表与所述第二权限记录列表中的权限记录数据结构相同;
针对所述第一权限记录列表与所述第二权限记录列表执行匹配以确定所述APP编译后的代码中使用到权限的代码片段以及对应的使用权限。
可选的,所述第一权限记录列表与所述第二权限记录列表中的权限记录的数据结构至少包括以下字段:
权限名称字段,用于记录权限名称;
权限类型字段,用于记录所述权限的使用方式;所述使用方式包括基于API使用或基于权限名称使用;
权限内容字段,用于记录所述权限的使用信息;所述使用信息包括以下信息中的任一:使用所述权限的API、所述权限名称,使用所述权限的代码类和与该代码类对应的代码方法;
权限使用记录字段,用于记录使用所述权限的代码片段的地址。
可选的,所述获取APP使用的外部权限包括:
读取APP的权限配置列表以获取所述APP使用的外部权限名称;
解析系统文档获取系统定义的全部权限的信息;
在所述系统定义的全部权限的信息中查找与所述外部权限名称对应的外部权限的信息。
可选的,所述获取所述APP编译后的代码中与权限使用相关的代码片段包括:
解析所述APP编译后的代码;
查找所述APP编译后的代码中与外部函数调用以及字符定义相关的代码片段;
将查找到的所述与外部函数调用以及字符定义相关的代码片段作为与权限使用相关的代码片段进行获取。
可选的,所述将查找到的所述与外部函数调用以及字符定义相关的代码片段作为与权限使用相关的代码片段进行获取之前,还包括:
针对查找到的代码片段进行代码识别;
过滤查找到的代码片段中与权限无关的代码片段。
可选的,所述针对所述第一权限记录列表与所述第二权限记录列表执行匹配以确定所述APP编译后的代码中使用到权限的代码片段以及对应的使用权限包括:
遍历所述第一权限记录列表以及所述第二权限记录列表,将所述第一权限记录列表中的权限记录与所述第二权限记录列表中的权限记录依次执行匹配;
当所述第一权限记录列表中的任一权限记录与所述第二权限记录列表中的任一权限记录包括至少一个记录的信息完全匹配的字段时,确定二者匹配;
针对所述第一权限记录列表以及所述第二权限记录列表中相匹配的权限记录中各字段记录的信息进行合并,生成对应的权限使用记录列表,以基于该权限使用记录列表确定所述APP编译后的代码中使用到权限的代码片段的地址以及对应的使用权限的信息。
本申请还提出一种APP内部权限的检测装置,该装置包括:
第一获取模块,用于获取APP使用的外部权限,并基于所述外部权限的信息创建第一权限记录列表;
第二获取模块,用于获取所述APP编译后的代码中与权限使用相关的代码片段,并基于所述代码片段中记录的与权限使用相关的信息创建第二权限记录列表;其中,所述第一权限记录列表与所述第二权限记录列表中的权限记录数据结构相同;
匹配模块,用于针对所述第一权限记录列表与所述第二权限记录列表执行匹配以确定所述APP编译后的代码中使用到权限的代码片段以及对应的使用权限。
可选的,所述第一权限记录列表与所述第二权限记录列表中的权限记录的数据结构至少包括以下字段:
权限名称字段,用于记录权限名称;
权限类型字段,用于记录所述权限的使用方式;所述使用方式包括基于API使用或基于权限名称使用;
权限内容字段,用于记录所述权限的使用信息;所述使用信息包括以下信息中的任一:使用所述权限的API、所述权限名称,使用所述权限的代码类和与该代码类对应的代码方法;
权限使用记录字段,用于记录使用所述权限的代码片段的地址。
可选的,所述第一获取模块具体用于:
读取APP的权限配置列表以获取所述APP使用的外部权限名称;
解析系统文档获取系统定义的全部权限的信息;
在所述系统定义的全部权限的信息中查找与所述外部权限名称对应的外部权限的信息。
可选的,所述第二获取模块具体用于:
解析所述APP编译后的代码;
查找所述APP编译后的代码中与外部函数调用以及字符定义相关的代码片段;
将查找到的所述与外部函数调用以及字符定义相关的代码片段作为与权限使用相关的代码片段进行获取。
可选的,所述第二获取模块进一步用于:
在将查找到的所述与外部函数调用以及字符定义相关的代码片段作为与权限使用相关的代码片段进行获取之前,针对查找到的代码片段进行代码识别;过滤查找到的代码片段中与权限无关的代码片段。
可选的,所述匹配模块具体用于:
遍历所述第一权限记录列表以及所述第二权限记录列表,将所述第一权限记录列表中的权限记录与所述第二权限记录列表中的权限记录依次执行匹配;
当所述第一权限记录列表中的任一权限记录与所述第二权限记录列表中的任一权限记录包括至少一个记录的信息完全匹配的字段时,确定二者匹配;
针对所述第一权限记录列表以及所述第二权限记录列表中相匹配的权限记录中各字段记录的信息进行合并,生成对应的权限使用记录列表,以基于该权限使用记录列表确定所述APP编译后的代码中使用到权限的代码片段的地址以及对应的使用权限的信息。
本申请中,通过基于APP使用的外部权限的信息创建第一权限记录列表,以及基于APP编译后的代码中与权限使用相关的代码片段中记录的与权限使用相关的信息创建第二权限记录列表,并为第一权限记录列表与第二权限记录列表中的权限记录定义相同的数据结构,然后通过针对第一权限记录列表与第二权限记录列表执行匹配来确定APP编译后的代码中使用到权限的代码片段以及对应的使用权限,从而实现了可以针对APP代码中使用到的内部权限更加便利的进行管控。
具体实施方式
在相关技术中,针对Android系统各类权限的使用和管控,通常是通过第三方的权限监控软件来实现。然而通过第三方的权限监控软件,仅能对APP(Application,应用)使用的外部权限进行监控,并不能对APP代码中实际使用到的内部权限进行监控,因此已无法满足开发人员在实际应用中针对APP代码中使用到的内部权限进行管控的需求。
有鉴于此,本申请提出一种APP内部权限的检测方法,通过基于APP使用的外部权限的信息创建第一权限记录列表,以及基于APP编译后的代码中与权限使用相关的代码片段中记录的与权限使用相关的信息创建第二权限记录列表,并为第一权限记录列表与第二权限记录列表中的权限记录定义相同的数据结构,然后通过针对第一权限记录列表与第二权限记录列表执行匹配来确定APP编译后的代码中使用到权限的代码片段以及对应的使用权限,从而实现了可以针对APP代码中使用到的内部权限更加便利的进行管控。
下面通过具体实施例并结合具体的应用场景对本申请进行描述。
请参考图1,图1是本申请一实施例提供的一种APP内部权限的检测方法,应用于客户端,所述方法执行以下步骤:
步骤101,获取APP使用的外部权限,并基于所述外部权限的信息创建第一权限记录列表;
上述客户端可以包括面向APP开发人员提供针对系统中的APP进行内部权限监控服务的客户端软件,开发人员可以通过该客户端软件来监控APP的源代码中使用到的权限。
在本例中,客户端在获取APP使用的外部权限时,可以通过解析该APP的权限配置列表,来获取该APP所使用的外部权限名称,然后在系统定义的全部权限的信息中查找与该外部权限名称对应的外部权限信息。
请参见图2,图2为示出的一种获取APP外部使用权限的处理流程图,包括以下步骤:
步骤201,读取APP的权限配置列表以获取所述APP使用的外部权限名称;
在本例中,客户端可以在系统目录中读取该APP的权限配置列表,其中,在该权限配置列表中记录了该APP使用到的所有外部权限的名称。当客户端读取到该APP的权限配置列表后,可以解析该权限配置列表来获取该APP所使用的所有外部权限名称。当然,在实际应用中,在获取APP使用的外部权限时,也可以由开发人员编辑查询指令来手动查询APP所使用的外部权限。
步骤202,解析系统文档获取系统定义的全部权限的信息;
在本例中,上述权限的信息可以包括权限的名称、权限的使用方式以及权限的使用信息等。上述系统文档可以是Android系统中的API(ApplicationProgramming Interface,应用程序编程接口)文档,在API文档中记录了Android系统定义的全部权限的名称,以及使用这些权限的API。
其中,Android系统定义的权限使用方法通常包括基于API来使用权限和基于权限名称来使用权限两种。
当API文档中针对某一权限定义了使用该权限的API时,那么该权限的使用方法则为基于API来使用,该权限的使用信息则可以包括使用该权限的API。当API文档中针对某一权限未定义使用该权限的API,或者明确记载了该权限基于权限名称来使用时,那么该权限的使用方法则为基于权限名称来使用,该权限的使用信息则可以包括该权限的使用名称(即该权限的规范名称)。
客户端可以在系统的指定目录中读取API文档,然后解析API文档中定义的上述信息,来获取Android系统定义的全部权限的信息。
步骤203,在所述系统定义的全部权限的信息中查找与所述外部权限名称对应的外部权限的信息。
在本例中,当客户端通过解析API文档获取到Android系统定义的全部权限的信息后,可以在Android系统定义的全部权限的信息中来查找与APP所使用的外部权限名称对应的权限信息(APP使用到的外部权限的信息为Android系统定义的全部权限的信息的子集),此时查找到的权限信息即为该APP所使用到的外部权限的信息。
在本例中,当客户端基于步骤201至203的技术方案,获取到APP使用的外部权限时,此时可以基于APP使用的外部权限的信息来创建第一权限记录列表。
在示出的一种实施方式中,上述第一权限记录列表可以记为perm_api_list。客户端在基于APP使用的外部权限的信息来创建perm_api_list时,首先可以基于开发人员预定义的数据结构,针对每一个外部权限生成一个对应的PermRecord(权限记录)。
上述PermRecord的数据结构可以是开发人员预定义的一种大字段结构,可以包括perm_name字段(权限名称字段)、perm_use_type字段(权限类型字段)、perm_use_content字段(权限内容字段)以及perm_use_record字段(权限使用记录字段)。
其中:
perm_name字段,用于记录权限名称。
perm_use_type字段,用于记录权限的使用方式;在Android系统中定义的权限使用方式包括基于API使用或基于权限名称使用两种。
perm_use_content字段,用于记录权限的使用信息;该使用信息可以包括使用该权限的API、该权限的使用名称(即该权限的名称),APP的源代码中使用该权限的代码类以及与该代码类对应的代码方法。
perm_use_record字段,用于记录使用该权限的代码片段的地址。
客户端在针对任一外部权限生成对应的PermRecord时,可以将权限名称填入perm_name字段。当API文档中针对该权限定义了使用该权限的API时,可以在perm_use_type字段中将该权限的使用方式记录为“API”(表示基于API来使用),并在perm_use_content字段中记录使用该权限的API。当API文档中针对该权限未定义使用该权限的API,或者明确记载了该权限基于权限名称来使用时,可以在perm_use_type字段中将该权限的使用方式记录为“perm name”(表示基于权限名称来使用),并在perm_use_content字段中记录该权限的使用名称。
其中,需要指出的是,API文档中可能针对单一权限定义多个使用该权限的API,针对这种情况,可以针对单一权限创建多个PermRecord,每一个PermRecord中的perm_use_content字段,可以分别记录一个使用该权限的API。
另外,由于Android系统的API文档中,仅仅定义了全部权限的名称、使用方式以及使用信息等信息,并不包含使用权限的代码片段的地址,因此客户端为APP使用的所有外部权限生成的PermRecord中的perm_use_record字段可以为空值。
当然,在实际应用中,上述数据结构中的字段,并不局限于perm_name字段、perm_use_type字段、perm_use_content字段以及perm_use_record字段等,在实际应用中,开发人员还可以将以上四种字段作为上述数据结构中的核心字段,然后基于实际的需求,在以上四种字段的基础上进行字段扩展。
当客户端基于以上数据结构,为所有外部权限生成了对应的PermRecord后,可以基于为所有权限生成的PermRecord来创建上述perm_api_list。此时在创建完成的perm_api_list中,可以包括若干条PermRecord,每一条PermRecord都对应一个APP所使用的外部权限。
在示出的另一种实施方式中,客户端基于APP使用的外部权限的信息来创建perm_api_list之前,客户端首先可以基于开发人员预定义的上述数据结构,针对解析API文档获取到的由Android系统定义的全部权限的信息,分别生成一个对应的PermRecord。
其中,该PermRecord的数据结构与客户端在为APP所使用的外部权限创建PermRecord时,所使用的数据结构相同。
当客户端基于以上数据结构,针对Android系统定义的全部权限的信息分别生成了一个对应的PermRecord后,可以基于为Android系统定义的全部权限的信息生成的PermRecord来创建一个权限记录索引列表。
在本例中,该权限记录索引列表可以记为perm_dict。
其中,在创建完成的该perm_dict中,包括Android系统定义的所有权限的名称与客户端为Android系统定义的所有权限生成的PermRecord之间的对应关系。
当客户端基于APP使用的外部权限的信息来创建perm_api_list时,可以在perm_dict中查找与APP使用的外部权限的名称来查找对应的PermRecord,然后基于查找到的PermRecord来创建perm_api_list。
步骤102,获取所述APP编译后的代码中与权限使用相关的代码片段,并基于所述代码片段中记录的与权限使用相关的信息创建第二权限记录列表;其中,所述第一权限记录列表与所述第二权限记录列表中的权限记录数据结构相同;
在本例中,当客户端基于APP所使用的所有外部权限的信息创建了perm_api_list(即第一权限记录列表)后,此时客户端还可以获取APP编译后的代码中与权限使用相关的代码片段,并基于这些代码片段中记录的与权限使用相关的信息,来创建第二权限记录列表。在本例中,第二权限记录列表可以记为perm_api_list。
请参见图3,图3为示出的一种获取所述APP编译后的代码中与权限使用相关的代码片段的处理流程图,包括以下步骤:
步骤301,解析所述APP编译后的代码;
在本例中,客户端在解析APP编译后的源代码时,可以通过第三方的代码解析器,或者客户端内置的代码解析模块来完成。
步骤302,查找所述APP编译后的代码中与外部函数调用以及字符定义相关的代码片段;
步骤303,将查找到的所述与外部函数调用以及字符定义相关的代码片段作为与权限使用相关的代码片段进行获取。
在本例中,Android系统定义的权限使用方法通常包括基于API来使用权限和基于权限名称来使用权限两种。
一方面,对于基于API来使用权限的这种方式,由于API通常会基于外部函数来进行调用,因此对于APP源代码中与外部函数调用相关的代码片段来说,则很可能通过调用API使用了系统权限。在这种情况下,客户端可以解析APP编译后的源代码,查找与外部函数调用相关的代码片段,然后将查找到的代码片段作为与权限使用相关的代码片段进行获取和保存,
另一方面,对于基于权限名称来使用权限的这种方式,由于Android系统中通常会通过一些字符定义指令来调用权限名称,因此对于APP源代码中与字符定义相关的代码片段来说,则很可能通过字符定义指令定义权限名称使用了系统权限。在这种情况下,客户端可以解析APP编译后的源代码,查找与字符定义相关的代码片段,将查找到的代码片段作为与权限使用相关的代码片段进行获取和保存。
其中,需要指出的是,由于客户端在APP编译后的代码中查找到的与外部函数调用以及字符定义相关的代码片段中,可能会包含一些与权限使用无关的代码,因此客户端在将查找到的与外部函数调用以及字符定义相关的代码片段作为与权限使用相关的代码片段进行获取和保存之前,还可以对查找的代码片段中与权限使用无关的代码片段进行过滤。
在示出的一种实施方式中,客户端在对查找的代码片段中的无效代码片段进行过滤时,可以针对查找到的代码片段进行代码识别,通过代码识别客户端可以识别出查找到的代码片段中的与权限使用无关的代码片段,比如这些代码片段可以包括客户端可以明确识别出的一些与权限使用无关的函数、通用指令,非目标指令,等等。对于识别出的上述与权限使用无关的代码片段,可以由客户端进行过滤,从查找到的代码片段中清除。通过这种方式,可以尽可能的避免查找到的代码片段均为与权限使用相关的代码片段。
在本例中,当客户端基于步骤301至303的技术方案,获取到APP编译后的源代码中与权限使用相关的代码片段后,此时可以基于这些代码片段中记录的与权限使用相关的信息创建第二权限记录列表。
其中,上述第二权限记录列表可以记为perm_code_list。
在示出的一种实施方式中,客户端在基于APP的源代码中与权限相关的代码片段中记录的与权限使用相关的信息创建perm_code_list时,首先可以基于开发人员预定义的数据结构,针对每一个代码片段分别生成一个对应的PermRecord(权限记录)。
其中,需要强调的是,客户端在针对每一个代码片段生成对应的PermRecord时所采用的上述PermRecord的数据结构,与客户端在基于APP所使用的外部权限的信息创建perm_api_list(即第一权限记录列表)时所使用的数据结构相同。在该数据结构中仍然可以包括perm_name字段(权限名称字段)、perm_use_type字段(权限类型字段)、perm_use_content字段(权限内容字段)以及perm_use_record字段(权限使用记录字段),而且这些字段记录的信息保持不变,不再赘述。
客户端在针对任一代码片段生成对应的PermRecord时,可以将权限名称填入perm_name字段。由于上述代码片段中,通常并不会包含权限名称、权限的使用方式等信息,因此perm_name字段和perm_use_type字段可以为空值。对于perm_use_content字段,一方面,如果上述代码片段为与外部函数调用相关的代码片段,此时该代码片段中通常并不包含API,但组成API的代码类以及与该代码类对应的方法却可能会出现在上述代码片段中,因此客户端可以提取该代码片段中调用的代码类,以及与该代码类对应的方法,然后将提取出的代码类与该代码类对应的方法组成API的格式填入perm_use_content字段;另一方面,如果上述代码片段为与字符定义相关的代码片段,此时客户端可以提取该代码片段中定义的字符串(该字符串可能是权限名称),然后将提取出的该字符串填入perm_use_content字段。对于perm_use_content字段,客户端可以从该代码片段中读取该代码片段的地址(通常在代码片段的起始位置),然后将读取到的地址填入perm_use_record字段。
步骤103,针对所述第一权限记录列表与所述第二权限记录列表执行匹配以确定所述APP编译后的代码中使用到权限的代码片段以及对应的使用权限。
在本例中,当perm_api_list(即第一权限记录列表)以及perm_code_list(即第二权限记录列表)创建完成后,由于perm_api_list以及perm_code_list中的PermRecord(权限记录)具有相同的数据结构,因此在这种情况下,客户端可以直接针对perm_api_list以及perm_code_list执行匹配来确定APP编译后的代码中使用到权限的代码片段以及对应的使用权限。
请参见图4,图4为示出的一种针对perm_api_list以及perm_code_list执行匹配的处理流程图,包括以下步骤:
步骤401,遍历所述第一权限记录列表以及所述第二权限记录列表,将所述第一权限记录列表中的权限记录与所述第二权限记录列表中的权限记录依次执行匹配;
在本例中,客户端在遍历之前,可以基于相同的排序方法,针对perm_api_list以及perm_code_list中的PermRecord进行排序,排序完成后,客户端可以遍历perm_api_list以及perm_code_list,将perm_api_list以及perm_code_list中的PermRecord的各字段逐一进行内容匹配。
其中,由于perm_api_list以及perm_code_list中PermRecord的部分字段为空值,因此在匹配的过程中,如果perm_api_list或者perm_code_list中PermRecord的某一个字段为空值,可以直接顺序匹配下一个字段。
步骤402,当所述第一权限记录列表中的任一权限记录与所述第二权限记录列表中的任一权限记录包括至少一个记录的信息完全匹配的字段时,确定二者匹配;
在本例中,客户端在将perm_api_list以及perm_code_list中的PermRecord的各字段逐一进行内容匹配的过程中,一旦perm_api_list中任一PermRecord,与perm_code_list中的任一PermRecord包括至少一个记录的信息完全匹配的字段时,即二者至少包含一个内容相同的字段时,此时客户端可以确定这两个PermRecord为相同的PermRecord。
步骤403,针对所述第一权限记录列表以及所述第二权限记录列表中相匹配的权限记录中各字段记录的信息进行合并,生成对应的权限使用记录列表,以基于该权限使用记录列表确定所述APP编译后的代码中使用到权限的代码片段的地址以及对应的使用权限的信息。
在本例中,当perm_api_list以及perm_code_list遍历完成,客户端完成整个匹配过程后,此时客户端可以将perm_api_list以及perm_code_list中确定相同的PermRecord中各字段记录的信息进行合并,生成最终的权限使用记录列表。
在本例中,该权限使用记录列表可以记为perm_used_list,该列表中的PermRecord即为信息合并后的各PermRecord。在这些PermRecord中,各字段记录的信息,即为APP的源代码中使用到的内部权限的信息。后续,客户端可以基于该列表中各PermRecord记录的信息,来对APP的源代码中使用的内部权限进行监控。客户端通过解析该列表中各PermRecord记录的信息,就可以确定出APP的源代码中使用到权限的代码片段的地址以及该代码片段所使用到的权限的信息,以方便开发人员对APP代码中使用到的内部权限进行管控。
以下结合Android系统的应用场景通过具体的应用实例对本申请的技术方案进行说明。
在本例中,假设客户端需要对Android系统中的某一APP源代码中使用的内部权限进行监控。
在初始状态下,客户端可以在指定目录读取Android系统中的API文档,然后解析该API文档来获取Android系统中定义的全部权限的信息,并按照以下数据结构根据解析出的权限的信息生成PermRecord:
{
perm_name:权限名称
perm_use_type:权限的使用方式
perm_use_content:权限的使用信息
perm_use_record:使用权限的代码片段地址
}
其中,以上数据结构中各字段记录的信息的内容不再赘述。
1)创建perm_api_list(即第一权限记录列表)
假设API文档中包括如下片段:
Permission:android.permission.READ_PHONE_STATE
1Callers:
<android.telephony.TelephonyManager:java.lang.String getSubscriberId()>
其中,READ_PHONE_STATE为API中定义的“读取电话状态”的系统权限。android.telephony.TelephonyManager:java.lang.String getSubscriberId()为API文档定义的可以使用权限READ_PHONE_STATE的API。
客户端可以通过解析上述片段创建perm_api_list,其中创建过程不再赘述。
其中,针对以上代码片段,客户端可以将权限名称填入perm_name字段。
将perm_use_type字段的使用方式记录为“API”。
将android.telephony.TelephonyManager:java.lang.String getSubscriberId()填入perm_use_content字段。
perm_use_record字段填入空值null。
最终创建完成的第一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)创建perm_code_list(即第二权限记录列表)
假设客户端查找到的与权限使用相关的代码片段如下所示:
getOriginalImsi(Landroid/content/Context;)Ljava/lang/String;
IVK:android.telephony.TelephonyManager:getSubscriberId
以上代码片段为对外函数调用相关的代码片段,在该代码片段中,getOriginalImsi(Landroid/content/Context;)为该代码段的地址,在该代码片段中还包含代码类android.telephony.TelephonyManager和java.lang.String,以及与以上代码类对应的函数方法getSubscriberId()。
客户端可以通过上述代码片段中记录的与权限相关的信息创建perm_code_list,其中创建过程不再赘述在这种情况下。
其中,针对以上代码片段,客户端可以在perm_name字段以及perm_use_type中分别填入空值null。
客户端提取该代码片段中的代码类android.telephony.TelephonyManager和java.lang.String,以及函数方法getSubscriberId(),然后将上述代码类和函数方法组成API的格式填入perm_use_content字段。
客户端可以提取地址getOriginalImsi(Landroid/content/Context;),将上述代码片段的地址填入perm_use_record字段。
最终创建完成的第二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进行匹配的过程中,在匹配以上示出的第一PermRecord和第二PermRecord时,由于第一PermRecord和第二PermRecord中perm_use_content字段记录的内容完全相同,因此客户端可以对第一PermRecord和第二PermRecord各字段记录的信息进行合并,合并后的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
}
此时,以上合并后得到的PermRecord,即为最终创建生成的perm_used_list中的PermRecord,客户端通过解析该PermRecord中记录的信息,就可以确定在当前APP的源代码中存在使用了系统权限READ_PHONE_STATE的代码片段,并且可以相应的确定出该代码片段的地址为getOriginalImsi(Landroid/content/Context;)。
在以上实施例中,通过基于APP使用的外部权限的信息创建第一权限记录列表,以及基于APP编译后的代码中与权限使用相关的代码片段中记录的与权限使用相关的信息创建第二权限记录列表,并为第一权限记录列表与第二权限记录列表中的权限记录定义相同的数据结构,然后通过针对第一权限记录列表与第二权限记录列表执行匹配来确定APP编译后的代码中使用到权限的代码片段以及对应的使用权限,从而实现了可以针对APP代码中使用到的内部权限更加便利的进行管控。
与上述方法实施例相对应,本申请还提供了装置的实施例。
请参见图5,本申请提出一种APP内部权限的检测装置50,应用于客户端;其中,请参见图6,作为承载所述客户端的电子设备所涉及的硬件架构中,通常包括CPU、内存、非易失性存储器、网络接口以及内部总线等;以软件实现为例,所述APP内部权限的检测装置50通常可以理解为加载在内存中的计算机程序,通过CPU运行之后形成的软硬件相结合的逻辑装置,所述装置50包括:
第一获取模块501,用于获取APP使用的外部权限,并基于所述外部权限的信息创建第一权限记录列表;
第二获取模块502,用于获取所述APP编译后的代码中与权限使用相关的代码片段,并基于所述代码片段中记录的与权限使用相关的信息创建第二权限记录列表;其中,所述第一权限记录列表与所述第二权限记录列表中的权限记录数据结构相同;
匹配模块503,用于针对所述第一权限记录列表与所述第二权限记录列表执行匹配以确定所述APP编译后的代码中使用到权限的代码片段以及对应的使用权限。
在本例中,所述第一权限记录列表与所述第二权限记录列表中的权限记录的数据结构至少包括以下字段:
权限名称字段,用于记录权限名称;
权限类型字段,用于记录所述权限的使用方式;所述使用方式包括基于API使用或基于权限名称使用;
权限内容字段,用于记录所述权限的使用信息;所述使用信息包括以下信息中的任一:使用所述权限的API、所述权限名称,使用所述权限的代码类和与该代码类对应的代码方法;
权限使用记录字段,用于记录使用所述权限的代码片段的地址。
在本例中,所述第一获取模块501具体用于:
读取APP的权限配置列表以获取所述APP使用的外部权限名称;
解析系统文档获取系统定义的全部权限的信息;
在所述系统定义的全部权限的信息中查找与所述外部权限名称对应的外部权限的信息。
在本例中,所述第二获取模块502具体用于:
解析所述APP编译后的代码;
查找所述APP编译后的代码中与外部函数调用以及字符定义相关的代码片段;
将查找到的所述与外部函数调用以及字符定义相关的代码片段作为与权限使用相关的代码片段进行获取。
在本例中,所述第二获取模块502进一步用于:
在将查找到的所述与外部函数调用以及字符定义相关的代码片段作为与权限使用相关的代码片段进行获取之前,针对查找到的代码片段进行代码识别;过滤查找到的代码片段中与权限无关的代码片段。
在本例中,所述匹配模块503具体用于:
遍历所述第一权限记录列表以及所述第二权限记录列表,将所述第一权限记录列表中的权限记录与所述第二权限记录列表中的权限记录依次执行匹配;
当所述第一权限记录列表中的任一权限记录与所述第二权限记录列表中的任一权限记录包括至少一个记录的信息完全匹配的字段时,确定二者匹配;
针对所述第一权限记录列表以及所述第二权限记录列表中相匹配的权限记录中各字段记录的信息进行合并,生成对应的权限使用记录列表,以基于该权限使用记录列表确定所述APP编译后的代码中使用到权限的代码片段的地址以及对应的使用权限的信息。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。