首页> 中国专利> 应用程序安装包中JAVA字节码转换方法、装置及设备

应用程序安装包中JAVA字节码转换方法、装置及设备

摘要

本发明实施例公开了一种应用程序运行及其安装包中JAVA字节码的转换方法、装置及设备,该转换方法包括:根据保存的JAVA字节码的转换指示表,提取能够转换的JAVA字节码,根据JAVA字节码的语义,将JAVA字节码转换为对应的原生字节码,并将转换后的每个原生字节码保存到导出文件中,在所述文件中在能够转换的JAVA字节码处建立到所述导出文件的调用。由于在本发明实施例中提取出了能够转换的JAVA字节码,将JAVA字节码转化为对应语义的原生字节码,并保存到导出文件中,而原生字节码对于攻击者而言,较JAVA字节码复杂,较难破解,因此提高了应用程序的安全性。

著录项

  • 公开/公告号CN106557350A

    专利类型发明专利

  • 公开/公告日2017-04-05

    原文格式PDF

  • 申请/专利权人 北京金山安全软件有限公司;

    申请/专利号CN201510639735.3

  • 发明设计人 秦皓;

    申请日2015-09-30

  • 分类号G06F9/45;

  • 代理机构北京柏杉松知识产权代理事务所(普通合伙);

  • 代理人马敬

  • 地址 100085 北京市海淀区小营西路33号二层东区

  • 入库时间 2023-06-19 01:53:56

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-12-13

    授权

    授权

  • 2017-05-03

    实质审查的生效 IPC(主分类):G06F9/45 申请日:20150930

    实质审查的生效

  • 2017-04-05

    公开

    公开

说明书

技术领域

本发明涉及数据处理技术领域,特别涉及一种应用程序安装包中JAVA字节码转换方法、装置及设备。

背景技术

现有的应用程序大部分都是以JAVA语言开发的,通过将应用程序编译为JAVA字节码,在JAVA虚拟机(Dalvik)中执行。由于JAVA语言是高级语言,以及JAVA虚拟机对JAVA字节码解释执行的特点,将JAVA字节码与JAVA源代码一一对应起来是非常容易的。而获取JAVA源代码后,攻击者能够很容易的分析应用程序的实现逻辑,从而破解应用程序,例如查找到应用程序的漏洞,或者获取该应用程序的数据在传输中的加密秘钥等,更进一步的还可能会更改程序的代码等。由于获取了JAVA字节码就可破解应用程序,并对应用程序进行二次开发,从而在应用程序中加入非法信息,影响用户的使用,还可能导致用户信息的泄露等,因此以JAVA语言开发的应用程序的安全成为了一个比较严峻的问题。而现有的Android系统中运行的应用程序大部分都是以JAVA语言开发的,因此Android系统的安全也相应的成为了一个比较严峻的问题。

以JAVA语言开发的应用程序一般是以压缩包的形式存在,该压缩包中存在一个classes.dex文件,该文件为存储JAVA字节码的文件,可以通过隐藏该应用程序中classes.dex文件的方式,来保护以JAVA语言开发的应用程序的安全。目前,常用的保护方案是对应用程序中的classes.dex文件进行加密存储,后续为了便于描述称为原始的classes.dex文件,然后生成一个新的classes.dex文件替换原始的classes.dex文件,该原始的classes.dex文件一般存储在内存中。在运行新的classes.dex文件时,通过执行该新的classes.dex文件中的代码,对存储的原始的classes.dex文件进行解密,并对解密后的classes.dex文件调用系统接口进行加载。采用该方法,原始的classes.dex文件不会直接出现在应用程序的压缩包中,因此攻击者无法直接获取到原始的classes.dex文件,因此可以保证应用程序的安全。

上述方案看似比较完善,但是攻击者依然通过内存转储(dump)的方式,获取到原始的classes.dex文件。这是因为在JAVA虚拟机运行的过程中,需要在内存中保留一份比较完整的classes.dex内存映射,该classes.dex内存映射是以odex文件保存的,该odex文件对dex文件进行了一部分优化。通过dump的方式获取该odex文件,之后通过相应的处理,可以获得原始的classes.dex文件,从而导致应用程序出现安全问题。

发明内容

本发明实施例公开了一种应用程序安装包中JAVA字节码转换方法、装置及设备,用以提高应用程序的安全性。

为达到上述目的,本发明实施例公开了一种应用程序安装包中JAVA字节码的转换方法,所述方法针对基于JAVA开发的应用程序,该方法包括:

根据保存的JAVA字节码的转换指示表,在应用程序安装包的存储JAVA字节码的文件中,提取能够转换的JAVA字节码;

根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码;

将转换后的原生字节码保存到导出文件中;

在所述应用程序安装包的存储JAVA字节码的文件中转换JAVA字节码处建立到所述导出文件的调用;

将所述导出文件保存到所述应用程序安装包中。

进一步地,所述在应用程序安装包的存储JAVA字节码的文件中,提取能够转换的JAVA字节码,包括:

在应用程序安装包的存储JAVA字节码的文件中,提取数据操作类的JAVA字节码,以及桥接类的JAVA字节码;

所述根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码,包括:

根据JAVA字节码的语义,将数据操作类的JAVA字节码转换为对应的数据操作原生字节码;以及

根据JAVA字节码的语义,将桥接类的JAVA字节码转换为对应的直接调用接口函数的原生字节码。

进一步地,所述根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码,具体包括:

将相同类别且连续的JAVA字节码组成JAVA字节块,其中每个JAVA字节块包含至少一个JAVA字节码;

根据JAVA字节码的语义,将每个数据操作类的JAVA字节块转换为对应的一组数据操作原生字节码;以及

根据JAVA字节码的语义,将每个桥接类的JAVA字节块转换为对应的一组直接调用接口函数的原生字节码。

进一步地,所述根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码,包括:

根据JAVA字节码的语义,针对一个或多个处理器平台,将提取的JAVA字节码转换为处理器平台对应的一个或多个版本的原生字节码。

进一步地,所述将转换后的原生字节码保存到导出文件中,包括:

将所述导出文件中的数据操作原生字节码导出为数据操作函数;将所述导出文件中的直接调用接口函数的原生字节码导出为桥接函数;

所述在所述应用程序安装包的存储JAVA字节码的文件中转换JAVA字节码处建立到所述导出文件的调用,包括:

在所述数据操作类的JAVA字节码处调用所述数据操作函数;在所述桥接类的JAVA字节码处调用所述桥接函数。

进一步地,所述在所述数据操作类的JAVA字节码处调用所述数据操作函数,包括:

根据预设的映射规则,对所述数据操作类的JAVA字节码进行处理得到映射字节码;

将所述映射字节码作为建立的中间类函数的参数,通过所述中间类函数对所述参数进行解析,调用所述数据操作函数。

进一步地,所述在所述桥接类的JAVA字节码处调用所述桥接函数,包括:

根据预设的映射规则,对所述数据操作类的JAVA字节码进行处理得到映射字节码;

将所述映射字节码作为建立的中间类函数的参数,通过所述中间类函数对所述参数进行解析,调用所述桥接函数。

本发明实施例提供了一种应用程序安装包中JAVA字节码的转换装置,所述装置针对基于JAVA开发的应用程序,该装置包括:

提取模块,用于根据保存的JAVA字节码的转换指示表,在应用程序安装包的存储JAVA字节码的文件中,提取能够转换的JAVA字节码;

转换模块,用于根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码;

存储模块,用于将转换后原生字节码保存到导出文件中,在所述应用程序安装包的存储JAVA字节码的文件中转换JAVA字节码处建立到所述导出文件的调用,并将所述导出文件保存到所述应用程序安装包中。

进一步地,所述提取模块,具体用于在应用程序安装包的存储JAVA字节码的文件中,提取数据操作类的JAVA字节码,以及桥接类的JAVA字节码:

所述转换模块,具体用于根据JAVA字节码的语义,将数据操作类的JAVA字节码转换为对应的数据操作原生字节码;以及根据JAVA字节码的语义,将桥接类的JAVA字节码转换为对应的直接调用接口函数的原生字节码。

进一步地,所述转换模块,具体用于将相同类别且连续的JAVA字节码组成JAVA字节块,其中每个JAVA字节块包含至少一个JAVA字节码;根据JAVA字节码的语义,将每个数据操作类的JAVA字节块转换为对应的一组数据操作原生字节码;以及根据JAVA字节码的语义,将每个桥接类的JAVA字节块转换为对应的一组直接调用接口函数的原生字节码。

进一步地,所述转换模块,具体用于根据JAVA字节码的语义,针对一个或多个处理器平台,将提取的JAVA字节码转换为处理器平台对应的一个或多个版本的原生字节码。

进一步地,所述存储模块,具体用于将所述导出文件中的数据操作原生字节码导出为数据操作函数;将所述导出文件中的直接调用接口函数的原生字节码导出为桥接函数;在所述数据操作类的JAVA字节码处调用所述数据操作函数;在所述桥接类的JAVA字节码处调用所述桥接函数。

进一步地,所述存储模块,具体用于根据预设的映射规则,对所述数据操作类的JAVA字节码进行处理得到映射字节码;将所述映射字节码作为建立的中间类函数的参数,通过所述中间类函数对所述参数进行解析,调用所述数据操作函数。

进一步地,所述存储模块,具体用于根据预设的映射规则,对所述数据操作类的JAVA字节码进行处理得到映射字节码;将所述映射字节码作为建立的中间类函数的参数,通过所述中间类函数对所述参数进行解析,调用所述桥接函数。

本发明实施例提供了一种电子设备,适用于应用程序安装包中JAVA字节码的转换,包括:

处理器、存储器、通信接口和总线;

所述处理器、所述存储器和所述通信接口通过所述总线连接并完成相互间的通信;

所述存储器存储可执行程序代码;

所述处理器通过读取所述存储器中存储的可执行程序代码来运行与所述可执行程序代码对应的程序,以用于:

根据保存的JAVA字节码的转换指示表,在应用程序安装包的存储JAVA字节码的文件中,提取能够转换的JAVA字节码;

根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码;

将转换后的原生字节码保存到导出文件中;

在所述应用程序安装包的存储JAVA字节码的文件中转换JAVA字节码处建立到所述导出文件的调用;

将所述导出文件保存到所述应用程序安装包中。

本发明实施例提供了一种应用程序安装包中JAVA字节码转换方法、装置及设备,该应用程序安装包中JAVA字节码的转换方法包括:根据保存的JAVA字节码的转换指示表,在应用程序安装包中存储JAVA字节码的文件中提取能够转换的JAVA字节码,根据JAVA字节码的语义,将JAVA字节码转换为对应的原生字节码,并将转换后的每个原生字节码保存到导出文件中,在所述文件中在能够转换的JAVA字节码处建立到所述导出文件的调用,将该导出文件保存到该应用程序安装包中。由于在本发明实施例中在应用程序安装包中存储JAVA字节码的文件中,提取出了能够转换的JAVA字节码,将JAVA字节码转化为对应语义的原生字节码,并保存到导出文件中,而原生字节码对于攻击者而言,较JAVA字节码复杂,较难破解,因此提高了应用程序的安全性。

附图说明

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

图1为本发明实施例提供的一种应用程序安装包中JAVA字节码的转换过程;

图2A为发明实施例提供的JAVA字节码的转换指示表的部分示例;

图2B为本发明实施例提供的一种应用程序安装包中JAVA字节码的转换过程;

图3为本发明实施例提供的一种应用程序安装包中JAVA字节码的转换方法示意图;

图4为本发明实施例提供的基于应用程序安装包中JAVA字节码的转换方法的应用程序运行过程;

图5为本发明实施例提供的一种应用程序安装包中JAVA字节码的转换装置;

图6为本发明实施例提供的基于上述应用程序安装包中JAVA字节码的转换装置的应用程序运行装置;

图7为本发明实施例提供了的一种电子设备的结构示意图。

具体实施方式

为了提高应用程序的安全,本发明实施例提供了一种应用程序安装包中JAVA字节码的转换方法、装置及设备。

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

在一些系统中,例如Android系统中,一般情况下,可执行的代码包括:原生字节码以及JAVA语言编译获得的JAVA字节码,该JAVA字节码由JAVA虚拟机解释成对应设备的原生字节码后再执行。基于不同处理器对应的原生字节码不同,基于ARM处理器的CPU对应的原生字节码为ARM字节码,基于x86处理器的CPU对应的原生字节码为x86的原生字节码。由于原生字节码是根据处理器进行设计的,形式偏向于低级语言,目前没有完善的方法直接将原生字节码转换为可以编译的高级语言(如C语言、C++语言、JAVA语言等)的字节码,这就使得攻击者在面对原生字节码时,无法像面对高级语言的字节码时那么简单。因此可以将JAVA字节码转换为原生字节码来进行保护,以达到保护由JAVA语言编写的应用程序的目的。

JAVA字节码(JAVA bytecode)是JAVA虚拟机执行的一种指令格式。大多数JAVA字节码都是一个字节长,而有些操作需要参数,导致了有一些多字节的JAVA字节码。

图1为本发明实施例提供的一种应用程序安装包中JAVA字节码的转换过程,该过程包括以下步骤:

S101:获取应用程序安装包中存储JAVA字节码的文件。

应用程序通过JAVA语言开发完成后,在应用程序的安装包中存在一个文件用于存储JAVA字节码,一般该文件的名称固定,通过获取该名称的文件,即可获取该应用程序的JAVA字节码。一般的JAVA语言开发的应用程序,其安装包中存储JAVA字节码的文件为classes.dex文件,在本发明实施例中获取该文件即可。

S102:根据保存的JAVA字节码的转换指示表,在应用程序安装包的存储JAVA字节码的文件中,提取能够转换的JAVA字节码。

为了实现JAVA字节码到原生字节码的转换,在本发明实施例中保存有记录有JAVA字节码的转换指示表,在该转换指示表中针对每个JAVA字节码保存有该JAVA字节码具体归属于哪个类别。

图2A为发明实施例提供的JAVA字节码的转换指示表的部分示例,在本发明实施例中考虑到JAVA对应用程序运行环境的兼容性,将JAVA字节码划分为多个类别,该多个类别包括:数据操作类字节码、不可本地化(Native)类字节码以及桥接类字节码。其中数据操作类字节码和桥接类字节码都是能够转换的JAVA字节码。图2A中为了简便将JAVA字节码划分的类别简单的描述为桥接、数据操作或者不可Native。

在本发明实施例中数据操作类字节码是与应用程序运行的系统关系不大的字节码,该类字节码可以很好的转化为原生字节码,例如以move-xxx为代表的绝大部分数据操作字节码;不可Native类字节码是对虚拟机的环境依赖比较强,如果强制将该类JAVA字节码转换为原生字节码,则可能会造成兼容性的问题,该类字节码是以goto,return等为代表的JAVA字节码;桥接类字节码是调用虚拟机接口的JAVA字节码,由于该类字节码可以直接在Native层调用接口实现,因此该类字节码也是可以转换的,该类字节码例如可以是invoke-xxx为代表的JAVA字节码。

在提取能够转换的JAVA字节码时,提取的是能够转换的数据操作类的JAVA字节码,以及桥接类的JAVA字节码。

S103:根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码。

本发明实施例实现应用程序安装包中JAVA字节码转换时是基于开源的dx程序的,该程序源码在操作系统源码目录树下的dalvik/dx文件夹下,将应用程序中的JAVA字节码转换为可以在JAVA虚拟机中运行的原生字节码。在转换过程中,根据JAVA字节码的语义,将能够转换的JAVA字节码转换为对应的原生字节码,因此针对同一JAVA字节码,只要能够实现同一语义的原生字节码都可以作为最终转换的原生字节码。

另外,针对不同的平台对应的原生字节码,都可以进行转换,例如ARM平台,或者X86平台等。因此,所述根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码,包括:

根据JAVA字节码的语义,针对一个或多个处理器平台,将提取的JAVA字节码转换为处理器平台对应的一个或多个版本的原生字节码。

具体的,所述在应用程序安装包的存储JAVA字节码的文件中,提取能够转换的JAVA字节码,包括:

在应用程序安装包的存储JAVA字节码的文件中,提取数据操作类的JAVA字节码,以及桥接类的JAVA字节码;

所述根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码,包括:

根据JAVA字节码的语义,将数据操作类的JAVA字节码转换为对应的数据操作原生字节码;以及

根据JAVA字节码的语义,将桥接类的JAVA字节码转换为对应的直接调用接口函数的原生字节码。

S104:将转换后的原生字节码保存到导出文件中。

具体的,在本发明实施例中将转换后的原生字节码保存到导出文件中包括:

将所述导出文件中的数据操作原生字节码导出为数据操作函数;将所述导出文件中的直接调用接口函数的原生字节码导出为桥接函数。

S105:在所述应用程序安装包的存储JAVA字节码的文件中转换JAVA字节码处建立到所述导出文件的调用,将所述导出文件保存到所述应用程序安装包中。

在本发明实施例中保留了JAVA框架,为了实现对原生字节码的调用,在classes.dex文件中在能够转换的JAVA字节码处建立到所述导出文件的调用,调用该导出文件中相应的原生字节码。

具体的,在所述应用程序安装包的存储JAVA字节码的文件中转换JAVA字节码处,在所述数据操作类的JAVA字节码处调用所述数据操作函数;在所述桥接类的JAVA字节码处调用所述桥接函数。

由于本发明实施例在应用程序安装包中存储JAVA字节码的文件中,提取出了能够转换的JAVA字节码,将JAVA字节码转化为对应语义的原生字节码,并保存到导出文件中,而原生字节码对于攻击者而言,较JAVA字节码复杂,较难破解,因此提高了应用程序的安全性。

本发明实施例是将应用程序安装包中JAVA字节码转换为对应的原生字节码,通过中间类中相应的调用函数的调用实现JAVA字节码和原生字节码的连接,具体的是调用函数通过相应的接口实现对原生字节码的调用。在本发明实施例中可以针对每个JAVA字节码都开发相应的接口,不过为了节省开发工作量,减少整个应用程序安装包的数据量,在本发明的一个实施例中在应用程序安装包的存储JAVA字节码的文件中,提取能够转换的每个JAVA字节码之后,所述根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码,具体包括:将相同类别且连续的JAVA字节码组成JAVA字节块,其中每个JAVA字节块包含至少一个JAVA字节码;

根据JAVA字节码的语义,将每个数据操作类的JAVA字节块转换为对应的一组数据操作原生字节码;以及

根据JAVA字节码的语义,将每个桥接类的JAVA字节块转换为对应的一组直接调用接口函数的原生字节码。

具体的,本发明实施例在对应用程序安装包中的JAVA字节码进行转换时,对整个JAVA字节码,根据保存的JAVA字节码的转换指示表,判断每个JAVA字节码是否为能够转换的JAVA字节码,提取能够转换的JAVA字节码,根据能够转换的JAVA字节码归属的类别,并将提取的相同类别且连续的JAVA字节码组成JAVA字节块,其中每个JAVA字节块包含至少一个JAVA字节码。

将JAVA字节码分块的主要目的是为了区分能够转换的JAVA字节码和不能转换的JAVA字节码。由于在本发明实施例中数据操作类JAVA字节码和桥接类JAVA字节码都是能够转换的JAVA字节码,因此在本发明实施例中为了简便,将两个类型的JAVA字节码统一称为能够转换的JAVA字节码。不过在对JAVA字节码进行分块时,还是需要将连续的数据操作类JAVA字节码组合成一个JAVA字节块,将连续的桥接类JAVA字节码组合成一个JAVA字节块,即每个JAVA字节块中只有一类能够转换的JAVA字节码,或者为数据操作类JAVA字节码,或者为桥接类JAVA字节码。

在本发明实施例中将相同类别且连续的JAVA字节码组成JAVA字节块,同时分块也会涉及到一些Dalvik状态的收集,例如该字节块初始状态,需要涉及到哪些寄存器,这些寄存器的值也会和代码块相关联,随后作为信息传入native层。

图2B为本发明实施例提供的一种应用程序安装包中JAVA字节码的转换过程,该过程包括以下步骤:

S201:根据保存的JAVA字节码的转换指示表,在应用程序安装包的存储JAVA字节码的文件中,提取能够转换的JAVA字节码。

S202:根据能够转换的JAVA字节码归属的类别,将提取的相同类别且连续的JAVA字节码组成JAVA字节块,其中每个JAVA字节块包含至少一个JAVA字节码。

S203:针对每个JAVA字节块,将每个数据操作类的JAVA字节块转换为对应的一组数据操作原生字节码;将每个桥接类的JAVA字节块转换为对应的一组直接调用接口函数的原生字节码。

S204:将转换后的每组原生字节码保存到导出文件中,并将该导出文件保存到该应用程序安装包中,并在所述应用程序安装包的存储JAVA字节码的文件中转换JAVA字节块处建立到所述导出文件的调用。

其中将转换后的每组原生字节码保存到导出文件中包括,将所述导出文件中的数据操作原生字节码导出为数据操作函数;将所述导出文件中的直接调用接口函数的原生字节码导出为桥接函数。

将该导出文件保存到该应用程序安装包中,并在所述应用程序安装包的存储JAVA字节码的文件中转换JAVA字节块处建立到所述导出文件的调用包括:

在所述数据操作类的JAVA字节码处调用所述数据操作函数;在所述桥接类的JAVA字节码处调用所述桥接函数。

为了进一步保证应用程序安装包中数据的安全,在本发明的另一实施例中,所述在所述数据操作类的JAVA字节码处调用所述数据操作函数,包括:

根据预设的映射规则,对所述数据操作类的JAVA字节码进行处理得到映射字节码;

将所述映射字节码作为建立的中间类函数的参数,通过所述中间类函数对所述参数进行解析,调用所述数据操作函数。

具体的,在本发明实施例中可以将能够转换的JAVA字节码进行任意方式的映射,只要映射前后该能够转换的JAVA字节码能够被识别即可。在进行映射的过程中针对每个JAVA字节码分别进行。例如可以对每个JAVA字节码进行线性运算等,例如JAVA字节码为x,按照y=(x+0xcd)&0xff,对其进行映射得到y。这样对于所有JAVA字节码x,都有唯一的y与其对应。

进行上述映射后,为了实现将其转换为原生字节码,在将JAVA字节码转换为原生字节码之前,需要对映射后的JAVA字节码进行解析,解析得到映射之前的JAVA字节码,再对解析得到的JAVA字节码进行转换。由于该映射规则是保密的,因此攻击者是无法获取到JAVA字节码的,从而进一步保证了应用程序安装包中JAVA字节码的安全。

为了实现JAVA字节码和其转换后的原生字节码之间的连接,在本发明实施例中可以通过一个中间类函数来实现,该中间类函数由JAVA代码编写。

具体的将经过映射后的JAVA字节码作为参数传递给该中间类函数,该中间类函数采用预设的解析规则进行解析,调用所述导出文件。

该能够转换的JAVA字节码包括:数据操作类JAVA字节码、桥接类JAVA字节码,因此该中间类函数可以包括两个子函数,分别实现对这两类JAVA字节码的解析。其中实现对数据操作类JAVA字节码解析的子函数为TranslateCode,实现对桥接类JAVA字节码解析的子函数为BridgeCode。

TranslateCode和BridgeCode两个子函数分别调用导出文件,即调用转换层的导出函数,该导出函数分别对解析后的数据操作类字节码和桥接类字节码进行执行,具体的将所述导出文件中的数据操作原生字节码导出为数据操作函数;将所述导出文件中的直接调用接口函数的原生字节码导出为桥接函数。

该导出函数也相应的包括两个子导出函数分别为数据操作函数translateCodeNative和桥接函数bridgeCodeNative,分别对应于TranslateCode和BridgeCode,实现对数据操作类JAVA字节码和桥接类JAVA字节码的执行。

由于在本发明实施例中根据能够转换的JAVA字节码归属的类别,将提取的相同类别且连续的JAVA字节码组成JAVA字节块,因此在进行转换时,可以根据该JAVA字节块的语义进行转换。例如对一个JAVA字节块进行解析后确定其语义为实现“move v0,v1”,则可以将其转换为调用“move vx,vy”类型对应的处理函数的一组原生字节码。通过该组原生字节码实现读取寄存器v1的值,并赋值给寄存器v0的功能。

图3为本发明实施例提供的一种应用程序安装包中JAVA字节码的转换方法示意图,在图3中根据应用程序安装包中classes.dex文件中保存有每个JAVA字节码,对应每条指令(instruction),其中上述每条指令可以是一个JAVA字节码形成的指令,也可以是一个JAVA字节块形成的指令。

根据保存的JAVA字节码的转换指示表,在该文件中提取能够转换的每个JAVA字节码,并根据能够转换的每个JAVA字节码归属的类别,将提取的相同类别且连续的能够转换的JAVA字节码组成JAVA字节块,例如图3中instruction1、instruction3和instruction4是能够转换的JAVA字节块,其中instruction1和instruction4是数据操作类JAVA字节块,instruction3为桥接类JAVA字节块。

针对每个能够转换的JAVA字节码组成的JAVA字节块,根据所述JAVA字节块中每个JAVA字节码的语义,将该JAVA字节块转换为对应的一组原生字节码,将该组原生字节码保存到对应的导出文件中,在该导出文件中将数据操作原生字节码导出为数据操作函数translateCodeNative,将直接调用接口函数的原生字节码导出为桥接函数bridgeCodeNative。并将该导出文件保存到应用程序的安装列表中,该导出文件即图3所示的so文件。

为了实现对数据操作函数和桥接函数的调用,根据图3所示,根据预设的映射规则,对所述数据操作类的JAVA字节码进行处理得到映射字节码;将所述映射字节码作为建立的中间类函数的参数,通过所述中间类函数对所述参数进行解析,调用所述数据操作函数。

并且根据预设的映射规则,对所述数据操作类的JAVA字节码进行处理得到映射字节码;将所述映射字节码作为建立的中间类函数的参数,通过所述中间类函数对所述参数进行解析,调用所述桥接函数。

由于本发明实施例中保留有JAVA框架,为了实现对相应对导出文件中相应原生字节码的调用,在本发明实施例中建立了中间类函数TranslateCode和BridgeCode,分别调用数据操作类JAVA字节码和桥接类JAVA字节码。具体的在应用程序安装包的classes.dex文件中,在提取的每个JAVA字节块处建立到所述导出文件的调用。如图3所示的通过callTranslateCode-TranslateCode到导出文件translateCodeNative的调用,和callBridgeCode-BridgeCode到导出文件bridgeCodeNative的调用。

图4为本发明实施例提供的基于应用程序安装包中JAVA字节码的转换方法的应用程序运行过程,该过程包括以下步骤:

S401:读取应用程序安装包中包含JAVA字节码的文件。

S402:当运行所述文件中能够转换的每个JAVA字节码时,根据所述文件中在能够转换的每个JAVA字节码处建立的到导出文件的调用,调用导出文件中对应的原生字节码执行。

在本发明的一个具体实施例中,当根据能够转换的每个JAVA字节码归属的类别,将提取的相同类别且连续的能够转换的JAVA字节码组成JAVA字节块时,所述根据所述文件中在能够转换的每个JAVA字节码处建立的到导出文件的调用,调用导出文件中对应的原生字节码执行包括:

根据所述文件中在能够转换的每组JAVA字节块处建立的到导出文件的调用,调用导出文件中对应的一组原生字节码执行。

具体的,在本发明的另一个具体实施例中,根据所述文件中在能够转换的每个JAVA字节码处建立的到导出文件的调用,调用导出文件中对应的原生字节码执行包括:

当运行所述文件中能够转换的JAVA字节码为数据操作类JAVA字节码时,通过第一类调用函数调用导出文件中对应的原生字节码;

当运行所述文件中能够转换的JAVA字节码为桥接类JAVA字节码时,通过第二类调用函数桥调用导出文件中对应的原生字节码。

图5为本发明实施例提供的一种应用程序安装包中JAVA字节码的转换装置,所述装置针对基于JAVA开发的应用程序,该装置包括:

提取模块51,用于根据保存的JAVA字节码的转换指示表,在应用程序安装包的存储JAVA字节码的文件中,提取能够转换的JAVA字节码;

转换模块52,用于根据每个JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码;

存储模块53,用于将转换后原生字节码保存到导出文件中,在所述应用程序安装包的存储JAVA字节码的文件中转换JAVA字节码处建立到所述导出文件的调用,并将所述导出文件保存到所述应用程序安装包中。

所述提取模块51,具体用于在应用程序安装包的存储JAVA字节码的文件中,提取数据操作类的JAVA字节码,以及桥接类的JAVA字节码:

所述转换模块52,具体用于根据JAVA字节码的语义,将数据操作类的JAVA字节码转换为对应的数据操作原生字节码;以及根据JAVA字节码的语义,将桥接类的JAVA字节码转换为对应的直接调用接口函数的原生字节码。

进一步地,所述转换模块52,具体用于将相同类别且连续的JAVA字节码组成JAVA字节块,其中每个JAVA字节块包含至少一个JAVA字节码;根据JAVA字节码的语义,将每个数据操作类的JAVA字节块转换为对应的一组数据操作原生字节码;以及根据JAVA字节码的语义,将每个桥接类的JAVA字节块转换为对应的一组直接调用接口函数的原生字节码。

进一步地,所述转换模块52,具体用于根据JAVA字节码的语义,针对一个或多个处理器平台,将提取的JAVA字节码转换为处理器平台对应的一个或多个版本的原生字节码。

进一步地,所述存储模块53,具体用于将所述导出文件中的数据操作原生字节码导出为数据操作函数;将所述导出文件中的直接调用接口函数的原生字节码导出为桥接函数;在所述数据操作类的JAVA字节码处调用所述数据操作函数;在所述桥接类的JAVA字节码处调用所述桥接函数。

进一步地,所述存储模块53,具体用于根据预设的映射规则,对所述数据操作类的JAVA字节码进行处理得到映射字节码;将所述映射字节码作为建立的中间类函数的参数,通过所述中间类函数对所述参数进行解析,调用所述数据操作函数。

进一步地,所述存储模块53,具体用于根据预设的映射规则,对所述数据操作类的JAVA字节码进行处理得到映射字节码;将所述映射字节码作为建立的中间类函数的参数,通过所述中间类函数对所述参数进行解析,调用所述桥接函数。

图6为本发明实施例提供的基于上述应用程序安装包中JAVA字节码的转换装置的应用程序运行装置,所述装置包括:

读取模块61,用于读取应用程序安装包中包含JAVA字节码的文件;

运行模块62,用于当运行所述文件中能够转换的JAVA字节码时,根据所述文件中在能够转换的JAVA字节码处建立的到导出文件的调用,调用导出文件中对应的原生字节码执行。

所述运行模块62,具体用于根据所述文件中在能够转换的每组JAVA字节块处建立的到导出文件的调用,调用导出文件中对应的一组原生字节码执行。

所述运行模块62,具体用于当根据能够转换的JAVA字节码归属的类别,将提取的相同类别且连续的能够转换的JAVA字节码组成JAVA字节块时,根据所述文件中在能够转换的每组JAVA字节块处建立的到导出文件的调用,调用导出文件中对应的一组原生字节码执行。

图7为本发明实施例提供的一种电子设备的结构示意图,该电子设备适用于应用程序安装包中JAVA字节码的转换,包括:

处理器71、存储器72、通信接口73和总线;

所述处理器71、所述存储器72和所述通信接口73通过所述总线连接并完成相互间的通信;

所述存储器72存储可执行程序代码;

所述处理器71通过读取所述存储器72中存储的可执行程序代码来运行与所述可执行程序代码对应的程序,以用于:

根据保存的JAVA字节码的转换指示表,在应用程序安装包的存储JAVA字节码的文件中,提取能够转换的JAVA字节码;

根据JAVA字节码的语义,将提取的JAVA字节码转换为对应的原生字节码;

将转换后的原生字节码保存到导出文件中;

在所述应用程序安装包的存储JAVA字节码的文件中转换JAVA字节码处建立到所述导出文件的调用;

将所述导出文件保存到所述应用程序安装包中。

本发明实施例提供了一种应用程序安装包中JAVA字节码的转换方法、装置及设备,该应用程序安装包中JAVA字节码的转换方法包括:根据保存的JAVA字节码的转换指示表,在应用程序安装包中存储JAVA字节码的文件中提取能够转换的JAVA字节码,根据JAVA字节码的语义,将JAVA字节码转换为对应的原生字节码,并将转换后的原生字节码保存到导出文件中,在所述文件中在能够转换的JAVA字节码处建立到所述导出文件的调用,将该导出文件保存到该应用程序安装包中。由于在本发明实施例中在应用程序安装包中存储JAVA字节码的文件中,提取出了能够转换的JAVA字节码,将JAVA字节码转化为对应语义的原生字节码,并保存到导出文件中,而原生字节码对于攻击者而言,较JAVA字节码复杂,较难破解,因此提高了应用程序的安全性。

对于系统/装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

本领域普通技术人员可以理解实现上述方法实施方式中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机可读取存储介质中,这里所称得的存储介质,如:ROM/RAM、磁碟、光盘等。

以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号