CN114238948A - 一种应用程序检测方法、装置、电子设备及存储介质 - Google Patents
一种应用程序检测方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN114238948A CN114238948A CN202111573217.8A CN202111573217A CN114238948A CN 114238948 A CN114238948 A CN 114238948A CN 202111573217 A CN202111573217 A CN 202111573217A CN 114238948 A CN114238948 A CN 114238948A
- Authority
- CN
- China
- Prior art keywords
- function
- information
- program
- risk
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/54—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
Abstract
本申请提供一种应用程序检测方法、装置、电子设备及存储介质。其中,应用程序检测方法包括:利用注入目标Android程序的进程中的脚本对目标Android程序中调用的函数进行监听,获取进程中的待检测信息,待检测信息中包括每个被调用的函数的属性信息;利用脚本,根据待检测信息计算函数的风险系数,并根据风险系数判断目标Android程序是否存在风险问题。该方法利用脚本对目标Android程序调用的函数进行监听,获取进程的待检测信息,然后根据待检测信息来判断目标Android程序是否存在风险问题,从而实现了应用程序风险问题的检测。该方法提供了一种动态检测方法,避免应用程序出现隐私和合规问题。
Description
技术领域
本申请涉及计算机技术领域,具体而言,涉及一种应用程序检测方法、装置、电子设备及存储介质。
背景技术
随着网络技术的发展,应用程序的风险问题已经越来越受到人们的重视,个人信息保护已经成为全球化趋势。监管部门也加强了个人信息保护的行动,推出了相关法律法规,如果应用程序违反法律法规,将导致下架或无法上架的风险。
因此在应用程序上架前,需要对应用程序进行风险问题的检测,保证应用程序不存在风险问题,才能够进行上架。现有的应用程序检测手段主要通过关键字对程序代码进行匹配,但该方式发现风险问题的准确率有待提高。
发明内容
本申请实施例的目的在于提供一种应用程序检测方法、装置、电子设备及存储介质,以解决上述技术问题。
为实现上述目的,本申请提供如下技术方案:
第一方面,本申请实施例提供一种应用程序检测方法,包括:利用注入目标Android程序的进程中的脚本对所述目标Android程序中调用的函数进行监听,获取所述进程的待检测信息,所述待检测信息中包括每个被调用的函数的属性信息;利用所述脚本,根据所述待检测信息计算所述函数的风险系数,并根据所述风险系数判断所述目标Android程序是否存在风险问题。
上述方法在目标Android程序的运行过程中,利用注入到目标Android程序的进程中的脚本来对函数进行监听,并获取到进程中的待检测信息,该待检测信息中包括每个被调用的函数的属性信息,利用脚本可以根据待检测信息计算函数的风险系数,从而实现了目标Android程序的风险问题检测。该方法提供了一种脚本检测计算风险的方式,通过脚本注入,显著提高了检测效率,避免程序代码的泄露风险,使用方便。
在第一方面的一种实现方式中,所述利用所述脚本,根据所述待检测信息计算所述函数的风险系数,包括:利用所述脚本,按照预设的调用规则以及所述待检测信息对所述函数进行分组,获得分别满足各个所述调用规则的函数组,获得分别满足各个所述调用规则的函数组;根据所述待检测信息计算各个所述函数组中所述函数的风险系数,其中,各个所述函数组的风险系数计算方式互不相同。
上述实现方式中,利用注入的脚本,可以按照预设的调用规则来对被调用的函数进行分组,获得分别满足各个调用规则的函数组,调用规则可以包括例如并发调用、敏感调用等等规则,根据待检测信息可以计算各个函数组下各个函数的风险系数,风险系数的计算方式可以为函数的调用次数和次数阈值的比值,也可以直接为调用次数,各个函数组的风险系数计算方式互不相同,从而能够快速计算各个函数组下各个函数的风险系数,反映风险问题。
在第一方面的一种实现方式中,所述函数的属性信息包括以下至少一种:所述函数被调用时所述目标Android程序是否处于后台状态;所述函数的名称;所述函数的调用开始时间;所述函数的执行时间长度;以及,所述函数自身的堆栈信息。
在上述实现方式中,待检测信息包括每个被调用的函数的属性信息,这些属性信息可以包括函数被调用时目标Android程序是否处于后台、名称、调用开始时间、执行时间长度以及函数自身的堆栈信息,可以帮助正确对函数进行分组,以更好地完成风险问题的检测,开发人员还可以针对组内的函数中存在的风险问题进行整改,以更好地完善代码。
在第一方面的一种实现方式中,所述根据所述风险系数判断所述目标Android程序是否存在风险问题,包括:根据各个函数组中所述函数的风险系数和与所述函数组对应的风险系数阈值,确定所述目标Android程序是否存在风险项;其中,若存在风险项则表明所述目标Android程序存在风险问题,若不存在风险项则表明所述目标Android程序不存在风险问题。
在上述实现方式中,根据各个函数组中计算得到的函数的风险系数和函数组对应的风险阈值,从而可以确定每个组内是否存在风险项,风险项即可以表征目标Android程序的风险问题,从而对风险项进行整改,完善代码。
在第一方面的一种实现方式中,在所述根据各个函数组中所述函数的风险系数和与所述函数组对应的风险系数阈值,确定所述目标Android程序是否存在风险项之后,包括:获取所述目标Android程序中所述风险项的权重;根据所述风险项的权重计算所述目标Android程序的风险值;根据所述风险值确定所述目标Android程序的风险等级。
在上述实现方式中,通过确定目标Android程序中的风险项之后,还可以通过获取每一风险项的权重,根据风险项的权重来计算得到目标Android程序的风险值,最后根据风险值确定当前目标Android程序的等级。利用风险项的权重计算可以准确地对目标Android程序的等级进行划分,开发人员可以针对等级来确认目标Android程序的风险问题的严重性,以及后续整改项目的人力、时间投入。
在第一方面的一种实现方式中,在所述利用注入目标Android程序进程中的脚本对函数进行监听之前,所述方法还包括:利用Hook框架提供的目标接口与所述目标Android程序建立通信通道;通过所述通信通道将所述脚本注入到所述目标Android程序的进程中。
在上述实现方式中,Hook框架可以提供目标接口,用于和目标Android程序之间建立通信通道,从而可以快速地利用通信通道将脚本注入到进程中,从而实现对函数的监听。
在第一方面的一种实现方式中,所述方法还包括:统计各个函数组中所述函数的风险系数的计算结果,生成所述目标Android程序的风险报告。
在上述实现方式中,还可以将各个函数组中的各项函数的风险系数的计算结果进行统计,生成风险报告,该风险报告可以将所有函数关于风险系数的计算结果进行一个直观的展示,有利于开发人员清晰地发现风险问题,并作出改进。
第二方面,本申请实施例提供一种应用程序检测方法,包括:利用注入目标Android程序的进程中的脚本对所述目标Android程序中调用的函数进行监听,获取所述进程的待检测信息,所述待检测信息中包括每个被调用的函数的属性信息;获取所述目标Android程序的进程号;向服务端发送所述进程号和所述待检测信息,以使所述服务端根据所述待检测信息计算所述函数的风险系数,并根据所述风险系数判断所述目标Android程序是否存在风险问题。
上述方法在目标Android程序的运行过程中,在获取到进程中的待检测信息之后,通过获取目标Android程序的进程号,然后向服务端发送进程号和待检测信息,服务端从而可以利用进程号区分当前检测的应用程序,并能够根据待检测信息判断目标Android程序是否存在风险问题,提供了服务端对目标Android程序的风险检测方法,降低了脚本编写的难度,只需在脚本中完成待检测信息的上报过程即可。
第三方面,本申请实施例提供一种应用程序检测方法,包括:在目标iOS程序启动后,通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息;根据所述待检测信息确定所述目标iOS程序是否存在风险问题。
上述方法在目标iOS程序启动之后,通过预先注入的动态库来对敏感函数进行监听,敏感函数为应用程序中涉及隐私合规问题相关的函数,然后获取与敏感函数相关的待检测信息,根据待检测信息确定目标iOS程序中是否存在风险问题。通过预先注入的动态库来实现对应用程序运行过程中的风险问题检测,实现了风险问题的动态检测,从而提高了风险问题的检测准确率。
在第三方面的一种实现方式中,所述敏感函数包括涉及敏感权限的第一类函数,所述第一类函数为Objective-C函数,所述待检测信息包括堆栈信息,所述通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息,包括:利用所述动态库在所述第一类函数被调用时动态改变所述第一类函数的方法编号和方法实现的对应关系,将所述第一类函数的方法实现指向所述动态库中对应的第一类替换函数;执行所述第一类替换函数,所述第一类替换函数在执行时输出自身的堆栈信息。
上述实现方式中,涉及敏感权限的第一类函数为iOS应用程序中的Objective-C语言函数,因此需要对该第一类函数进行监听,监听的方法为动态改变该第一类函数被调用过程中的方法编号和方法实现的对应关系,输出调用的第一类函数的堆栈信息,从而实现了对敏感权限函数的精准检测,减少误报率。
在第三方面的一种实现方式中,所述敏感函数包括涉及硬件信息获取的第二类函数,所述第二类函数为C函数,所述待检测信息包括堆栈信息,所述通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息,包括:利用所述动态库扫描MachO文件,获得符号表,并对所述符号表中的函数符号的指针指向进行修改,以使所述第二类函数的函数符号的指针指向动态库中对应的第二类替换函数,其中,所述MachO文件为所述目标iOS程序对应的可执行文件;执行所述第二类替换函数,所述第二类替换函数在执行时输出自身的堆栈信息。
在上述实现方式中,涉及硬件信息获取的第二类函数为C语言函数,因此需要对该iOS应用程序中运行的第二类函数进行监听,利用动态库扫描MachO文件可以修改扫描获得的符号表中的指针指向,从而实现对涉及硬件信息获取的第二类函数的监听,对于iOS应用程序中一些不容易发现的硬件信息获取函数也能够实现准确检测,提高风险问题的检测准确率。
在第三方面的一种实现方式中,所述敏感函数包括网络请求函数,所述待检测信息中还包括网络请求,所述通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息,包括:通过所述动态库对所述网络请求函数进行监听,并获取与所述网络请求函数要发送的网络请求。
在上述实现方式中,可以利用动态库对网络请求函数进行监听,从而获取到网络请求函数中的网络请求。通过对网络请求的检测,从而能够及时发现网络请求中携带隐私信息,避免隐私的外泄。
在第三方面的一种实现方式中,在所述获取与所述敏感函数相关的待检测信息之后,所述方法还包括:利用所述动态库在所述堆栈信息中打上标签,所述标签用于标识所述堆栈信息中所述敏感函数的类别。
在上述实现方式中,利用动态库可以在堆栈信息中打上标签,用于区分堆栈信息中敏感函数的类别方便对堆栈信息进行查看。
在第三方面的一种实现方式中,所述根据所述检测信息确定所述目标iOS程序是否存在风险问题,包括:获取预先配置的所述敏感函数的等级和权重;根据所述待检测信息、所述敏感函数的等级和权重确定所述目标iOS程序的风险系数;根据所述风险系数确定所述目标iOS程序是否存在风险问题。
在上述实现方式中,通过获取预先配置的敏感函数的等级和权重,从而可以根据待检测信息中的堆栈信息和网络请求信息来对被调用的敏感函数进行统计,通过等级和权重来计算目标iOS程序的风险系数,最后通过风险系数来确定目标iOS程序是否存在风险问题,从而可以通过计算风险系数的方式更为精确地确定风险问题,避免目标iOS程序中不符合监管部门的合规要求而面临下架或禁止上架风险。
第四方面,本申请实施例提供了一种应用程序检测方法,包括:在目标iOS程序启动后,通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息;利用所述动态库生成设备ID和进程ID,所述设备ID用于标识运行所述目标iOS程序的电子设备,所述进程ID用于标识所述目标iOS程序所在的进程;向服务端发送所述设备ID、所述进程ID和所述待检测信息,以使所述服务端根据所述待检测信息确定所述目标iOS程序是否存在风险问题。
上述方法在目标iOS程序启动后,利用动态库可以生成设备ID和进程ID,用来区分当前检测的电子设备和目标iOS程序,然后向服务端发送这些相关的信息,从而可以在服务端实现同时对多个设备和多个应用程序进行检测,区分待检测信息的归属,并完成应用程序风险问题的检测,充分利用了服务端的优异性能,检测速度更快。
第五方面,本申请实施例提供另一种应用程序检测装置,所述装置包括:监听模块,用于利用注入目标Android程序的进程中的脚本对所述目标Android程序中调用的函数进行监听,获取所述进程的待检测信息,所述待检测信息中包括每个被调用的函数的属性信息;判断模块,用于利用所述脚本,根据所述待检测信息计算所述函数的风险系数,并根据所述风险系数判断所述目标Android程序是否存在风险问题。
第六方面,本申请实施例提供另一种应用程序检测装置,所述装置包括:监听模块,用于利用注入目标Android程序的进程中的脚本对所述目标Android程序中调用的函数进行监听,获取所述进程的待检测信息,所述待检测信息中包括每个被调用的函数的属性信息;获取模块,用于获取所述目标Android程序的进程号;发送模块,用于向服务端发送所述进程号和所述待检测信息,以使所述服务端根据所述待检测信息计算所述函数的风险系数,并根据所述风险系数判断所述目标Android程序是否存在风险问题。
第七方面,本申请实施例提供另一种应用程序检测装置,所述装置包括:监听模块,用于在目标iOS程序启动后,通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息;判断模块,用于根据所述待检测信息确定所述目标iOS程序是否存在风险问题。
第八方面,本申请实施例提供另一种应用程序检测装置,所述装置包括:监听模块,用于在目标iOS程序启动后,通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息;生成模块,用于利用所述动态库生成设备ID和进程ID,所述设备ID用于标识运行所述目标iOS程序的电子设备,所述进程ID用于标识所述目标iOS程序所在的进程;发送模块,用于向服务端发送所述设备ID、所述进程ID和所述待检测信息,以使所述服务端根据所述待检测信息确定所述目标iOS程序是否存在风险问题。
第九方面,本申请实施例提供一种电子设备,包括:处理器、存储器和总线,其中,所述处理器和所述存储器通过所述总线完成相互间的交互;
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行第一方面至第四方面或第一方面至第四方面的任意一种可能的实现方式提供的方法。
第十方面,本申请实施例提供一种计算机可读存储介质,包括:
所述计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行第一方面至第四方面或第一方面至第四方面的任意一种可能的实现方式提供的方法。
第十一方面,本申请实施例提供一种计算机程序产品,包括计算机程序指令,所述计算机程序指令被处理器读取并运行时,执行第一方面至第四方面或第一方面至第四方面的任意一种可能的实现方式提供的方法。
本申请的其他特征和优点将在随后的说明书阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请实施例了解。本申请的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本申请实施例提供的第一种应用程序检测方法流程示意图;
图2为本申请实施例提供的第二种应用程序检测方法流程示意图;
图3为本申请实施例提供的第三种应用程序检测方法流程示意图;
图4为本申请实施例提供的第四种应用程序检测方法流程示意图;
图5为本申请实施例提供的第五种应用程序检测方法流程示意图;
图6为本申请实施例提供的一种动态库的结构示意图;
图7为本申请实施例提供的一种动态库注入方法流程示意图;
图8为本申请实施例提供的第一种应用程序检测装置结构示意图;
图9为本申请实施例提供的第二种应用程序检测装置结构示意图;
图10为本申请实施例提供的第三种应用程序检测装置结构示意图;
图11为本申请实施例提供的第四种应用程序检测装置结构示意图;
图12为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。
针对现有的通过关键字对程序代码进行匹配来检测应用程序的风险的准确率有待提高的问题,本申请提供应用程序检测方法,该方法利用预先注入目标应用程序中的可执行函数对所述目标应用程序中调用的函数进行监听,获取与所述函数相关的待检测信息;利用所述可执行函数,根据所述待检测信息确定所述目标应用程序是否存在风险问题。其中,所述可执行函数为预先注入到目标应用程序的可执行代码,例如在Android环境中可执行函数可以为脚本,在iOS环境中可执行函数可以为动态库。该方法提供了对运行中的目标应用程序的动态检测方法,从而提高了风险检测的准确率,并通过预先注入的方式,简化了应用程序风险的检测方式。
下面分别介绍本申请方案在Android环境中和iOS环境中的具体实现方式。
实施例一
图1为本申请实施例提供的第一种应用程序检测方法流程示意图,如图1所示,该方法可以应用于电子设备,该电子设备能够运行Android程序;其中电子设备具体可以为智能手机、平板电脑、计算机、个人数字助理(Personal Digital Assitant,PDA)、服务器、虚拟机等。参照图1,该方法包括:
步骤110:利用注入目标Android程序的进程中的脚本对目标Android程序中调用的函数进行监听,获取进程的待检测信息。
其中,脚本可以为预先设计的Hook脚本,Hook脚本为通过一些脚本语言编写的脚本程序,能够实现对应用程序中调用的函数的劫持,在监听到函数被调用之后执行Hook脚本中对应的可执行代码,从而获取到函数执行的相关属性信息。针对Android框架Androidframework、安卓逆向工具Jadx-Gui等源码进行分析,编写对应的Hook脚本,可以使用Xpose、frida等Hook框架将Hook脚本进行注入,该Hook脚本可以采用Java、shell、JavaScript等常用脚本语言进行编写,本申请不对Hook脚本的语言类型进行限定。
以root后的手机为例介绍脚本的注入过程,首先启动手机的Socket预设端口A1,以和PC机建立Socket通信通道,由PC机向手机发送该Hook脚本,再由手机启动该Hook脚本,以实现Hook脚本动态注入到该手机的目标Android程序的进程中,至此完成脚本的注入过程。
步骤110中的函数可以分为敏感函数和普通函数,Hook框架能够通过注入脚本来实现对目标Android程序调用的全局函数的监听,包括对敏感函数和普通函数的监听,当然,可以将敏感函数作为重点关注的部分,本实施例中敏感函数的定义为与用户信息相关的函数,例如获取Mac函数、获取摄像头权限函数等等,而普通函数则为与用户信息不相关的函数,例如一些获取WiFI名称函数、获取IP地址函数、网络请求函数等等。
而该脚本对函数的监听均可以通过Hook框架来完成,例如,Xposed中通过替换安卓应用程序中的/system/bin/app_process程序控制Zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。实现了在开机的时候完成对进程中运行的函数的Hook,在原函数执行的前后加上脚本中的可执行代码。Zygote进程在启动的过程中,除了会创建一个Dalvik虚拟机实例之外,还会将Java运行时库加载到进程中来,以及注册一些Android核心类的JNI方法来创建前面的Dalvik虚拟机实例。需要注意的是,一个应用程序进程被Zygote进程孵化出来的时候,不仅会获得Zygote进程中的Dalvik虚拟机实例拷贝,还会与Zygote一起共享Java运行时库。这也就是可以将XposedBridge这个jar包加载到每一个Android应用程序中的原因,实现了应用程序调用的函数的Hook,从而完成了对函数的监听。
利用frida对函数监听过程可以为,采用JavaScript编写的Hook脚本,利用frida提供的目标接口如js接口与目标Android程序的Native库进行连接,从而可以获得一些虚拟机接口,如JNI(Java Native Interface)本地函数接口和Java虚拟机接口,根据这些虚拟机接口将Hook脚本包装成动态代理对象去Hook相应的函数对应的class类,完成对函数的监听。
步骤120:利用脚本,根据待检测信息计算函数的风险系数,并根据风险系数判断目标Android程序是否存在风险问题。
在一些实现方式中,例如,利用脚本可以按照预设的调用规则对待检测信息中的函数进行分组,调用规则可以为脚本中预先设置的规则,根据函数的调用方式来区分函数是否存在风险问题,例如调用规则可以包括:并发调用、敏感调用、越权调用、静默后台调用以及后台连续调用中的一种或多种。并发调用指同一函数在一秒内被调用的次数超过了预设的次数阈值,敏感调用指同一函数调用的总次数超过阈值,越权调用指还未同意隐私协议、系统权限就开始进行调用或者权限调用的时间超过申请的权限调用时间,静默后台调用指目标Android程序处于后台状态下对函数的调用次数超过阈值,后台连续调用指在预设的时间段内后台调用的总时间超过时间阈值。这些阈值均用于表征脚本在该目标Android程序的进程中执行的预设时间范围内与函数调用次数对应的最大值,且不同调用规则对应的阈值可以不同。该脚本执行的预设时间范围可以为10分钟、15分钟等等,本申请不对预设时间范围的大小进行限定。
当前函数如果符合一调用规则,则会加入该调用规则的函数组中,当该函数组中某一个函数的总调用次数或单位时间内的调用次数超过阈值时,则该函数会作为风险项,需要进行整改,以避免风险问题。
在一些实施方式中,通过待检测信息中包含的函数的属性信息来确定是否将函数加入函数组,这些属性信息可以包括以下至少一种:
函数被调用时目标Android程序是否处于后台状态,作为后台属性,在分组过程中,函数具有后台属性,则为后台调用,当后台发生连续调用或越权调用时,将该函数加入到对应的函数组中;
函数的名称,作为函数定位手段,确定函数的调用开始时间及结束时间,进一步确定函数的执行时间长度等等各项属性信息。
通过获取到这些函数的属性信息可以明确各项函数的分组,从而根据分组情况来计算分组后的各个函数组下所属函数的风险系数,更为准确。
除了上述用于明确各项函数的分组的属性信息之外,待检测信息中还包括函数自身的堆栈信息,该堆栈信息用于标识函数在该目标Android程序中的调用链,确定函数被调用的与其他函数之间的调用关系。例如确定为风险项的函数,开发人员可以通过查看该函数自身的堆栈信息来最终确定函数的问题所在,以快速定位风险问题,并进行整改,消除目标Android程序的风险问题。
下面以一个Android程序的风险问题分析进行介绍,例如预先设置的函数组包括敏感函数调用组、并发函数调用组和后台函数调用组,与上述各个函数组对应的调用规则进行匹配,然后根据待检测信息中记录的函数的属性信息对函数进行分组统计,计算各个分组(函数组)中各项函数的风险系数,根据风险系数确定Android程序的风险问题,在任意一个函数组中存在风险项即为存在风险问题。
其中,函数组为敏感函数调用组时,遵循上述介绍的敏感调用规则,将敏感函数的调用次数与调用阈值的比值作为敏感函数的风险系数,首先确定敏感函数的范围,根据待检测信息确定满足敏感函数调用规则的敏感函数名以及敏感函数发生调用的统计次数,分别将各个敏感函数的调用次数和对应的调用阈值的比值作为风险系数。求得每一项敏感函数的风险系数时,还需跟敏感函数调用组的风险系数阈值进行比较,若大于则该项敏感函数记为风险项,目标Android程序存在风险问题。
其中,函数组为并发函数调用组时,遵循上述介绍的并发调用规则,并发调用规则并不要求敏感函数,普通函数也会纳入统计范围,根据待检测信息确定满足后台连续调用规则的函数名以及函数发生并发调用的统计次数,将该统计次数分别作为各个函数的风险系数,如在并发函数调用组中,并发次数也就是风险系数超过预设的风险系数阈值,则该项函数记为风险项,目标Android程序存在风险问题。
还例如,函数组为后台连续调用时,遵循上述的后台连续调用规则,后台连续调用中也不要求函数为敏感函数,首先根据待检测信息确定满足后台连续调用规则的函数名以及函数发生后台连续调用的统计次数,将统计次数与次数阈值的比值作为风险系数。如果该函数的风险系数大于风险系数阈值时,则该函数作为一个风险项,目标Android程序存在风险问题。
需要注意的是,不同的函数组中可以包括相同函数,只是函数的调用规则不同,每个函数组用于标识该函数在目标Android程序的调用规则,可以根据不同的函数组对应的风险系数计算方式来计算该函数对应的风险系数,最后确定该函数是否为风险项。
总的来说,各项函数的风险系数的计算方式,可以为各项函数分别在各个函数组中的统计次数和预设的次数阈值的比值,也可以为各项函数分别在各个函数组中的统计次数。在计算完风险系数之后,通过将风险系数和风险系数阈值比较,即可确认该项函数是否为风险项,进而确定风险问题。
在另一些实现方式中,还可以将每个函数组中被调用函数的风险系数的计算结果进行统计,生成目标Android程序的风险报告,该风险报告直观展示了各个函数的风险系数值,并且可以通过该风险报告对目标Android程序的整体检测结果进行评估,对风险系数值较高的优先进行整改,以确保应用程序不存在风险问题。风险报告中还包括一些网络请求函数的风险情况,例如网络请求函数中通过正则表达式进行匹配确认该网络请求函数的传输内容中是否携带用户信息例如手机号和银行卡号等等,以实现对应用程序的全面检测。
实施例二
本申请还提供一种可替换的方案,图2为本申请实施例提供的第二种应用程序检测方法流程示意图,如图2所示,在上述步骤110之后,不执行步骤120,而是执行以下步骤:
步骤130:获取目标Android程序的进程号;
步骤140:向服务端发送进程号和待检测信息,以使服务端根据待检测信息计算函数的风险系数,并根据风险系数判断目标Android程序是否存在风险问题。
该替换的方案与图1所述方案的区别在于,根据待检测信息确定应用程序是否存在风险不是由电子设备执行,而是由服务端执行。为了实现由服务端确定应用程序的风险,电子设备还应向服务端上报进程号,以使服务端根据进程号定位应用程序。其中,服务端根据待检测信息计算函数的风险系数以及根据风险系数判断目标Android程序是否存在风险问题的具体实施方式,可以参照实施例一中由电子设备确定应用程序风险的具体方式,不再赘述。本实施例中,由服务端对电子设备中目标应用程序的风险检测,充分利用了服务端优异的处理性能,效率更高,检测更快。
实施例三
图3为本申请实施例提供的第三种应用程序检测方法流程示意图,根据前文阐述,该方法可以为root过的Android手机,由PC端将脚本注入至该电子设备中,以实现电子设备中运行的目标Android程序的检测。如图3所示,该方法包括:
步骤310:PC端连接手机,启动目标Android程序,将脚本注入至电子设备中。
具体的实施方式可以参见图1对应的实施例中的脚本注入方式,前面已经详细阐述,这里不再赘述。
步骤320:利用脚本对函数进行监听,获取待检测信息。
具体实施方式可以为:通过注入脚本,可以获取待检测信息,待检测信息中包含每个被调用函数的属性信息,可以利用脚本获取堆栈并记录函数的属性信息。记录的方式可以首先通过属性信息来标识函数,然后通过调用规则来进行分组,获得各个满足各个调用规则下的函数组。具体可以参照图1对应的实施例中属性信息和分组的介绍。
步骤330:根据待检测信息进行运算,获得运算结果。
具体实施方式可以为:通过前面的函数分组,再对每个函数分组中各个分组中的函数分别计算其风险系数,通过风险系数和对应的风险阈值的比较判断是否存在风险项,具体可以参照图1对应实施例中关于风险系数的计算。
步骤340:根据运算结果生成风险报告。
具体实施方式可以为:这里的风险报告包括每个函数组中的各项函数的风险系数计算的统计情况,风险报告中还可以包括具体函数的堆栈信息以及不合规的网络请求,方便开发人员根据该风险报告查找风险项,并根据风险项从堆栈信息中获取问题根源,从而加快整改,确保目标Android程序能够符合监管部门要求,避免遭受下架风险。
实施例四
图4为本申请实施例提供的第四种应用程序检测方法流程示意图,如图4所示,该方法可以应用于电子设备,该电子设备能够运行iOS程序;其中电子设备具体可以为智能手机、平板电脑、计算机、个人数字助理(Personal Digital Assitant,PDA)、服务器、虚拟机等。参照图4,该方法包括:
步骤410:在目标iOS程序启动后,通过预先注入到目标iOS程序中的动态库对敏感函数进行监听,并获取与敏感函数相关的待检测信息。
例如,在目标iOS程序运行时由系统动态加载到内存中,供程序进行调用,动态库又被称为动态链接库,在iOS系统动态库文件的扩展名可以是“.dylib”或者“.framework”。在本申请的方案中,通过将动态库预先注入到目标iOS程序中,从而实现对敏感函数的监听,利用对应用程序进行动态检测的方法,从而提高了风险问题的检测准确率。
完成动态库的预先注入之后,就可以利用动态库与运行中的目标iOS程序中需要监测的敏感函数调用进行监听,完成对目标iOS程序的动态监测,通过对敏感函数进行监听,可以获取到与敏感函数相关的待检测信息。
根据前文阐述,在一些实现方式中,例如,iOS应用程序中涉及的敏感函数大体可以分为以下两类:涉及敏感权限的第一类函数和涉及硬件信息获取的第二类函数,第一类函数可以为iOS应用程序常见的敏感权限函数,这些敏感权限函数的语言类型为Objective-C语言类型。例如iOS系统中常见的15种敏感权限函数包括:访问媒体资料库权限、访问蓝牙权限、访问日历权限、访问相机权限、访问相册权限、访问通讯录权限、访问FaceID/指纹权限、访问健康数据权限、访问健康更新权限、访问住宅配件权限、访问位置信息权限、访问麦克风权限、访问提醒事项权限、访问语音识别/Siri权限、使用个性化广告推荐符权限,还可以将更多的权限函数作为敏感函数,本申请不对敏感权限函数的种类进行限定。
利用Objective-C语言的Runtime运行时特性,可以对第一类函数的方法实现进行替换。为了获取第一类函数被调用时的待检测信息,可以通过对该第一类函数进行监听的方式,监听的手段可以为利用动态库对第一类函数进行Hook劫持。例如在第一类函数被调用时利用动态库动态改变第一类函数的方法编号和方法实现的对应关系,将第一类函数的方法实现指向动态库中对应的第一类替换函数,从而动态改变第一类函数的方法实现,然后执行在动态库中对应的第一类替换函数,输出自身的堆栈信息。可以理解的是,对于执行时输出自身的堆栈信息,由于动态库中对应的第一类替换函数为该第一类函数的方法实现所指向的动态库代码,因此能够反映第一类函数的函数信息,并将涉及该第一类函数的整个调用链上的函数信息均输出到堆栈信息,后续的关于自身的堆栈信息也是如此,均会将调用链上相关的函数信息进行输出。
第二类函数可以为iOS应用程序中涉及硬件信息获取的函数,硬件信息可以包括但不限于CPU核数、CPU运行频率、设备mac地址、设备蓝牙地址、设备ROM大小、设备RAM大小等等,该硬件信息获取函数的语言类型为C语言。MachO文件为Mac、iPhone、iPad、iWatch、Apple TV等平台中可执行的文件,MachO是Mach Object文件格式的缩写,是可执行文件的文件格式。敏感函数中包括涉及硬件信息获取的第二类函数,因此需要利用动态库来对硬件信息获取的C语言函数进行监听,从而获取与硬件信息获取相关的待检测信息。
动态库对第二类函数的监听原理可以为:利用动态库可以扫描MachO文件,获得符号表,通过MachO文件中的懒加载符号表与间接符号表中的函数符号一一对应,而间接符号表保存了函数符号在符号表中的偏移量,符号表中的每一个子项保存了函数符号在字符串表中的偏移量。
对第二类函数监听的具体实施方式可以为:通过字符串表的偏移量找到函数符号对应的函数名称;建立函数符号与函数名称的对应关系;通过函数名称找到最终的函数符号地址;修改函数符号的内容来指向动态库中对应的第二类替换函数,最后通过执行第二类替换函数,在执行时输出自身的堆栈信息,关于自身的堆栈信息在上文已经解释,这里不再赘述。
在另一些实现方式中,网络请求函数也会因为涉及隐私数据泄露而导致风险问题,因此还包括对网络请求函数的监听,网络请求函数可以为例如支持HTTP/HTTPS协议的网络请求函数。
对网络请求函数监听的具体方式可以为:首先对NSURLSessionConfiguration会话配置项进行排序,之后将动态库实现的NSURLProtocol注入至NSURLSessionConfiguration的首选项,NSURLProtocol是NSURLConnection和NSURLSession中的handle控制类,因此网络请求都会经过NSURLProtocol里面的方法去处理,也就是对上层的URLRequest网络请求做监听,并根据自己的需求场景做定制化响应处理,之后便可以针对HTTP/HTTPS协议的网络请求函数进行监听。根据监管部门要求构建敏感信息检测表,包括但不限于明文手机号、明文身份证号、IDFA等信息,可以使用正则匹配的方式,将发送的网络请求进行筛选过滤,并将存在信息泄露的网络请求存入待检测信息中,从而可以确定发生敏感信息泄露的网络请求。
通过以上三种敏感函数的监听方式,从而可以实现对目标iOS程序中的敏感函数进行多方位的监听,提高风险问题的检出率,保障用户的隐私安全。
步骤420:根据待检测信息确定目标iOS程序是否存在风险问题。
通过获取的与敏感函数相关的待检测信息,例如堆栈信息或网络请求,可以通过查看堆栈信息是否包含敏感函数,或者网络请求的请求体中是否包含隐私数据,从而确定目标iOS程序是否存在风险问题。风险问题可以包括隐私问题或者合规问题,例如获取摄像头权限函数、获取电话号码权限函数均为敏感函数,当待检测信息中具有这些函数的堆栈信息时,以及在发出的网络请求中包括电话号码或设备信息等隐私内容时均可以视为存在风险问题。
在另一些实现方式中,还可以利用动态库在堆栈信息中打上标签,该标签的作用是为了标识堆栈信息中敏感函数的类别,类别例如可以为敏感函数对应的中文名,例如获取设备号,来对敏感函数进行有效区分。堆栈信息是用来暂时存放数据和地址的,利用动态库可以将系统调用的敏感函数打印到堆栈中,但在系统中调用敏感函数的接口可以存在多个。例如获取摄像头权限的函数可能被应用程序中的多个接口调用,需要加以区分,在一个接口中也可能存在多次调用隐私函数的情况。通过获取敏感函数调用的堆栈信息,并在堆栈信息中打上标签,用来标识敏感函数。例如,在堆栈信息中会对涉及敏感函数的调用链上的函数调用关系全部打印出来,一般为函数名以及函数地址等等信息,标签可以用我们熟知的函数中文名进行标记,如果不采取对敏感函数打上标签的方法,难以在这些复杂的函数调用关系中快速确定敏感函数,因此通过对敏感函数打上标签,可以方便技术人员及时发现敏感函数,提高检测的效率。
在一些实现方式中,被目标iOS程序调用的函数可以分为敏感函数和普通函数,敏感函数的等级可以设为1,普通函数的等级可以设为0,或者,在敏感函数中可以继续对其进行等级划分,区分不同敏感函数的重要程度。敏感函数的权重是一个(M,N)二元组,M代表敏感函数被调用的时间间隔,N代表在该M的时间间隔内被调用次数的上限,通过二元组中M和N的值可以确定敏感函数的权重,利用待检测信息中检测到的与敏感函数相关的信息来确定目标iOS程序的风险系数。例如当待检测信息中只检测到一个敏感函数时,直接计算该敏感函数的风险系数即可作为目标iOS程序的风险系数,当待检测信息中检测到多个敏感函数时,可以分别通过获取到的敏感函数的等级和权重进行加权运算从而获得该目标iOS程序对应的风险系数,通过风险系数来确定目标iOS程序是否存在风险问题。还例如目标iOS程序的风险等级可以根据风险系数进行划分,通过风险系数可以确定目标iOS程序的风险等级。
实施例五
本申请还提供一种可替换的方案,图5为本申请实施例提供的第五种应用程序检测方法流程示意图,如图5所示,在上述步骤410之后,不执行步骤420,而是执行以下步骤:
步骤430:利用动态库生成设备ID和进程ID,设备ID用于标识运行目标iOS程序的电子设备,进程ID用于标识目标iOS程序所在的进程;
步骤440:向服务端发送设备ID、进程ID和待检测信息,以使服务端根据待检测信息确定所目标iOS程序是否存在风险问题。
该替换的方案与图4所述方案的区别在于,其中,上述步骤420的执行主体可以为与该iOS设备连接的服务端,iOS设备还可以获取自身的设备ID以及目标iOS程序的进程ID,并向服务端发送该设备ID、进程ID和待检测信息,以使服务端完成目标iOS程序的风险问题的判断,从而实现了服务端对iOS设备中目标iOS程序的风险检测,充分利用了服务端优异的处理性能,效率更高,检测更快。具体根据待检测信息确定目标iOS程序是否存在风险问题的具体实施方式可以参照本申请与图4对应的实施例中提供的方法,这里不再赘述。
实施例六
图6为本申请实施例提供的一种动态库的结构示意图,根据前文阐述,动态库为一种可调用的共享函数库,按照功能的方式可以将该动态库划分成以下几个模块,分别用于实现不同的功能,动态库通过动态加载到上述方法实施例的目标iOS程序中发挥作用。如图6所示,动态库600包括初始化模块610、数据上报模块620、数据存储模块630、动态库链接Hook模块640、网络请求Hook模块650、敏感权限Hook模块660和敏感函数Hook模块670。本申请实施例提供了一种动态库,该动态库600包括:
初始化模块610用于生成设备ID和进程ID,对日志进行初始化,配置敏感函数的等级及权重,配置敏感权限标签,配置硬件信息获取函数标签以及配置网络请求敏感数据标签。
其中,在动态库加载到上述方法实施例中的目标iOS程序后,通过初始化模块610来生成设备ID和进程ID,实现待检测信息的发送,还可以生成操作日志,记录动态库运行情况,通过敏感函数的等级、权重及标签配置,从而能够实现待检测信息的处理,方便技术人员的查看和确定程序风险。
其中生成设备唯一ID的生成逻辑如下:根据Key从Keychain钥匙串中获取保存的UDID,若取到,则将UDID放入存储模块中供后续上传数据使用,否则随机生成UDID;将UDID存储至Keychain中。
数据上报模块620用于获取应用程序的版本和名称,获取上报地址,并上报堆栈信息和网络请求。
具体实施方式可以为:在该动态库动态注入到上述方法实施例的目标iOS程序后,获取信息上报的IP地址和目标iOS程序的应用名和版本号信息,定时从数据存储模块630中获取最新的数据信息并上报至指定IP地址,从而实现了服务端中待检测信息的采集。
数据存储模块630用于存储堆栈信息和网络请求,并建立Redis缓存用于实时存储数据。
具体实施方式可以为:利用单例模式和NSDictionary、NSArray的数据结构,实现了Redis功能,可以快速对检测到的堆栈信息或者网络请求数据进行缓存,利用该数据存储模块630可以实现上述方法实施例中待检测信息的存储功能,防止信息丢失。
动态库链接Hook模块640用于扫描MachO文件,获得符号表,并对符号表中的函数符号进行重绑定。
具体实施方式可以参考上述图4方法实施例中涉及硬件信息获取的第二类函数的监听方法。
网络请求Hook模块650用于通过对网络请求函数进行监听,获得涉及敏感信息的网络请求。
具体实施方式可以参考与图4实施例中涉及网络请求函数的监听的实施方式,并将存在信息泄露的网络请求放入数据存储模块630,等待数据上报模块620上传。
敏感权限Hook模块660用于对敏感权限函数进行监听,并调用数据存储模块630,存储与敏感权限函数相关的堆栈信息。具体实施方式可以参考图4实施例中涉及敏感权限函数的第一类函数监听的实施方法。
敏感函数Hook模块670用于对涉及硬件信息获取函数进行监听,并调用数据存储模块630,存储涉及硬件信息获取函数的堆栈信息。具体实施方式可以参考图4实施例中涉及硬件信息获取的第二类函数监听的实施方法。
实施例七
图7为本申请实施例提供的一种动态库注入方法流程示意图,应用于iOS设备,该iOS设备可以为无需越狱的正常iOS设备,如图7所示,动态库的注入过程可以分为编译、注入、运行三个过程。
首先,在完成动态库系统的编码工作后,通过编译工具Xcode将该动态库进行编译,编译的目的是将动态库的代码转换成可执行的二进制文件,从而注入到目标iOS程序中。编译的具体流程包括:预处理代码中存在的宏定义;语义和语法分析,进行抽象语法树转换;针对语法树进行静态分析,包括类型检查、实现检查、变量调用;生成LLVM编译器代码;优化阶段针对LLVM IR编译生成的中间代码进行优化;生成动态库的可执行文件。
其次,在编译结束后,对生成的动态库进行注入操作。注入的具体实施方式如下:读取MachO文件数据流;遍历MachO文件数据流,找到最后一位LoadCommand加载器命令,并记录偏移量;判断偏移量所在位置是否可以开辟出相应注入空间,若注入空间不足则终止;根据偏移量,读取注入的动态库文件信息,生成相应LoadCommand;将LoadCommand的二进制数据填充至MachO文件指定位置;将新的MachO文件数据流写入目标iOS程序的文件。
最后,完成注入之后,开始运行目标iOS程序。运行的具体实施方式分为:通过在运行MacOS的电脑上安装Xcode应用程序;待Xcode安装完毕后通过Xcode将动态库注入至需要检测的IPA安装包中,该IPA安装包为目标iOS程序对应的安装包,并重新打包;对重打包的IPA文件进行重签名;然后通过Xcode将重签名后的IPA文件安装至iOS设备;启动安装完成的目标iOS程序。
实施例八
图8为本申请实施例提供的第一种应用程序检测装置的结构示意图,该装置可以是电子设备上的模块、程序段或代码。应理解,该装置与上述图1方法实施例对应,能够执行图1方法实施例涉及的各个步骤,该装置具体的功能可以参见上文中的描述,为避免重复,此处适当省略详细描述。本申请实施例提供了一种应用程序检测装置,该装置包括:
监听模块810,用于利用注入目标Android程序的进程中的脚本对所述目标Android程序中调用的函数进行监听,获取所述进程的待检测信息,所述待检测信息中包括每个被调用的函数的属性信息;
判断模块820,用于利用所述脚本,根据所述待检测信息计算所述函数的风险系数,并根据所述风险系数判断所述目标Android程序是否存在风险问题。
在上述实施例的基础上,所述判断模块820具体用于:
利用所述脚本,按照预设的调用规则以及所述待检测信息对所述函数进行分组,获得分别满足各个所述调用规则的函数组;
根据所述待检测信息计算各个所述函数组中所述函数的风险系数,其中,各个所述函数组的风险系数计算方式互不相同。
在上述实施例的基础上,所述函数的属性信息包括以下至少一种:
所述函数被调用时所述目标Android程序是否处于后台状态;
所述函数的名称;
所述函数的调用开始时间;
所述函数的执行时间长度;以及,
所述函数自身的堆栈信息。
在上述实施例的基础上,所述判断模块820具体用于:
根据各个函数组中所述函数的风险系数和与所述函数组对应的风险系数阈值,确定所述目标Android程序是否存在风险项;
其中,若存在风险项则表明所述目标Android程序存在风险问题,若不存在风险项则表明所述目标Android程序不存在风险问题。
在上述实施例的基础上,该装置还包括风险等级确定模块,用于:
获取所述目标Android程序中所述风险项的权重;
根据所述风险项的权重计算所述目标Android程序的风险值;
根据所述风险值确定所述目标Android程序的风险等级。
在上述实施例的基础上,该装置还包括注入模块,用于:
利用Hook框架提供的目标接口与所述目标Android程序建立通信通道;
通过所述通信通道将所述脚本注入到所述目标Android程序的进程中。
在上述实施例的基础上,该装置还包括风险报告生成模块,用于:
统计各个函数组中所述函数的风险系数的计算结果,生成所述目标Android程序的风险报告。
实施例九
图9为本申请实施例提供的第二种应用程序检测装置的结构示意图,该装置可以是电子设备上的模块、程序段或代码。应理解,该装置与上述图2方法实施例对应,能够执行图2方法实施例涉及的各个步骤,该装置具体的功能可以参见上文中的描述,为避免重复,此处适当省略详细描述。本申请实施例提供了另一种应用程序检测装置,该装置包括:
监听模块910,用于利用注入目标Android程序的进程中的脚本对所述目标Android程序中调用的函数进行监听,获取所述进程的待检测信息,所述待检测信息中包括每个被调用的函数的属性信息;
获取模块920,用于获取所述目标Android程序的进程号;
发送模块930,用于向服务端发送所述进程号和所述待检测信息,以使所述服务端根据所述待检测信息计算所述函数的风险系数,并根据所述风险系数判断所述目标Android程序是否存在风险问题。
实施例十
图10为本申请实施例提供的第三种应用程序检测装置的结构示意图,该装置可以是电子设备上的模块、程序段或代码。应理解,该装置与上述图4方法实施例对应,能够执行图4方法实施例涉及的各个步骤,该装置具体的功能可以参见上文中的描述,为避免重复,此处适当省略详细描述。本申请实施例提供了另一种应用程序检测装置,该装置包括:
监听模块1010,用于在目标iOS程序启动后,通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息;
判断模块1020,用于根据所述待检测信息确定所述目标iOS程序是否存在风险问题。
在上述实施例的基础上,所述敏感函数包括涉及敏感权限的第一类函数,所述第一类函数为Objective-C函数,所述待检测信息包括堆栈信息。
在上述实施例的基础上,所述监听模块810具体用于:
利用所述动态库在所述第一类函数被调用时动态改变所述第一类函数的方法编号和方法实现的对应关系,将所述第一类函数的方法实现指向所述动态库中对应的第一类替换函数;
执行所述第一类替换函数,所述第一类替换函数在执行时输出自身的堆栈信息。
在上述实施例的基础上,所述敏感函数包括涉及硬件信息的第二类函数,所述第二类函数为C函数,所述待检测信息包括堆栈信息。
在上述实施例的基础上,所述监听模块1010具体用于:
利用所述动态库扫描MachO文件,获得符号表,并对所述符号表中的函数符号的指针指向进行修改,以使所述第二类函数的函数符号的指针指向动态库中对应的第二类替换函数,其中,所述MachO文件为所述目标iOS程序对应的可执行文件;
执行所述第二类替换函数,所述第二类替换函数在执行时输出自身的堆栈信息。
在上述实施例的基础上,所述敏感函数包括网络请求函数,所述待检测信息中还包括网络请求。
在上述实施例的基础上,所述敏感函数包括网络请求函数,所述待检测信息中还包括网络请求。
在上述实施例的基础上,所述监听模块1010具体用于:
利用所述动态库对所述网络请求函数进行监听,并获取与所述网络请求函数要发送的网络请求。
在上述实施例的基础上,该装置还包括标签模块,用于:
利用所述动态库在所述堆栈信息中打上标签,所述标签用于标识所述堆栈信息中所述敏感函数的类别。
在上述实施例的基础上,所述判断模块1020具体用于:
获取预先配置的所述敏感函数的等级和权重;
根据所述待检测信息、所述敏感函数的等级和权重确定所述目标iOS程序的风险系数;
根据所述风险系数确定所述目标iOS程序是否存在风险问题。
实施例十一
图11为本申请实施例提供的第四种应用程序检测装置的结构示意图,该装置可以是电子设备上的模块、程序段或代码。应理解,该装置与上述图5方法实施例对应,能够执行图5方法实施例涉及的各个步骤,该装置具体的功能可以参见上文中的描述,为避免重复,此处适当省略详细描述。本申请实施例提供了另一种应用程序检测装置,该装置包括:
监听模块1110,用于在目标iOS程序启动后,通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息;
生成模块1120,用于利用所述动态库生成设备ID和进程ID,所述设备ID用于标识运行所述目标iOS程序的电子设备,所述进程ID用于标识所述目标iOS程序所在的进程;
发送模块1130,用于向服务端发送所述设备ID、所述进程ID和所述待检测信息,以使所述服务端根据所述待检测信息确定所述目标iOS程序是否存在风险问题。
实施例十二
图12示出了本申请实施例提供的电子设备1200的一种可能的结构。参照图12,电子设备1200包括:处理器1210、存储器1220以及通信接口1230,这些组件通过通信总线1240和/或其他形式的连接机构(未示出)互连并相互通讯。
其中,存储器1220包括一个或多个(图中仅示出一个),其可以是,但不限于,随机存取存储器(Random Access Memory,简称RAM),只读存储器(Read Only Memory,简称ROM),可编程只读存储器(Programmable Read-Only Memory,简称PROM),可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,简称EPROM),电可擦除可编程只读存储器(Electric Erasable Programmable Read-Only Memory,简称EEPROM)等。处理器1210以及其他可能的组件可对存储器1220进行访问,读和/或写其中的数据。
处理器1210包括一个或多个(图中仅示出一个),其可以是一种集成电路芯片,具有信号的处理能力。上述的处理器1210可以是通用处理器,包括中央处理器(CentralProcessing Unit,简称CPU)、微控制单元(Micro Controller Unit,简称MCU)、网络处理器(Network Processor,简称NP)或者其他常规处理器;还可以是专用处理器,包括图形处理器(Graphics Processing Unit,简称GPU)、数字信号处理器(Digital Signal Processor,简称DSP)、专用集成电路(Application Specific Integrated Circuits,简称ASIC)、现场可编程门阵列(Field Programmable Gate Array,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
通信接口1230包括一个或多个(图中仅示出一个),可以用于和其他设备进行直接或间接地通信,以便进行数据的交互。通信接口1230可以包括进行有线和/或无线通信的接口。
在存储器1220中可以存储一个或多个计算机程序指令,处理器1210可以读取并运行这些计算机程序指令,以实现本申请实施例提供的应用程序检测方法以及其他期望的功能。
可以理解,图12所示的结构仅为示意,电子设备1200还可以包括比图12中所示更多或者更少的组件,或者具有与图12所示不同的配置。图12中所示的各组件可以采用硬件、软件或其组合实现。电子设备1200可能是实体设备,例如PC机、笔记本电脑、平板电脑、手机、服务器、嵌入式设备等,也可能是虚拟设备,例如虚拟机、虚拟化容器等。并且,电子设备1200也不限于单台设备,也可以是多台设备的组合或者大量设备构成的集群。
本申请实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序指令,所述计算机程序指令被计算机的处理器读取并运行时,执行本申请实施例提供的应用程序检测方法。例如,计算机可读存储介质可以实现为图12中电子设备1200中的存储器1220。
本申请实施例还提供一种计算机程序产品,该计算机程序产品包括计算机程序指令,这些计算机程序指令被处理器读取并运行时,执行本申请实施例提供的应用程序检测方法。
在本申请所提供的实施例中,应该理解到,所揭露装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或交互连接可以是通过一些交互接口,装置或单元的间接耦合或交互连接,可以是电性,机械或其它的形式。
另外,作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
再者,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。
以上所述仅为本申请的实施例而已,并不用于限制本申请的保护范围,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (18)
1.一种应用程序检测方法,其特征在于,包括:
利用注入目标Android程序的进程中的脚本对所述目标Android程序中调用的函数进行监听,获取所述进程的待检测信息,所述待检测信息中包括每个被调用的函数的属性信息;
利用所述脚本,根据所述待检测信息计算所述函数的风险系数,并根据所述风险系数判断所述目标Android程序是否存在风险问题。
2.根据权利要求1所述的方法,其特征在于,所述利用所述脚本,根据所述待检测信息计算所述函数的风险系数,包括:
利用所述脚本,按照预设的调用规则以及所述待检测信息对所述函数进行分组,获得分别满足各个所述调用规则的函数组;
根据所述待检测信息计算各个所述函数组中所述函数的风险系数,其中,各个所述函数组的风险系数计算方式互不相同。
3.根据权利要求2所述的方法,其特征在于,所述函数的属性信息包括以下至少一种:
所述函数被调用时所述目标Android程序是否处于后台状态;
所述函数的名称;
所述函数的调用开始时间;
所述函数的执行时间长度;以及,
所述函数自身的堆栈信息。
4.根据权利要求2所述的方法,其特征在于,所述根据所述风险系数判断所述目标Android程序是否存在风险问题,包括:
根据各个函数组中所述函数的风险系数和与所述函数组对应的风险系数阈值,确定所述目标Android程序是否存在风险项;
其中,若存在风险项则表明所述目标Android程序存在风险问题,若不存在风险项则表明所述目标Android程序不存在风险问题。
5.根据权利要求4所述的方法,其特征在于,在所述根据各个函数组中所述函数的风险系数和与所述函数组对应的风险系数阈值,确定所述目标Android程序是否存在风险项之后,包括:
获取所述目标Android程序中所述风险项的权重;
根据所述风险项的权重计算所述目标Android程序的风险值;
根据所述风险值确定所述目标Android程序的风险等级。
6.根据权利要求1所述的方法,其特征在于,在所述利用注入目标Android程序进程中的脚本对所述目标Android程序中调用的函数进行监听之前,所述方法还包括:
利用Hook框架提供的目标接口与所述目标Android程序建立通信通道;
通过所述通信通道将所述脚本注入到所述目标Android程序的进程中。
7.一种应用程序检测方法,其特征在于,包括:
利用注入目标Android程序的进程中的脚本对所述目标Android程序中调用的函数进行监听,获取所述进程的待检测信息,所述待检测信息中包括每个被调用的函数的属性信息;
获取所述目标Android程序的进程号;
向服务端发送所述进程号和所述待检测信息,以使所述服务端根据所述待检测信息计算所述函数的风险系数,并根据所述风险系数判断所述目标Android程序是否存在风险问题。
8.一种应用程序检测方法,其特征在于,包括:
在目标iOS程序启动后,通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息;
根据所述待检测信息确定所述目标iOS程序是否存在风险问题。
9.根据权利要求8所述的方法,其特征在于,所述敏感函数包括涉及敏感权限的第一类函数,所述第一类函数为Objective-C函数,所述待检测信息包括堆栈信息,所述通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息,包括:
利用所述动态库在所述第一类函数被调用时动态改变所述第一类函数的方法编号和方法实现的对应关系,将所述第一类函数的方法实现指向所述动态库中对应的第一类替换函数;
执行所述第一类替换函数,所述第一类替换函数在执行时输出自身的堆栈信息。
10.根据权利要求8所述的方法,其特征在于,所述敏感函数包括涉及硬件信息获取的第二类函数,所述第二类函数为C函数,所述待检测信息包括堆栈信息,所述通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息,包括:
利用所述动态库扫描MachO文件,获得符号表,并对所述符号表中的函数符号的指针指向进行修改,以使所述第二类函数的函数符号的指针指向动态库中对应的第二类替换函数,其中,所述MachO文件为所述目标iOS程序对应的可执行文件;
执行所述第二类替换函数,所述第二类替换函数在执行时输出自身的堆栈信息。
11.根据权利要求8所述的方法,其特征在于,所述敏感函数包括网络请求函数,所述待检测信息中还包括网络请求,所述通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息,包括:
利用所述动态库对所述网络请求函数进行监听,并获取与所述网络请求函数要发送的网络请求。
12.根据权利要求9或10所述的方法,其特征在于,在所述获取与所述敏感函数相关的待检测信息之后,所述方法还包括:
利用所述动态库在所述堆栈信息中打上标签,所述标签用于标识所述堆栈信息中所述敏感函数的类别。
13.根据权利要求8-11中任一项所述的方法,其特征在于,所述根据所述检测信息确定所述目标iOS程序是否存在风险问题,包括:
获取预先配置的所述敏感函数的等级和权重;
根据所述待检测信息、所述敏感函数的等级和权重确定所述目标iOS程序的风险系数;
根据所述风险系数确定所述目标iOS程序是否存在风险问题。
14.一种应用程序检测方法,其特征在于,包括:
在目标iOS程序启动后,通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息;
利用所述动态库生成设备ID和进程ID,所述设备ID用于标识运行所述目标iOS程序的电子设备,所述进程ID用于标识所述目标iOS程序所在的进程;
向服务端发送所述设备ID、所述进程ID和所述待检测信息,以使所述服务端根据所述待检测信息确定所述目标iOS程序是否存在风险问题。
15.一种应用程序检测装置,其特征在于,包括:
监听模块,用于利用注入目标Android程序的进程中的脚本对所述目标Android程序中调用的函数进行监听,获取所述进程的待检测信息,所述待检测信息中包括每个被调用的函数的属性信息;
判断模块,用于利用所述脚本,根据所述待检测信息计算所述函数的风险系数,并根据所述风险系数判断所述目标Android程序是否存在风险问题。
16.一种应用程序检测装置,其特征在于,包括:
监听模块,用于在目标iOS程序启动后,通过预先注入到所述目标iOS程序中的动态库对敏感函数进行监听,并获取与所述敏感函数相关的待检测信息;
判断模块,用于根据所述待检测信息确定所述目标iOS程序是否存在风险问题。
17.一种电子设备,其特征在于,包括:处理器、存储器和总线,其中,
所述处理器和所述存储器通过所述总线完成相互间的通信;
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求1-14任一项所述的方法。
18.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储计算机指令,所述计算机指令被计算机运行时,使所述计算机执行如权利要求1-14任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111573217.8A CN114238948A (zh) | 2021-12-21 | 2021-12-21 | 一种应用程序检测方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111573217.8A CN114238948A (zh) | 2021-12-21 | 2021-12-21 | 一种应用程序检测方法、装置、电子设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114238948A true CN114238948A (zh) | 2022-03-25 |
Family
ID=80760610
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111573217.8A Pending CN114238948A (zh) | 2021-12-21 | 2021-12-21 | 一种应用程序检测方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114238948A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115688109A (zh) * | 2023-01-04 | 2023-02-03 | 杭州云缔盟科技有限公司 | 一种基于恶意代码检测报警系统的恶意代码检测方法 |
CN116628684A (zh) * | 2023-07-19 | 2023-08-22 | 杭州海康威视数字技术股份有限公司 | 移动应用安全风险监测预警方法、系统、装置及电子设备 |
US11763007B1 (en) * | 2023-04-19 | 2023-09-19 | Citibank, N.A. | Systems and methods for performing vulnerability assessment on partially functional applications |
CN117056921A (zh) * | 2023-08-11 | 2023-11-14 | 上海弘连网络科技有限公司 | 生成Frida脚本与APK动态分析的方法、系统、设备及介质 |
-
2021
- 2021-12-21 CN CN202111573217.8A patent/CN114238948A/zh active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115688109A (zh) * | 2023-01-04 | 2023-02-03 | 杭州云缔盟科技有限公司 | 一种基于恶意代码检测报警系统的恶意代码检测方法 |
US11763007B1 (en) * | 2023-04-19 | 2023-09-19 | Citibank, N.A. | Systems and methods for performing vulnerability assessment on partially functional applications |
CN116628684A (zh) * | 2023-07-19 | 2023-08-22 | 杭州海康威视数字技术股份有限公司 | 移动应用安全风险监测预警方法、系统、装置及电子设备 |
CN116628684B (zh) * | 2023-07-19 | 2023-10-13 | 杭州海康威视数字技术股份有限公司 | 移动应用安全风险监测预警方法、系统、装置及电子设备 |
CN117056921A (zh) * | 2023-08-11 | 2023-11-14 | 上海弘连网络科技有限公司 | 生成Frida脚本与APK动态分析的方法、系统、设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114238948A (zh) | 一种应用程序检测方法、装置、电子设备及存储介质 | |
CN112015430A (zh) | JavaScript代码翻译方法、装置、计算机设备及存储介质 | |
CN105357204B (zh) | 生成终端识别信息的方法及装置 | |
CN105431859A (zh) | 指示恶意软件的信号标记 | |
CN115150261A (zh) | 告警分析的方法、装置、电子设备及存储介质 | |
CN111552463A (zh) | 一种页面跳转方法、装置、计算机设备及存储介质 | |
US9274755B2 (en) | Infrastructure for generating code using annotation and template generators | |
CN113885876A (zh) | 一种参数校验方法、装置、存储介质及计算机系统 | |
WO2023151397A1 (zh) | 应用程序部署方法、装置、设备及介质 | |
CN112632547A (zh) | 一种数据处理方法和相关装置 | |
CN111260080A (zh) | 基于机器学习的流程优化方法、装置、终端及存储介质 | |
CN112817782B (zh) | 一种数据采集上报方法、装置、电子设备和存储介质 | |
CN112287643B (zh) | 消息监听方法、装置、设备及计算机可读存储介质 | |
CN115203674A (zh) | 一种应用程序自动登录方法、系统、装置及存储介质 | |
CN114461223A (zh) | 一种代码生成方法、装置及终端设备 | |
CN112783500B (zh) | 编译优化信息生成方法、装置及电子设备 | |
CN113297622A (zh) | 一种日志脱敏方法、系统、电子设备及存储介质 | |
CN111580799A (zh) | 领域特定语言脚本拼装方法及系统 | |
CN111880805A (zh) | 软件项目的包文件生成方法及装置、设备、存储介质 | |
CN111488286A (zh) | 一种Android模块独立开发的方法及装置 | |
CN111144086B (zh) | 一种日志格式化方法及装置、电子设备、存储介质 | |
CN116661758B (zh) | 一种优化日志框架配置的方法、装置、电子设备及介质 | |
CN114003317A (zh) | 内联实现方法及装置、电子设备、存储介质及程序产品 | |
CN114564206A (zh) | 一种数据非空校验方法、装置、设备及可读存储介质 | |
CN113704561A (zh) | 数据处理方法、装置、计算机设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |