应用防破解方法和装置的制造方法_2

文档序号:9524433阅读:来源:国知局
inux指令转换为机器指令,由CPU执行转换后得到的机器指令,执行存储操作。在Windows平台上,该代码经由运行于Windows上的编译器(例如Visual Stud1开发工具)编译之后,可以生成Windows指令集中与该代码对应的多条Windows指令,然后将多条Windows指令转换为机器指令,由CPU执行转换后得到的机器指令,执行存储操作。
[0028]基于上述应用的源代码经编译之后生成机器指令的基本原理,下面继续说明虚拟机解析虚拟机指令生成机器指令的原理。以虚拟机为Java虚拟机为例,请参考图3,其示出了 Java虚拟机解析虚拟机指令生成机器指令的原理图。在图3中,通过Java编译器将应用的Java源代码编译为虚拟机指令(Java字节码),然后,由Java虚拟机中的Java解释器解析Java字节码,根据目标平台的不同,分别生成适用于不同平台的指令,然后转换为机器指令,由CPU执行该机器指令,完成相应地的操作。以一条用于使CPU执行存储操作的Java代码为例,首先该Java代码被转换为Java字节码,然后通过Java解释器将该Java字节码解析为Linux平台上与存储操作对应的Linux指令,即从Linux指令集中查找存储操作对应的Linux指令,然后将该Linux指令转换为机器指令,由CPU执行该机器指令,完成存储操作。
[0029]步骤202,选取第一虚拟机指令中部分第一虚拟机指令,以及将部分第一虚拟机指令转换为被第二虚拟机解析的第二虚拟机指令。
[0030]在本实施例中,在获取应用的第一虚拟机指令之后,可以选取第一虚拟机指令中部分第一虚拟机指令。以第一虚拟机指令为Java字节码,第一虚拟机为Java虚拟机为例,在Java虚拟机规范中,Java字节码设置于Class文件中,因此,选取第一虚拟机指令中部分第一虚拟机指令可以为:选取Class文件中的方法代码即与Class文件中定义的方法对应的Java字节码,将与Class文件中的方法对应的Java字节码作为部分第一虚拟机指令。
[0031]在本实施例的一些可选的实现方式中,第一虚拟机、第二虚拟机均为Java虚拟机,第一虚拟机指令为Java字节码。在本实施例中,第一虚拟机可以为直接可执行Java字节码的Java虚拟机,可直接执行Java字节码的Java虚拟机也可称之为系统Java虚拟机。系统Java虚拟机配置完整的JRE(Java Runtime Environment, Java运行环境),JRE中包括Class文件中定义的方法在执行时需要访问的核心类库。在本实施例中,第一虚拟机、第二虚拟机可以为应用于安卓(Android)平台的Java虚拟机即Dalvik虚拟机,相应地,第一虚拟机可以为可直接执行适用于安卓平台的Java字节码(也可称之为Dalvik字节码),第二虚拟机可以为基于Java虚拟机规范创建的Dalvik虚拟机。
[0032]应理解,在本实施例中,Java虚拟机的含义可以为符合Java虚拟机规范的虚拟机。例如,在Java虚拟机规范中规定,虚拟机指令需要设置于Java虚拟机规范中定义的类型的文件(例如Class文件)中、由类加载器将定义的类型的文件加载到Java虚拟机、由文件解析器(例如Class文件解析器)解析定义的类型的文件中的虚拟机指令。因此,只要符合上述规范的虚拟机,均可称之为Java虚拟机。
[0033]在本实施例中,在选取出第一虚拟机指令中部分第一虚拟机指令之后,可以将部分第一虚拟机指令转换为被第二虚拟机解析的第二虚拟机指令。第二虚拟机为解析第二虚拟机指令生成机器指令的虚拟机。基于步骤201中说明的虚拟机解析虚拟机指令生成机器指令的原理,下面继续说明创建第二虚拟机,利用第二虚拟机解析第二虚拟机指令生成机器指令的基本原理:以第一虚拟机、第二虚拟机均为Java虚拟机,第一虚拟机指令为Java字节码为例,第一虚拟机可以为可直接执行Java字节码的系统Java虚拟机。可以首先设置第二虚拟机指令的指令格式,然后创建用于对第二虚拟机指令进行解释执行的第二虚拟机的Java解释器,利用第二虚拟机的Java解释器将第二虚拟机指令分别转换为适用于不同平台的指令,即对第二虚拟机指令解释执行。最后,将该指令转换为机器指令,由CPU执行该机器指令。在本实施例中,第二虚拟机的Java解释器可以采用以下方式实现:可以基于系统虚拟机的Java解释器的结构,对系统Java虚拟机的Java解释器的提取虚拟机指令中的操作码、操作数的方式进行改进,使其可以根据第二虚拟机指令格式,从第二虚拟机指令中提取出操作码、操作数。而第二虚拟机中对提取出操作码、操作数的解释执行的方式则可以继续沿用系统Java虚拟机对操作码、操作数的解释执行方式,即可以依照系统Java虚拟机中的操作码、操作数在Java虚拟机的堆栈中的执行顺序,对提取出操作码、操作数解释执行,从而使得第二虚拟机指令得以被解释执行。在本实施例中,在创建了第二虚拟机的Java解释器之后,可以进一步基于Java虚拟机规范,创建与第二虚拟机指令适配的Class文件解析器、类加载器,从而构建第二虚拟机。
[0034]在本实施例中,第二虚拟机可以只支持部分类型的第一虚拟机指令的转换。以第一虚拟机可以为可直接执行Java字节码的系统Java虚拟机为例,对于具有复杂的操作的类型的第一虚拟机指令(Java字节码),例如,需要有核心类库支持的指令,则可以由系统Java虚拟机执行该类型第一虚拟机指令,第二虚拟机不对该类型的第一虚拟机指令进行转换,从而减少系统开销。
[0035]在本实施例中,当第二虚拟机为Java虚拟机,在创建第二虚拟机的Java解释器时,即编写第二虚拟机的Java解释器时,可以仅采用Java语言编写第二虚拟机的Java解释器,对所有第二虚拟机指令的解释执行均通过Java代码的运行实现。也可以同时采用Java语言和C语言编写第二虚拟机的Java解释器。例如,在对第二虚拟机指令解释执行时,对复杂的第二虚拟机指令的解释执行部分由C代码实现,从而提升第二虚拟机指令的执行效率。还可以仅采用C语言编写第二虚拟机的Java解释器,对所有的第二虚拟机指令的解释执行均通过C代码的运行实现,由于C语言为底层语言,因此更难于破解,从而可以进一步提尚安全性。
[0036]在本实施例中,当第一虚拟机、第二虚拟机均为Java虚拟机,在通过Java解释器对第一虚拟机指令、第二虚拟机指令解释执行时,还可以对第一虚拟机指令、第二虚拟机指令进行指令序列优化处理,以及将第一虚拟机指令、第二虚拟机指令与数据分离。例如,分别设置虚拟机指令队列、数据队列。虚拟机指令队列仅存储指令,虚拟机指令需要访问的寄存器和数据存储于数据队列,由指令指针和数据指针分别指向指令队列和数据队列。
[0037]在本实施例的一些可选的实现方式中,将部分第一虚拟机指令转换为被第二虚拟机解析的第二虚拟机指令包括:基于第一虚拟机指令与第二虚拟机指令的对应关系表,将部分第一虚拟机指令转换为第二虚拟机指令。
[0038]在本实施例中,第一虚拟机指令与第二虚拟机指令可以为固定映射关系。可以预先建立第一虚拟机指令与第二虚拟机指令的对应关系表,然后基于第一虚拟机指令与第二虚拟机指令的对应关系表,将部分第一虚拟机指令转换为第二虚拟机指令。此外,还可以针对一条第一虚拟机指令、第二虚拟机指令,单独进行加密处理。
[0039]步骤203,基于第一虚拟机指令中未被转换的第一虚拟机指令与第二虚拟机指令,生成应用对应的可执行文件。
[0040]在本实施例中,可以基于第一虚拟机指令中未被转换的第一虚拟机指令与第二虚拟机指令,生成应用对应的可执行文件,以使得可执行文件被执行时,由第一虚拟机、第二虚拟机分别执行未被转换的第一虚拟机指令、第二虚拟机指令。
[0041]以应用为由Java代码编写的安卓应用为例,可以对该安卓应用的Java源代码进行Java编译之后可以得到对应的第一虚拟机指令(Java字节码)。然后,将部分第
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1