Android系统中的文件脱壳方法及装置与流程

文档序号:12906357阅读:198来源:国知局
Android系统中的文件脱壳方法及装置与流程

本发明涉及计算机应用技术领域,尤其涉及一种android系统中的文件脱壳方法及装置。



背景技术:

随着计算机应用技术的飞速发展,针对android系统所设计的应用程序越来越多,程序员为了缩小应用程序所占用的磁盘空间,或者,为了防止其所设计的应用程序不被非法修改或者反编译,通常都会对应用程序所对应的可执行代码文件进行加壳,以形成应用程序的加壳文件。

相对的,应用程序在运行之前就需要对加壳文件进行脱壳,以使应用程序通过加载相应的可执行代码能够顺畅运行。

然而,现有的文件脱壳方法通常是利用android模拟器将应用程序运行时的内存全部转录(dump)下来,再从dump得到的内存中寻找应用程序的可执行代码,进而形成可执行代码文件,以此达到文件脱壳目的。

该种方法需要花费大量的时间进行内存的dump,因此,仍存在文件脱壳效率低的问题。



技术实现要素:

基于此,有必要提供一种android系统中的文件脱壳方法,所述方法能够提高文件脱壳效率。

此外,还有必要提供一种android系统中的文件脱壳装置,所述装置能够提高文件脱壳效率。

为了解决上述技术问题,本发明所采用的技术方案为:

一种android系统中的文件脱壳方法,包括:获取目标应用的应用信息;在所述目标应用指定的运行环境中启动所述目标应用,根据所述应用信息监控启动的所述目标应用的运行状态;当所述目标应用的运行状态为解密状态时,通过结构体得到可执行代码文件,所述结构体是所述目标应用的可执行代码加载至运行环境对应形成的。

一种android系统中的文件脱壳装置,包括:信息获取模块,用以获取目标应用的应用信息;状态监控模块,用以在所述目标应用指定的运行环境中启动所述目标应用,根据所述应用信息监控启动的所述目标应用的运行状态;文件组装模块,用以当所述目标应用的运行状态为解密状态时,通过结构体得到可执行代码文件,所述结构体是所述目标应用的可执行代码加载至运行环境对应形成的。

与现有技术相比,本发明具有以下有益效果:

为实现目标应用的文件脱壳,获取目标应用的应用信息,在目标应用指定的运行环境中启动目标应用,根据应用信息对启动的目标应用进行运行状态监控,当目标应用的运行状态为解密状态时,通过目标应用的可执行代码加载至运行环境所对应的结构体得到可执行代码文件。

也就是说,通过对目标应用的运行状态进行监控,在目标应用处于解密状态时加载目标应用的可执行代码至运行环境,进而利用可执行代码加载至运行环境所对应的结构体,即可得到可执行代码文件,以此达到文件脱壳的目的,避免了现有技术中利用android模拟器对目标应用运行时的全部内存进行dump,从而有效地提高了文件脱壳效率。

附图说明

图1为本发明实施例所提供的一种移动终端的结构示意图;

图2为一实施例的android系统中的文件脱壳方法的流程图;

图3为图2中获取目标应用的应用信息的方法流程图;

图4为图2中根据应用信息监控启动的目标应用的运行状态的方法流程图;

图5为图2中根据结构体得到可执行代码文件的方法流程图;

图5a为图5中dex格式的可执行代码文件的结构示意图;

图6为另一实施例的android系统中的文件脱壳方法的流程图;

图7为一个实施例的android系统中的文件脱壳装置的结构框图;

图8为图7中信息获取模块的结构框图;

图9为图7中状态监控模块的结构框图;

图10为图7中文件脱壳模块的结构框图;

图11为另一实施例的android系统中的文件脱壳装置的结构框图。

具体实施方式

体现本发明特征与优点的典型实施方式将在以下的说明中详细叙述。应理解的是本发明能够在不同的实施方式上具有各种的变化,其皆不脱离本发明的范围,且其中的说明及图示在本质上是当作说明之用,而非用以限制本发明。

应用程序通过运行来为用户提供各种服务,以满足用户各种请求,而应用程序的运行必将需要进行可执行代码的加载,并执行该应用程序所加载的可执行代码。

为了保护应用程序的可执行代码不被篡改或者反编译,程序员通常会对可执行代码所形成的可执行代码文件进行加壳,以形成受保护的加壳文件,从而有效地保护应用程序的安全。

相对的,脱壳即是使加壳文件去掉其所加的“壳”,从而得到可执行代码文件,进而通过运行应用程序的可执行代码保证应用程序顺畅运行。

然而,现有的文件脱壳方法是通过篡改api(applicationprogramminginterface,应用程序编程接口)接口的方式,获取应用程序的可执行代码文件在内存当中的映射空间,然后在应用程序加载可执行代码完成之后dump下应用程序运行时的全部内存至磁盘,并通过获取到的映射空间进行可执行代码文件的查找,以此实现文件脱壳。

该种方法通过android模拟器来运行应用程序,不仅需要花费大量的时间以及占用大量的磁盘存储空间,而且在全部内存空间中查找可执行代码文件相对困难,因为该全部内存空间中会有很多非真正的可执行代码所形成的可执行代码文件。此外,在应用程序运行过程中,还可能由于android系统的原因或者应用程序自身的原因,造成可执行代码被覆盖,从而无法查找到可执行代码文件,导致脱壳失败。

因此,为了提高文件脱壳效率和文件脱壳的成功率,特提出了一种android系统中的文件脱壳方法,该方法运行于移动终端之上。

请参阅图1,图1为本发明实施例所提供的一种移动终端100的结构示意图。该移动终端100可以是智能手机、平板电脑、掌上电脑或者其它可供android系统运行的终端设备。

移动终端100包括存储器101、存储控制器103、一个或多个(图中仅示出一个)处理器105、外设接口107、射频模块109、定位模块111、摄像模块113、音频模块115、触控屏幕117以及按键模块119。这些组件通过一条或多条通讯总线/信号线121相互通讯。

可以理解,图1所示的结构仅为示意,移动终端100还可包括比图1中所示更多或更少的组件,或者具有与图1所示不同的组件。图1中所示的各组件可以采用硬件、软件或者其组合来实现。

其中,存储器101可用于存储软件程序以及模块,如本发明实施例中的文件脱壳方法及装置对应的程序指令及模块,处理器105通过运行存储在存储器101内的程序指令,从而执行各种功能以及数据处理,即实现上述运行于移动终端100的文件脱壳方法。

存储器101作为资源存储的载体,可以是随机存储介质、例如高速随机存储器、非易失性存储器,如一个或多个磁性存储装置、闪存、或者其它固态存储器。存储方式可以是短暂存储或者永久存储。

外设接口107可以包括至少一有线或无线网络接口、至少一串并联转换接口、至少一输入输出接口以及至少一usb接口等等,用于将外部各种输入/输出装置耦合至存储器101以及处理器105,以实现与外部各种输入/输出装置的通信。

射频模块109用于收发电磁波,实现电磁波与电信号的相互转换,从而通过通讯网络与其他设备进行通讯。通信网络包括蜂窝式电话网、无线局域网或者城域网,上述通信网络可以使用各种通信标准、协议及技术。

定位模块111用于获取移动终端100的当前所在的地理位置。定位模块111的实例包括但不限于全球卫星定位系统(gps)、基于无线局域网或者移动通信网的定位技术。

摄像模块113用于拍摄照片或者视频。拍摄的照片或者视频可以存储至存储器101内,还可以通过射频模块109发送。

音频模块115向用户提供音频接口,其可包括一个或多个麦克风接口、一个或多个扬声器接口以及一个或多个耳机接口。通过音频接口与其它设备进行音频数据的交互。音频数据可以存储至存储器101内,还可以通过射频模块109发送。

触控屏幕117在移动终端100与用户之间提供一个输入输出界面。具体地,用户可通过触控屏幕117进行输入操作,例如点击、触摸、滑动等手势操作,以使移动终端对该输入操作进行响应。移动终端100则将文字、图片或者视频任意一种形式或者组合所形成的输出内容通过触控屏幕117向用户显示输出。

按键模块119包括至少一个按键,用以提供用户向移动终端100进行输入的接口,用户可以通过按下不同的按键使移动终端100执行不同的功能。例如,声音调节按键可供用户实现对移动终端100播放的声音音量的调节。

请参阅图2,在一实施例中,一种android系统中的文件脱壳方法包括以下步骤:

步骤210,获取目标应用的应用信息。

本实施例中,目标应用特指待进行文件脱壳的应用程序,其可运行于移动终端的android系统上。该目标应用可以和用户进行交互,具有可视的用户界面。例如,聊天应用是多个用户之间进行会话的应用程序,其具有可视的用户界面,以向用户展示会话界面,通过会话界面呈现多个用户之间进行会话的内容。

目标应用的应用信息包括但不限于目标应用名称、目标应用的活动组件(activity)、服务组件(service)和广播接收器组件(receiver)等等。该应用信息能够使得android系统知悉目标应用的运行状态,进而确认该目标应用是否能够进行用户请求处理。

例如,短消息应用的应用信息中包括一个给选定的联系人写短消息的activity,android系统通过该activity的启动能够知悉短消息应用中与该activity对应的工作已运行,其可以进一步确认是否能够对用户写短消息的请求进行处理,即是否能够给用户选定的联系人写短消息。

基于此,通过获取目标应用的应用信息,将能够使得android系统监控目标应用的运行状态。

步骤230,在目标应用指定的运行环境中启动目标应用,根据应用信息监控启动的目标应用的运行状态。

运行环境是用来运行目标应用的环境,例如,android系统中可供目标应用指定的运行环境是虚拟机所搭建的,其中,虚拟机可以是dalvik虚拟机,还可以是art虚拟机。

目标应用在运行环境中存在的运行状态包括启动、解密和运行三种状态。换而言之,目标应用在指定的运行环境中启动后,将依次进入解密状态、运行状态,从而最终运行于运行环境中来为用户提供各种服务。

进一步地,在获取到目标应用的应用信息之后,android系统将根据应用信息对目标应用的运行状态进行监控,确保目标应用处于解密状态,以利于文件脱壳。

步骤250,当目标应用的运行状态为解密状态时,通过结构体得到可执行代码文件,结构体是目标应用的可执行代码加载至运行环境对应形成的。

目标应用在指定的运行环境中启动后,将进入解密状态。目标应用处于解密状态时,android系统将对目标应用执行解密操作,并在执行完成对目标应用的解密操作之后,将目标应用的可执行代码加载至运行环境。

进一步地,由于目标应用的可执行代码在加载至运行环境之后,会在运行环境中对应形成一个结构体,该结构体是与目标应用的可执行代码密切相关的,因此,通过该结构体即能够得到包含了可执行代码的可执行代码文件,达到文件脱壳的目的。

通过如上所述的方法,实现了通过android系统层对目标应用所处的运行状态进行监控,确保在目标应用执行完成解密操作时,通过目标应用的可执行代码加载至运行环境所对应的结构体自动化生成可执行代码文件,从而获得目标应用的可执行代码,完成文件脱壳。

上述文件脱壳方法不再需要花费大量的时间进行内存的dump,并且文件脱壳的过程是在目标应用处于解密状态时进行的,避免了在目标应用运行过程中真正的可执行代码被覆盖的风险,以此保证了该文件脱壳方法能够准确地得到目标应用真正的可执行代码,从而不仅有效地提高了文件脱壳效率,还保证了文件脱壳的成功率。

请参阅图3,在一实施例中,步骤210包括以下步骤:

步骤211,解压目标应用的安装包,得到全局配置文件。

目标应用是可运行于android系统上用以完成某项或多项特定工作的应用程序,其可以和用户进行交互,具有可视的用户界面。

为此,目标应用包括全局配置文件、可执行代码文件加壳所形成的加壳文件、以及其他该目标应用所需要的数据和资源文件。

其中,全局配置文件使得android系统知悉目标应用能够完成哪几项特定工作,亦即目标应用能够处理哪些用户请求。加壳文件用以提供可在运行环境中执行的可执行代码,以使目标应用运行于运行环境。其他数据和资源文件用以提供与用户交互的可视的用户界面。

进一步地,目标应用的安装包则是对目标应用所包括的上述内容进行打包得到的,例如,android系统中以apk为文件后缀名的可执行程序即可视为目标应用的安装包。通过对目标应用的安装包进行解压,即能够得到目标应用中的全局配置文件、加壳文件以及其他数据和资源文件。

步骤213,解析全局配置文件得到目标应用的应用信息。

如前所述,全局配置文件使得android系统知悉目标应用能够完成哪几项特定工作,亦即目标应用能够处理哪些用户请求。

基于此,全局配置文件中至少包括:对目标应用名称的声明,以使android系统知悉该全局配置文件属于哪个目标应用;对各种组件的声明,以使android系统知悉目标应用能够处理哪些用户请求。

例如,播放器应用的全局配置文件中至少对一个可维持音乐播放的service进行了声明,则android系统知悉播放器应用能够满足用户的音乐后台播放请求,即在用户离开播放器应用时,仍然使播放器应用运行于后台,进而使得音乐仍然在继续播放。

因此,通过对全局配置文件进行解析,即能够得到目标应用的应用信息,该应用信息至少包括目标应用名称、activity(活动组件)、service(服务组件)和receiver(广播接收器组件)等等。

请参阅图4,在一实施例中,步骤230包括以下步骤:

步骤231,由应用信息中得到目标应用的活动组件。

应用信息至少包括目标应用名称、activity(活动组件)、service(服务组件)和receiver(广播接收器组件)等等,通过目标应用的应用信息的获取,即得到目标应用的活动组件activity。

步骤233,判断运行环境中目标应用的活动组件是否启动。

如前所述,android系统通过目标应用的activity的启动,能够知悉目标应用中与activity对应的某项或多项特定工作已运行,并进一步地确认目标应用是否能够进行用户请求处理。

可以理解,若目标应用的activity全部启动,则与activity对应的特定工作均已运行,即表明目标应用已做好了进行用户请求处理的准备,并等待目标应用的可执行代码执行于运行环境,此时,目标应用仍处于解密状态。当目标应用的可执行代码在运行环境中执行时,目标应用进入运行状态,即目标应用运行在运行环境中,此时,该目标应用能够及时对用户请求进行处理。

也就是说,目标应用的解密状态大致分为三个过程:对目标应用执行解密操作、加载目标应用的可执行代码至运行环境、启动目标应用的全部activity。

基于此,本实施例中,通过判断运行环境中目标应用的activity是否启动来对目标应用的运行状态进行监控,将能够确保目标应用处于解密状态时目标应用已执行完成解密操作并且可执行代码已加载至运行环境中。

具体地,若判断得到运行环境中目标应用的activity已全部启动,则目标应用的运行状态为解密状态,反之,若判断得到运行环境中目标应用的activity尚未全部启动,则目标应用仍处于启动状态。

请参阅图5,在一实施例中,步骤250包括以下步骤:

步骤251,目标应用的运行状态为解密状态时,由结构体中得到目标应用的可执行代码加载至运行环境所对应的内存地址。

目标应用处于解密状态时,可执行代码已加载至运行环境中,即运行环境将为加载的可执行代码进行内存分配,以利于可执行代码在运行环境中执行。如前所述,结构体是在目标应用的可执行代码加载至运行环境对应形成的,可以理解,该结构体中至少保存有目标应用的可执行代码加载至运行环境中所对应的内存地址。

基于此,在目标应用的可执行代码加载至运行环境时,即能够从对应形成的结构体中得到目标应用的可执行代码加载至运行环境所对应的内存地址。

步骤253,根据内存地址获取对应的脱壳文件信息,并组装脱壳文件信息得到可执行代码文件。

以dex格式的可执行代码文件(下面简称为dex文件)为例,如图5a所示,dex文件400包括dex头部信息410、常量池信息430和类信息450。

每一个dex文件400在dalvik虚拟机中都对应于一个dexorjar结构体,该dexorjar结构体中保存了对应的dex文件400中的可执行代码加载至dalvik虚拟机所对应的内存地址。

进一步地,该内存地址包括dex头部信息410的内存地址、常量池信息430的内存地址以及类信息450的内存地址。

通过上述内存地址即可于dalvik虚拟机所在内存中获取得到对应的脱壳文件信息,即对应的脱壳文件信息包括dex头部信息410、常量池信息430和类信息450。

由此,通过对dex头部信息410、常量池信息430和类信息450进行组装,即形成dex文件400,进而得到dex文件400中的可执行代码,完成了文件脱壳。

进一步地,请参阅图6,在一实施例中,步骤251之前,如上所述的方法还包括以下步骤:

步骤310,在运行环境中加载目标应用的加壳文件,通过加壳文件中的外壳代码对加壳文件进行的解密,得到可执行代码。

如前所述,加壳文件由目标应用的安装包解压得到,同时得到的还有全局配置文件以及其他数据和资源文件。通过目标应用在运行环境中启动,目标应用的加壳文件即被加载至运行环境中,等待执行解密操作。

外壳代码则是加壳文件的文件头中添加的一段程序指令,用以指示android系统如何对加壳文件进行解密。可以理解,该外壳代码是通过对可执行代码文件加壳而对应添加至加壳文件的文件头中的。因此,在得到加壳文件之后,即可从该加壳文件的文件头中提取得出外壳代码。

在提取得出外壳代码之后,android系统即通过加载该外壳代码于运行环境中来对加壳文件进行解密,从而得到目标应用的可执行代码。

步骤330,加载解密得到的可执行代码至运行环境。

在解密得到目标应用的可执行代码之后,android系统将以该可执行代码替换外壳代码加载至运行环境中,以利于运行环境执行该可执行代码使目标应用运行于运行环境中。

需要说明的是,此处解密得到的可执行代码是零散的,尚未形成可执行代码文件,只有将零散的可执行代码形成可执行代码文件之后,应用程序在下一次运行过程中才能够直接加载,以利于可执行代码在运行环境中执行,而不必再经历目标应用的启动、解密过程,这也正是文件脱壳的意义所在。

步骤350,保存可执行代码加载至运行环境所对应的内存地址,形成结构体。

在目标应用的可执行代码加载至运行环境,即将其所对应的内存地址存储形成一个结构体。换而言之,该结构体在运行环境中对应于目标应用的可执行代码,通过该结构体即能够得到目标应用的可执行代码,达到文件脱壳的目的。

请参阅图7,在一实施例中,一种android系统中的文件脱壳装置包括:信息获取模块510、状态监控模块530及文件脱壳模块550。

其中,信息获取模块510用以获取目标应用的应用信息。

状态监控模块530用以在目标应用指定的运行环境中启动目标应用,根据应用信息监控启动的目标应用的运行状态。

文件脱壳模块550用以当目标应用的运行状态为解密状态时,通过结构体得到可执行代码文件,结构体是目标应用的可执行代码加载至运行环境对应形成的。

请参阅图8,在一实施例中,信息获取模块510包括:安装包解压单元511及文件解析单元513。

其中,安装包解压单元511用以解压目标应用的安装包,得到全局配置文件。

文件解析单元513用以解析全局配置文件得到目标应用的应用信息。

请参阅图9,在一实施例中,状态监控模块530包括:组件获取单元531及判断单元533。

其中,组件获取单元531用以由应用信息中得到目标应用的活动组件。

判断单元533用以判断运行环境中目标应用的活动组件是否启动。若为是,则判定目标应用的运行状态为解密状态。

请参阅图10,在一实施例中,文件脱壳模块550包括:地址获取单元551及文件组装单元553。

其中,地址获取单元551用以目标应用的运行状态为解密状态时,由结构体中得到目标应用的可执行代码加载至运行环境所对应的内存地址。

文件组装单元553用以根据内存地址获取对应的脱壳文件信息,并组装脱壳文件信息得到可执行代码文件。

请参阅图11,在一实施例中,如上所述的装置还包括:代码获取模块610代码加载模块630及结构体形成模块650。

其中,代码获取模块610用以在运行环境中加载目标应用的加壳文件,通过加壳文件中的外壳代码对加壳文件进行解密,得到可执行代码。

代码加载模块630用以加载解密得到的可执行代码至运行环境。

结构体形成模块650用以保存可执行代码加载至运行环境所对应的内存地址,形成结构体。

上述内容,仅为本发明的较佳实施例,并非用于限制本发明的实施方案,本领域普通技术人员根据本发明的主要构思和精神,可以十分方便地进行相应的变通或修改,故本发明的保护范围应以权利要求书所要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1