掌桥专利:专业的专利平台
掌桥专利
首页

Android应用检测分析方法、电子设备及存储介质

文献发布时间:2023-06-19 10:48:02


Android应用检测分析方法、电子设备及存储介质

技术领域

本公开涉及计算机安全技术领域,尤其涉及一种Android应用检测分析方法、电子设备及存储介质。

背景技术

近年来移动智能设备迅速发展,Android操作系统及应用也得到越来越广泛的使用,各类Android应用提供了即时通信、移动支付、视频分享等丰富的功能和服务,为人们的生活和工作带来便利,甚至成为了用户生活中不可缺少的一部分。然而,Android应用中也可能存在一些问题,比如仿冒应用可能造成用户的财产损失、有安全漏洞的应用可能导致用户隐私泄漏、存在兼容性问题的应用可能发生程序崩溃影响使用等等。

发明内容

有鉴于此,本公开的目的在于提出一种Android应用检测分析方法、电子设备及存储介质。

基于上述目的,本公开的第一个方面,提供了一种Android应用检测分析方法,包括:

获取目标Android应用的字节码文件与本地可执行文件,分别对所述字节码文件与所述本地可执行文件进行反编译以确定Java代码与本地代码,并获取相应的Java基本信息与本地基本信息;

根据所述Java基本信息将所述Java代码中的Java指令转换为Java抽象指令,根据所述本地基本信息将所述本地代码中的本地指令转换为本地抽象指令,其中,所述Java抽象指令与所述本地抽象指令基于共同的抽象基类;

根据所述Java抽象指令对所述Java代码进行函数分析以确定所述Java代码的Java函数信息,并根据所述Java函数信息确定所述Java代码的功能模块结构;

根据所述本地抽象指令对所述本地代码进行函数分析以确定所述本地代码的本地函数信息,并根据所述本地函数信息确定所述本地代码的功能模块结构;

根据所述Java函数信息与所述本地函数信息进行跨语言分析以确定所述Java代码与所述本地代码的函数连接关系;

根据所述Java代码的功能模块结构、所述本地代码的功能模块结构与所述函数连接关系构建所述目标Android应用的全局控制流图;

利用静态分析工具根据所述Java基本信息、所述本地基本信息、所述Java函数信息、所述本地函数信息、所述Java代码的功能模块结构、所述本地代码的功能模块结构、所述函数连接关系以及所述全局控制流图对所述目标Android应用进行检测分析。

本公开的第二个方面,提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面所述的方法。

本公开的第三个方面,提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储电子装置的一组指令,该组指令用于使所述电子装置执行第一方面所述的方法。

从上面所述可以看出,本公开提供的Android应用检测分析方法、电子设备及存储介质,对目标Android应用的字节码文件与本地可执行文件进行预处理获取Java基本信息与本地基本信息从而将Java指令与本地指令转换为基于共同抽象基类的Java抽象指令与本地抽象指令,从而能够忽略Android应用中Java层与本地层这两种架构间的差异,更有利于挖掘出本地代码中的隐藏特征信息;之后基于Java抽象指令与本地抽象指令对Android应用进行函数分析,确定Java代码与本地代码的函数信息,包括多个函数的函数入口、函数边界以及函数间的调用关系,并进一步的确定Java代码、本地代码各自的功能模块结构;之后根据Java代码与本地代码的函数信息进行跨语言分析确定Java代码与本地代码间的函数连接关系,根据Java代码、本地代码各自的功能模块结构以及跨语言的函数连接关系构建出Android应用的全局控制流图,进而可以从Java层与本地层的基本信息、函数信息、功能模块结构、函数连接关系以及全局控制流图这多个层面上对目标Android应用进行分析及检测,以确定目标Android应用中可能存在的问题。本公开所提供的Android应用检测分析方法、电子设备及存储介质能够对复杂的Android应用进行分析,将提取 Java 代码和本地代码的基本程序特征,并且根据跨语言调用连接两种代码,对Android应用的检测分析更加全面、适用覆盖率更高;

并且针对本地代码中很多难以分析的复杂代码片段将其转换为抽象指令后不会影响对整体技术方案的有效实施,健壮性更强且方案实施更加便捷。

附图说明

为了更清楚地说明本公开或相关技术中的技术方案,下面将对实施例或相关技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本公开实施例所提供的一种Android应用检测分析方法示意图;

图2为本公开实施例所提供的一种Android应用检测分析方法中函数分析的方法示意图;

图3为本公开实施例所提供的一种Android应用检测分析方法中对操作数分析的方法示意图;

图4为本公开实施例所提供的一种Android应用检测分析方法中跨语言分析的方法示意图;

图5为本公开实施例所提供的一种Android应用检测分析方法中构建全局控制流图的方法示意图;

图6为本公开实施例所提供的一种Android应用检测分析电子设备示意图。

具体实施方式

为使本公开的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本公开进一步详细说明。

需要说明的是,除非另外定义,本公开实施例使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。

近年来移动智能设备迅速发展,Android操作系统及应用也得到越来越广泛的使用,各类Android应用提供了即时通信、移动支付、视频分享等丰富的功能和服务,为人们的生活和工作带来便利,甚至成为了用户生活中不可缺少的一部分。然而,Android应用中也可能存在一些问题,比如仿冒应用可能造成用户的财产损失、有安全漏洞的应用可能导致用户隐私泄漏、存在兼容性问题的应用可能发生程序崩溃影响使用等等。针对这些问题,相关技术中开发了许多 Android 应用分析工具,如恶意应用分析检测工具、第三方库检测工具、应用漏洞分析工具、应用克隆检测工具等。

在一些相关技术中的恶意行为分析检测工具只支持对Android应用Java代码部分的检测而大多不支持本地代码,无法检测出仅在本地代码中执行恶意行为的恶意应用;第三方库检测工具可以正常的检测Java第三方库但也不支持本地代码的检测,无法实现同一种算法同时检测两种代码的第三方库,无法获取全面的检测结果;污点追踪工具大多不支持本地代码,也无法找到所有的敏感数据泄漏路径。而在实际应用中Android应用多使用本地代码来实现主体功能,同时又包含了一些 Java 代码的第三方库,相关技术中的重打包检测工具无法支持本地代码检测,因而也无法正确全面地分析此类应用。

因为Android应用中本地代码格式复杂、代码关键信息隐蔽无法直接获取,Java代码与本地代码因为架构不同而存在不同的代码特征,而对Android应用进行分析时无法将相互关联的Java代码与本地代码独立开去进行分析,因此相关技术很对Android应用整体框架作出全面分析。

有鉴于此,本公开针对Java层与本地层之间的代码架构差异将Java代码与本地代码统一转换为基于共同抽象基类的抽象指令,在保有各自代码函数信息的同时实现对Android应用框架的统一整体分析,在抽象指令基础上分别对Java代码、本地代码进行函数分析确定各自函数信息以及函数连接关系进而确定Android应用的整体控制流图,最后从基本信息、抽象指令、函数信息、功能模块以及整体控制流图多个层次实现对Android应用的全面分析检测,检测分析更加全面、适用覆盖率更高、健壮性更强且方案实施更加便捷。

基于上述思路,在本公开的第一方面,提供了一种Android应用检测分析方法。

如图1所示,本公开的一些可选实施例所提供的一种Android应用检测分析方法,包括:

S1:获取目标Android应用的字节码文件(.dex文件)与本地可执行文件(.ELF文件),分别对所述字节码文件与所述本地可执行文件进行反编译以确定Java代码与本地代码,并获取相应的Java基本信息与本地基本信息;

在将所述字节码文件反编译获取Java代码时可以获取到Java代码相应的Java基本信息,所述Java基本信息包括:Java代码中多个类的名字与类的继承关系;Java代码中多个方法的名字、相应的参数表以及多个方法与多个类之间的从属关系、多个方法相应的方法入口以及方法终点;Java代码中多个域的域名与类型;Java点中多个Java指令的操作符与操作数;

在将所述本地可执行文件反编译获取本地代码时可以获取到本地代码相应的本地基本信息,所述本地基本信息包括本地代码中的部分函数的函数名与相应的函数入口以及本地代码中多个本地指令的操作符与操作数。

S2:根据所述Java基本信息将所述Java代码中的Java指令转换为Java抽象指令,根据所述本地基本信息将所述本地代码中的本地指令转换为本地抽象指令,其中,所述Java抽象指令与所述本地抽象指令基于共同的抽象基类;

Android应用的Java代码与本地代码使用不同的指令集,两种代码的架构之间存在差异,可以根据所述Java基本信息以及所述本地基本信息将所述Java代码与所述本地代码转换为基于共同抽象基类的抽象指令;

在本公开的一些可选实施例中,可以首先分别根据所述Java基本信息与所述本地基本信息获取相应的Java指令信息与本地指令信息,再分别根据所述Java指令信息与所述本地执行信息对相应的Java指令与本地指令进行转换。其中,对于Java代码中的Java指令,可以根据所述Java指令信息基于DexInst抽象列将所述Java指令转换为Java抽象指令,对于本地代码中的本地指令,可以根据所述本地指令信息基于ArmInst抽象类将所述本地指令转换为本地抽象指令;

其中,所述DexInst抽象类与所述ArmInst抽象类基于共同的Inst抽象基类。基于此共同的Inst抽象基类来描述所述Java代码中的Java指令与本地代码中的本地指令,提取Java代码与本地代码的共同点而忽略Java代码与本地代码架构的不同之处,以便以在共同基类基础上对Android应用整体进行统一的分析操作。

S3:根据所述Java抽象指令对所述Java代码进行函数分析以确定所述Java代码的Java函数信息,并根据所述Java函数信息确定所述Java代码的功能模块结构;

所述Java函数信息包括所述Java代码中的多个Java函数的函数入口信息、函数边界信息以及多个所述Java函数之间的函数调用关系;

可以根据所述Java函数信息结合所述Java基本信息将所述Java代码划分为多个功能模块,将多个功能模块组合确定相应的功能模块结构,对于所述Java代码可以根据所述Java基本信息和所述Java函数信息将功能模块组织为树状结构;

S4:根据所述本地抽象指令对所述本地代码进行函数分析以确定所述本地代码的本地函数信息,并根据所述本地函数信息确定所述本地代码的功能模块结构;

所述本地函数信息包括所述本地代码中的多个本地函数的函数入口信息、函数边界信息以及多个所述本地函数之间的函数调用关系;

可以根据所述本地函数信息结合所述本地基本信息将所述本地代码划分为多个功能模块,将多个功能模块组合以确定所述本地代码的功能模块结构;

S5:根据所述Java函数信息与所述本地函数信息进行跨语言分析以确定所述Java代码与所述本地代码的函数连接关系;

根据所述Java函数信息与所述本地函数信息确定所Java函数对本地函数的调用关系以及所述本地函数对Java函数的响应关系,所述函数连接关系即包括所述Java函数对所述本地函数的所述调用关系以及所述本地函数对所述Java函数的所述响应关系;

S6:根据所述Java代码的功能模块结构、所述本地代码的功能模块结构与所述函数连接关系构建所述目标Android应用的全局控制流图;

可以根据所述Java代码的功能模块结构确定所述Java代码相应的Java控制流图,根据所述本地代码的功能模块结构确定所述本地代码相应的本地控制流图,之后根据所述函数连接关系将所述Java控制流图与本地控制流图相连接以构建所述全局控制流图;

S7:利用静态分析工具根据所述Java基本信息、所述本地基本信息、所述Java函数信息、所述本地函数信息、所述Java代码的功能模块结构、所述本地代码的功能模块结构、所述函数连接关系以及所述全局控制流图对所述目标Android应用进行检测分析;

通过对所述Java代码与所述本地代码的代码指令转换、函数分析以及跨语言分析,依次获取所述Java基本信息、所述本地基本信息、所述Java函数信息、所述本地函数信息、所述Java代码的功能模块结构、所述本地代码的功能模块结构、所述函数连接关系以及所述全局控制流图,这些信息能够在整体框架上反映出所述目标Android应用不同层面的特征信息,根据这些特征信息可以利用静态分析工具对所述目标Android应用进行检测分析以确定所述Android应用中可能存在的问题。

从上面所述可以看出,本公开提供的Android应用检测分析方法、电子设备及存储介质,对目标Android应用的字节码文件与本地可执行文件进行预处理获取Java基本信息与本地基本信息从而将Java指令与本地指令转换为基于共同抽象基类的Java抽象指令与本地抽象指令,从而能够忽略Android应用中Java层与本地层这两种架构间的差异,更有利于挖掘出本地代码中的隐藏特征信息;之后基于Java抽象指令与本地抽象指令对Android应用进行函数分析,确定Java代码与本地代码的函数信息,包括多个函数的函数入口、函数边界以及函数间的调用关系,并进一步的确定Java代码、本地代码各自的功能模块结构;之后根据Java代码与本地代码的函数信息进行跨语言分析确定Java代码与本地代码间的函数连接关系,根据Java代码、本地代码各自的功能模块结构以及跨语言的函数连接关系构建出Android应用的全局控制流图,进而可以从Java层与本地层的基本信息、函数信息、功能模块结构、函数连接关系以及全局控制流图这多个层面上对目标Android应用进行分析及检测,以确定目标Android应用中可能存在的问题。本公开所提供的Android应用检测分析方法、电子设备及存储介质能够对复杂的Android应用进行分析,将提取 Java 代码和本地代码的基本程序特征,并且根据跨语言调用连接两种代码,对Android应用的检测分析更加全面、适用覆盖率更高;

并且针对本地代码中很多难以分析的复杂代码片段将其转换为抽象指令后不会影响对整体技术方案的有效实施,健壮性更强且方案实施更加便捷。

如图2所示,在本公开的一些可选实施例所提供的一种Android应用检测分析方法中,所述根据所述本地抽象指令对所述本地代码进行函数分析以确定所述本地代码的本地函数信息S4,进一步包括:

S201:对所述本地抽象指令进行指令分析以确定所述本地代码中的多个本地函数以及相应的本地函数入口;

可以遍历所述本地指令中的多条本地抽象指令进行指令分析以确定多个本地函数及相应的本地函数入口;

在一些可选实施例中,对所述本地抽象指令进行指令分析进一步包括:

对所述本地抽象指令中的操作数进行分析以确定所述本地抽象指令是否执行函数调用;

响应于所述本地抽象指令执行函数调用,所述本地抽象指令所调用的函数即所述本地函数,根据所述本地抽象指令中的所述操作数确定所述本地函数相应的所述本地函数入口;

可以采用上述的方式遍历分析本地代码中的多条本地抽象指令,即可确定本地代码中的多个本地函数以及相应的本地函数入口;

进一步的,在对所述本地抽象指令进行指令分析以确定所述本地代码中的多个本地函数以及相应的本地函数入口时,可以不用对所述本地代码中的所有本地抽象指令都进行指令分析,而可以首先缩小指令分析的范围,即选取所述本地抽象指令中可能调用函数的部分抽象指令进行分析;

所述本地代码中的多条本地抽象指令中可能调用函数的部分抽象指令即包括函数调用指令与伪函数调用指令,所述伪函数调用指令是指符合函数调用指令格式的本地抽象指令;

因此可以将遍历分析的范围缩小到针对所述函数调用指令与所述伪函数调用指令;

在一些可选实施例中,所述对所述本地抽象指令中的操作数进行分析以确定所述本地抽象指令是否执行函数调用,进一步包括:

对所述函数调用指令中的操作数进行分析以确定所述函数调用指令是否执行函数调用;

以及,对所述伪函数调用指令中的操作数进行分析以确定所述伪函数调用指令是否执行函数调用;

其中,对所述本地代码中的多条所述函数调用指令的操作数进行分析能够保证所确定的多个本地函数的精确率,对本地代码中的多条所述伪函数调用指令的操作数进行分析能够保证所确定的多个本地函数的召回率;

在对多条所述函数调用指令进行分析时可以从所述本地代码的入口函数为起点利用广度优先算法进行分析从而确定被入口函数直接或间接调用的多个本地函数,其中,所述入口函数可以根据所述本地代码相应的本地基本信息确定;

采用上述方式首先缩小指令分析范围,能够大大减少指令分析的工作量精确确定本地函数以及相应的本地函数入口信息,从而提高方案整体执行效率;

S202:从所述本地函数入口开始根据所述本地函数中所述本地抽象指令的执行顺序确定所述本地函数相应的本地函数边界;

在确定所述本地函数入口之后,以所述本地函数入口为起点根据多条本地抽象指令的执行顺序划分出基本块,可以根据相应的基本块确定出所述本地函数的本地函数边界;

S203:根据多个所述本地函数的所述本地函数入口与所述本地函数边界,确定多个所述本地函数的函数调用关系;

所述本地函数信息包括多个所述本地函数的所述本地函数入口、所述本地函数边界以及所述函数调用关系。

在根据所述本地抽象指令中的操作数分析时可以首先确定所述操作数的属性,即分析判断所述操作数是否为指向地址的操作数,当所述操作数指向某一目标地址时,接下来需要判断所述本地抽象指令通过所述操作数指向这一目标地址是否用于调用一个新的函数,即分析判断所述目标地址是否指向一个目标函数。

如图3所示,在本公开的一些可选实施例所提供的一种Android应用检测分析方法中,所述对所述本地抽象指令中的操作进行分析以确定所述本地抽象指令是否执行函数调用,进一步包括:

S301:对所述本地抽象指令中的所述操作数的寻址方式与数据类型进行分析以确定所述操作数是否为目标地址;

S302:响应于所述操作数为目标地址,对所述目标地址进行分析以确定所述操作数是否指向目标函数;

S303:响应于所述操作数指向目标函数,则确定所述本地抽象指令执行函数调用,所调用的函数为所述目标函数;

其中,对所述本地抽象指令中的所述操作数的寻址方式与数据类型进行分析以确定所述操作数是否为目标地址S301,进一步包括:

对所述操作数的寻址方式进行分析;

响应于所述操作数的寻址方式为寄存器寻址,说明所述操作数可能存储有目标地址,还需要进一步进行判断,即对所述操作数的数据类型进行分析;

对所述操作数的数据类型进行分析实际上是对所述操作数的数据进行常量分析,在执行这一操作时需要依赖于对本地代码的基本块划分结果;

因此,一些可选实施例中,在对所述操作数的数据类型进行分析,可以首先根据所述本地代码的多条所述本地抽象指令的执行顺序确定所述本地代码的基本块信息,之后根据所述基本块信息确定所述操作数的数据类型;

响应于所述操作数的数据类型为常量,则确定所述操作数为目标地址,根据所述操作数的数值确定所述目标地址;

响应于所述操作数的数据类型为半常量,则确定所述操作数为目标地址,根据所述操作数的多个可选数值确定多个相应的所述目标地址;

在确定所述操作数指向目标地址之后,进一步需要对所述目标地址进行分析确定所述目标地址是否指向目标函数;

在一些可选实施例中,所述对所述目标地址进行分析以确定所述操作数是否指向目标函数S302,进一步包括:

判断所述目标地址是否指向所述本地代码中的所述本地抽象指令;

响应于所述目标地址未指向所述本地抽象指令,即所述目标地址所指向的位置不在所述本地代码中,则确定所述目标地址未指向目标函数;

响应于所述目标地址指向所述本地抽象指令,则从所述目标地址开始获取抽象指令段,对所述抽象指令段进行分析;

响应于所述抽象指令段中存在非法指令,则确定所述目标地址未指向目标函数;

响应于所述抽象指令段的多条所述本地抽象指令先执行数据压栈操作或处理栈指针操作,则确定所述目标地址指向目标函数;

其中,所述抽象指令段是指由从所述目标地址所指向的本地抽象指令到结果返回指令(return指令)的多条本地抽象指令所组成的指令段,在一些可选实施例中所述抽象指令段的指令长度也可以根据实际情况进行自行设定,例如可以从所述目标地址所指向的位置开始取10条所述本地抽象指令,对这10条本地抽象指令进行分析。

在确定Java函数信息、本地函数信息以及所述Java代码、本地代码相应的功能模块结构之后,还需要对所述Java代码和本地代码进行跨语言分析以确定Java代码与本地代码之间的函数连接关系以便于之后构建完成的全局控制流图。

如图4所示,在本公开的一些可选实施例所提供的一种Android应用检测分析方法中,所述根据所述Java函数信息与所述本地函数信息进行跨语言分析以确定所述Java代码与所述本地代码的函数连接关系,进一步包括:

S401:在所述Java代码中,根据所述Java函数信息选取Java本地接口函数,根据所述Java本地接口函数中的函数调用指令在所述本地代码中确定所述Java本地接口函数所调用的本地目标函数;

S402:在所述本地代码中,通过追踪起始函数中android_app指针在多个本地函数间的传递情况从多个所述本地函数中筛选出所述本地目标函数;

对于所述Java本地接口函数(JNI,JavaNativeInterface)的跨语言函数调用,可以获取相应其中相应的应用程序接口(API, Application Programming Interface),如GetMethodID 和 CallTypeMethod的函数调用指令,根据所述函数调用指令的字符串常量参数在所述本地代码中确定所调用的本地目标函数;

S403:根据所述android_app指针的回调函数信息在所述Java代码中确定与所述本地目标函数对应的Java回调函数;

S404:根据所述Java回调函数在所述Java代码中确定所述本地目标函数所响应的所述Java本地接口函数。

对于本地代码中被Java代码中的JNI函数所调用的本地函数,为响应所述JNI函数会执行函数回调,即所述本地函数返过来去调用所述Java代码中的Java回调函数;

针对本地函数回调,可以将本地代码中的入口函数android_main中的参数android_app指针视为一个特殊常量,追踪它在多个本地函数间的传递情况。一旦发现某个本地函数使用的结构体成员偏置符合 android_app 中的回调函数成员,可以确定该本地函数为被JNI函数跨语言调用的本地目标函数,进一步的可以根据所述android_app指针的回调函数信息确定所述Java代码中的相应的Java回调函数;所述本地目标函数与所述Java回调函数间存在对应关系,所述本地目标函数与所要响应的JNI函数也存在对应关系,可以根据所述Java回调函数在所述Java代码中确定所述本地目标函数所响应的所述Java本地接口函数。

由此可以确定Java代码中的Java本地接口函数与本地代码中的本地目标函数间的调用关系,以及本地代码中的本地目标函数与Java代码中Java本地接口函数之间的响应关系,所述Java代码与所述本地代码的函数连接关系包括所述调用关系与所述响应关系。

确定Java代码与本地代码之间的函数连接关系之后可以再结合所述Java代码与所述本地代码的各自的功能模块结构来构建所述目标Android应用的全局控制流图。

如图5所示,在本公开的一些可选实施例所提供的一种Android应用检测分析方法中,所述根据所述Java代码的功能模块结构、所述本地代码的功能模块结构与所述函数连接关系构建所述目标Android应用的全局控制流图,进一步包括:

S501:根据所述Java代码的功能模块结构构建Java控制流图,所述Java控制流图包括与所述Java本地接口函数对应的Java本地接口函数节点;

可以将所述Java代码的功能模块结构中各个功能模块作为控制流图中的图节点,并根据所述Java函数信息确定多个功能模块之间的控制调用关系完成多个图节点之间的有向连接从而构建得到所述Java控制流图;

S502:根据所述本地代码的功能模块结构构建本地控制流图,所述本地控制流图包括与所述本地目标函数对应的本地目标函数节点;

可以采用与构建Java控制流图同样的思路,将所述本地代码的功能模块结构中的各个功能模块作为控制流图的图节点,结合本地函数信息确定不同功能模块间的控制调用关系将相应的图节点进行有向连接以得到所述本地控制流图;

S503:根据所述函数连接关系将所述Java本地接口函数节点与所述本地目标函数节点进行连接以确定所述全局控制流图;

根据所述Java函数信息与所述本地函数信息进行跨语言分析能够以确定所述Java代码与所述本地代码的函数连接关系,具体的包括Java代码中的Java本地接口函数与本地代码中的本地目标函数间的调用关系,以及本地代码中的本地目标函数与Java代码中Java本地接口函数之间的响应关系,可以根据所述调用关系与所述响应关系将所述Java本地接口函数节点与所述本地目标函数节点进行有向连接;

在一些可选实施例中,所述根据所述函数连接关系将所述Java本地接口函数节点与所述本地目标函数节点进行连接进一步包括:

根据所述Java本地接口函数所调用的本地目标函数,将所述Java控制流图中的所述Java本地接口函数节点与所述本地控制流图中的所述本地目标函数节点有向连接,连接方向为由所述Java本地接口函数节点指向所述本地目标函数节点;

根据所述本地目标函数所响应的所述Java本地接口函数,将所述本地控制流图中的所述本地目标函数节点与所述Java控制流图中的所述Java本地接口函数节点有向连接,连接方向为由所述本地目标函数节点指向所述Java本地接口函数节点。

需要说明的是,本公开实施例的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本公开实施例的方法中的某一个或多个步骤,这多台设备相互之间会进行交互以完成所述的方法。

需要说明的是,上述对本公开的一些实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于上述实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

基于同一发明构思,与上述任意实施例方法相对应的,本公开还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上任意一实施例所述的Android应用检测分析方法。

图6示出了本实施例所提供的一种更为具体的电子设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线 1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。

处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。

存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。

输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。

通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。

总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。

需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。

上述实施例的电子设备用于实现前述任一实施例中相应的所述Android应用检测分析方法,并且具有相应的方法实施例的有益效果,在此不再赘述。

基于同一发明构思,与上述任意实施例方法相对应的,本公开还提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行如上任一实施例所述的Android应用检测分析方法。

本实施例的计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。

上述实施例的存储介质存储的计算机指令用于使所述计算机执行如上任一实施例所述的Android应用检测分析方法,并且具有相应的方法实施例的有益效果,在此不再赘述。

需要说明的是,本公开的实施例还可以以下方式进一步描述:

一种Android应用检测分析方法,所述方法包括:

获取目标Android应用的字节码文件与本地可执行文件,分别对所述字节码文件与所述本地可执行文件进行反编译以确定Java代码与本地代码,并获取相应的Java基本信息与本地基本信息;

根据所述Java基本信息将所述Java代码中的Java指令转换为Java抽象指令,根据所述本地基本信息将所述本地代码中的本地指令转换为本地抽象指令,其中,所述Java抽象指令与所述本地抽象指令基于共同的抽象基类;

根据所述Java抽象指令对所述Java代码进行函数分析以确定所述Java代码的Java函数信息,并根据所述Java函数信息确定所述Java代码的功能模块结构;

根据所述本地抽象指令对所述本地代码进行函数分析以确定所述本地代码的本地函数信息,并根据所述本地函数信息确定所述本地代码的功能模块结构;

根据所述Java函数信息与所述本地函数信息进行跨语言分析以确定所述Java代码与所述本地代码的函数连接关系;

根据所述Java代码的功能模块结构、所述本地代码的功能模块结构与所述函数连接关系构建所述目标Android应用的全局控制流图;

利用静态分析工具根据所述Java基本信息、所述本地基本信息、所述Java函数信息、所述本地函数信息、所述Java代码的功能模块结构、所述本地代码的功能模块结构、所述函数连接关系以及所述全局控制流图对所述目标Android应用进行检测分析。

可选的,所述根据所述Java基本信息将所述Java代码中的Java指令转换为Java抽象指令,进一步包括:

根据所述Java基本信息确定所述Java指令的指令信息;

根据所述Java指令的指令信息,基于DexInst抽象类将所述Java指令转换为所述Java抽象指令;

所述根据所述本地基本信息将所述本地代码中的本地指令转换为本地抽象指令,进一步包括:

根据所述本地基本信息确定所述本地指令的指令信息;

根据所述本地指令的指令信息,基于ArmInst抽象类将所述本地指令转换为所述本地抽象指令;

其中,所述DexInst抽象类与所述ArmInst抽象类基于共同的Inst抽象基类。

可选的,所述根据所述本地抽象指令对所述本地代码进行函数分析以确定所述本地代码的本地函数信息,进一步包括:

对所述本地抽象指令进行指令分析以确定所述本地代码中的多个本地函数以及相应的本地函数入口;

从所述本地函数入口开始根据所述本地函数中所述本地抽象指令的执行顺序确定所述本地函数相应的本地函数边界;

根据多个所述本地函数的所述本地函数入口与所述本地函数边界,确定多个所述本地函数的函数调用关系;

所述本地函数信息包括多个所述本地函数的所述本地函数入口、所述本地函数边界以及所述函数调用关系。

可选的,所述对所述本地抽象指令进行指令分析以确定所述本地代码中的多个本地函数以及相应的本地函数入口,进一步包括:

对所述本地抽象指令中的操作数进行分析以确定所述本地抽象指令是否执行函数调用;

响应于所述本地抽象指令执行函数调用,所述本地抽象指令所调用的函数即所述本地函数,根据所述本地抽象指令中的所述操作数确定所述本地函数相应的所述本地函数入口;

其中,所述本地抽象指令包括函数调用指令与伪函数调用指令,所述伪函数调用指令是指符合函数调用指令格式的本地抽象指令;

所述对所述本地抽象指令中的操作数进行分析以确定所述本地抽象指令是否执行函数调用,进一步包括:

对所述函数调用指令中的操作数进行分析以确定所述函数调用指令是否执行函数调用;

以及,对所述伪函数调用指令中的操作数进行分析以确定所述伪函数调用指令是否执行函数调用。

可选的,所述对所述本地抽象指令中的操作进行分析以确定所述本地抽象指令是否执行函数调用,进一步包括:

对所述本地抽象指令中的所述操作数的寻址方式与数据类型进行分析以确定所述操作数是否为目标地址;

响应于所述操作数为目标地址,对所述目标地址进行分析以确定所述操作数是否指向目标函数;

响应于所述操作数指向目标函数,则确定所述本地抽象指令执行函数调用,所调用的函数为所述目标函数;

其中,对所述本地抽象指令中的所述操作数的寻址方式与数据类型进行分析以确定所述操作数是否为目标地址,进一步包括:

对所述操作数的寻址方式进行分析;

响应于所述操作数的寻址方式为寄存器寻址,对所述操作数的数据类型进行分析;

响应于所述操作数的数据类型为常量,则确定所述操作数为目标地址,根据所述操作数的数值确定所述目标地址;

响应于所述操作数的数据类型为半常量,则确定所述操作数为目标地址,根据所述操作数的多个可选数值确定多个相应的所述目标地址;

其中,所述对所述操作数的数据类型进行分析,进一步包括:

根据所述本地代码的多条所述本地抽象指令的执行顺序确定所述本地代码的基本块信息;

根据所述基本块信息确定所述操作数的数据类型。

可选的,所述对所述目标地址进行分析以确定所述操作数是否指向目标函数,进一步包括:

判断所述目标地址是否指向所述本地代码中的所述本地抽象指令;

响应于所述目标地址未指向所述本地抽象指令,则确定所述目标地址未指向目标函数;

响应于所述目标地址指向所述本地抽象指令,则从所述目标地址开始获取抽象指令段,对所述抽象指令段进行分析;

响应于所述抽象指令段中存在非法指令,则确定所述目标地址未指向目标函数;

响应于所述抽象指令段的多条所述本地抽象指令先执行数据压栈操作或处理栈指针操作,则确定所述目标地址指向目标函数;

其中,所述抽象指令段是指由从所述目标地址所指向的本地抽象指令到结果返回指令的多条本地抽象指令所组成的指令段。

可选的,所述根据所述Java函数信息与所述本地函数信息进行跨语言分析以确定所述Java代码与所述本地代码的函数连接关系,进一步包括:

在所述Java代码中,根据所述Java函数信息选取Java本地接口函数;

根据所述Java本地接口函数中的函数调用指令在所述本地代码中确定所述Java本地接口函数所调用的本地目标函数;

在所述本地代码中,通过追踪起始函数中android_app指针在多个本地函数间的传递情况从多个所述本地函数中筛选出所述本地目标函数;

根据所述android_app指针的回调函数信息在所述Java代码中确定与所述本地目标函数对应的Java回调函数;

根据所述Java回调函数在所述Java代码中确定所述本地目标函数所响应的所述Java本地接口函数。

可选的,所述根据所述Java代码的功能模块结构、所述本地代码的功能模块结构与所述函数连接关系构建所述目标Android应用的全局控制流图,进一步包括:

根据所述Java代码的功能模块结构构建Java控制流图,所述Java控制流图包括与所述Java本地接口函数对应的Java本地接口函数节点;

根据所述本地代码的功能模块结构构建本地控制流图,所述本地控制流图包括与所述本地目标函数对应的本地目标函数节点;

根据所述函数连接关系将所述Java本地接口函数节点与所述本地目标函数节点进行连接以确定所述全局控制流图;

其中,所述根据所述函数连接关系将所述Java本地接口函数节点与所述本地目标函数节点进行连接进一步包括:

根据所述Java本地接口函数所调用的本地目标函数,将所述Java控制流图中的所述Java本地接口函数节点与所述本地控制流图中的所述本地目标函数节点有向连接,连接方向为由所述Java本地接口函数节点指向所述本地目标函数节点;

根据所述本地目标函数所响应的所述Java本地接口函数,将所述本地控制流图中的所述本地目标函数节点与所述Java控制流图中的所述Java本地接口函数节点有向连接,连接方向为由所述本地目标函数节点指向所述Java本地接口函数节点。

所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本公开的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本公开实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。

另外,为简化说明和讨论,并且为了不会使本公开实施例难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本公开实施例难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本公开实施例的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本公开的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本公开实施例。因此,这些描述应被认为是说明性的而不是限制性的。

尽管已经结合了本公开的具体实施例对本公开进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。

本公开实施例旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本公开实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本公开的保护范围之内。

相关技术
  • Android应用检测分析方法、电子设备及存储介质
  • 异常检测、异常分析方法、装置、电子设备和存储介质
技术分类

06120112685371