CN103218551B - 一种保护java程序的方法 - Google Patents
一种保护java程序的方法 Download PDFInfo
- Publication number
- CN103218551B CN103218551B CN201310159747.7A CN201310159747A CN103218551B CN 103218551 B CN103218551 B CN 103218551B CN 201310159747 A CN201310159747 A CN 201310159747A CN 103218551 B CN103218551 B CN 103218551B
- Authority
- CN
- China
- Prior art keywords
- java
- class methods
- virtual machine
- instruction
- current
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 284
- 238000013475 authorization Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
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/60—Protecting data
- G06F21/62—Protecting access to data via a platform, e.g. using keys or access control rules
- G06F21/6209—Protecting access to data via a platform, e.g. using keys or access control rules to a single file or object, e.g. in a secure envelope, encrypted and accessed using a key, or with access control rules appended to the object itself
-
- 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/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
-
- 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
-
- 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/53—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 executing in a restricted environment, e.g. sandbox or secure virtual machine
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Abstract
本发明公开一种保护java程序的方法,属于软件保护领域。所述方法包括:java虚拟机装载class文件,当class文件中的java类方法对应的java指令符合预设可移植指令条件时,将java类方法对应的java指令移植到预设缓冲区中,获取java类方法的最大栈深度和最大局部变量个数,并用获取栈和局部变量的java类方法、执行加密锁内虚拟机的java类方法、修改栈和局部变量的java类方法填充class文件中被移植的java指令的位置。采用本发明的技术方案,将部分java程序移植到加密锁中,修改了被保护的java程序,使得程序逻辑不完整,无法还原原始java程序,提高了java程序的安全性。<!--1-->
Description
技术领域
本发明涉及软件保护领域,尤其涉及一种保护java程序的方法。
背景技术
Java语言是一种解释型语言。Java源代码经过编译,生成java指令文件,所生成的java指令文件在Java虚拟机(JVM)中解释执行。这种解释执行的运行机制导致Java源代码很容易被反编译。目前这种反编译工具很多,并且反编译的效果也很好,使得任何使用Java软件的用户都可以很容易地反编译和重构产品的源代码,从而使所有基于Java语言的授权认证许可变得毫无意义。
因此,保证Java软件程序不被反编译和重构或者提高反编译和重构的难度,是基于Java语言的软件保护领域需要解决的一个重要问题。
发明内容
本发明的目的是为了克服现有技术的不足,提供了一种保护java程序的方法。
本发明采用的技术方案是:一种保护java程序的方法,包括:
步骤A:java虚拟机装载class文件,并判断所述class文件是否是合法的文件,如果是,则执行步骤B,否则返回错误信息,结束;
步骤B:所述java虚拟机获取所述class文件中java类方法的总个数和java类方法的起始位置,根据所述起始位置找到当前java类方法;
步骤C:所述java虚拟机解析当前java类方法对应的java指令,并判断是否解析成功,如果是,则执行步骤D,否则返回错误信息,结束;
步骤D:所述java虚拟机判断所述当前java类方法对应的java指令是否符合预设可移植指令条件,如果是,则将所述当前java类方法对应的java指令移植并保存到预设缓冲区中,执行步骤E,否则执行步骤G;
步骤E:所述java虚拟机获取当前java类方法的最大java虚拟机栈深度和最大局部变量个数;
步骤F:所述java虚拟机根据所述最大java虚拟机栈深度和最大局部变量个数,用获取栈和局部变量的java类方法、执行加密锁内虚拟机的java类方法与修改栈和局部变量的java类方法填充所述class文件中被移植的java指令的位置,执行步骤G;
步骤G:所述java虚拟机判断已解析的java类方法的个数是否达到所述class文件中java类方法的总个数,如果是,则将所述预设缓冲区中的当前java类方法对应的java指令移植到加密锁内,结束,否则继续获取下一java类方法作为当前java类方法,返回执行步骤C;
所述步骤A中,所述判断所述class文件是否是合法的文件,具体为:获取并判断class文件的文件头是否为预设字符串,如果是,则表示所述class文件是合法的文件,否则表示所述class文件是不合法的文件;
所述步骤C中,所述解析当前java类方法对应的java指令,具体为:
步骤C-1:所述java虚拟机获取所述class文件中常量池的个数和常量池的起始位置;
步骤C-2:所述java虚拟机根据当前java类方法的第一成员变量和第二成员变量,从所述常量池中获取java类方法名称和java类方法描述符,并判断是否获取成功,如果是,则执行步骤C-3,否则返回错误信息,结束;
步骤C-3:所述java虚拟机根据当前java类方法的第三成员变量和第四成员变量,获取当前java类方法的附加属性,并判断是否获取成功,如果是,则执行步骤D,否则返回错误信息,结束;
所述当前java类方法的第一成员变量是对所述常量池中的java类方法名称的索引;所述当前java类方法的第二成员变量是对所述常量池中java类方法描述符的索引;所述当前java类方法的第三成员变量为当前java类方法的附加属性的个数;所述当前java类方法的第四成员变量为当前java类方法的附加属性的起始位置;
所述附加属性包括code属性,code属性中包括当前java类方法的java指令和当前java类方法的java指令的长度;
所述步骤C与所述步骤D之间包括:
步骤A-1:所述java虚拟机显示class文件的当前java类方法和当前java类方法对应的java指令;
步骤B-1:所述java虚拟机判断已解析的java类方法的个数是否超过所述class文件中java类方法的总个数,如果是,则执行步骤C-1,否则将下一java类方法作为当前java类方法,返回执行步骤C;
步骤C-1:所述java虚拟机接收用户对显示的java类方法和java类方法对应的java指令的选择,根据所述附加属性,获取用户选择的java类方法对应的java指令的起始位置,根据所述起始位置,找到当前java类方法对应的java指令,执行步骤D;
所述步骤D具体为:
步骤A-2:所述java虚拟机判断当前java类方法对应的java指令是否符合预设可移植指令条件,如果是,则执行步骤B-2,否则执行步骤G;
步骤B-2:所述java虚拟机显示java文件的当前java类方法和当前java类方法对应的java指令;
步骤C-2::所述java虚拟机判断已解析的java类方法的个数是否超过class文件中java类方法的总个数,如果是,则执行步骤D-2,否则将下一java类方法作为当前java类方法,返回执行步骤C;
步骤D-2:所述java虚拟机接收用户对显示的java类方法和java类方法对应的java指令的选择,根据附加属性,获取被选择的java指令的起始位置,将起始位置的java指令作为当前java指令,将所述当前java指令移植并保存到预设缓冲区中,执行步骤E;
所述判断当前java类方法对应的java指令是否符合预设可移植指令条件,具体为:
步骤D-1:所述java虚拟机判断当前java类方法对应的java指令的类型是否存在于预设可移植java指令类型集合中,如果是,则执行步骤D-2,否则表示当前指令不可被移植,执行步骤G;
步骤D-2:所述java虚拟机判断当前java类方法对应的java指令是否存在于预设引用常量池指令集合中,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤D-3;
步骤D-3:所述java虚拟机判断当前java类方法对应的java指令是否涉及内存操作,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤D-4;
步骤D-4:所述java虚拟机判断当前java类方法对应的java指令是否对class文件结构体的成员变量进行操作,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤D-5;
步骤D-5:所述java虚拟机判断当前java类方法对应的java指令是否调用外部java类方法,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤E;
所述预设可移植java指令类型集合,包括栈操作指令类型、逻辑运算指令类型、位操作指令类型、算数运算指令类型;
所述步骤F中,所述用获取栈和局部变量的java类方法填充所述class文件中被移植的java指令的位置,具体为:
步骤F-11:所述java虚拟机定位到被移植的当前java类方法的位置;
步骤F-12:所述java虚拟机创建当前java类方法的常量池的索引;
步骤F-13:所述java虚拟机将获取栈和局部变量的java类方法与所述常量池的索引填充到被移植的当前java类方法的位置;
所述步骤F中,所述用执行加密锁内虚拟机的java类方法填充所述class文件中被移植的java指令的位置,具体为:
步骤F-21:所述java虚拟机定位到被移植的当前java类方法的位置;
步骤F-22:所述java虚拟机创建当前java类方法的常量池的索引;
步骤F-23:所述java虚拟机将执行加密锁内虚拟机的java类方法与所述常量池的索引填充到被移植的当前java类方法的位置;
所述步骤F中,所述用修改栈和局部变量的java类方法填充所述class文化中被移植的java指令的位置,具体为:
步骤F-31:所述java虚拟机定位到被移植的当前java类方法的位置;
步骤F-32:所述java虚拟机创建当前java类方法的常量池的索引;
步骤F-33:所述java虚拟机将修改栈和局部变量的java类方法与所述常量池的索引填充到所述class文化中被移植的当前java类方法的位置;
本发明取得的有益效果是:采用本发明的技术方案,将部分java指令移植到加密锁中,修改了被保护的java程序,使得程序逻辑不完整,无法还原出原始的软件代码,提高了java程序的安全性。
附图说明
图1是本发明实施例1提供的一种保护java程序的方法流程图;
图2是本发明实施例1中步骤108的细化图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例1:
本发明的实施例1提供了一种保护java程序的方法,如图1所示,包括:
步骤101:java虚拟机装载class文件;
步骤102:java虚拟机判断装载的class文件是否是合法的文件,如果是,则将class文件保存在内存中,执行步骤103,否则表示所述class文件是不合法的文件,返回错误信息,结束;
在本实施例中,所述class文件的文件头为classfile结构体;
所述classfile结构体为:
优选的,判断classfile结构体中的成员变量magic是否为0xCAFEBABE,如果是,则表示所述class文件是合法的文件,否则表示所述class文件是不合法的文件;
步骤103:java虚拟机获取class文件中常量池的个数和常量池的起始位置,并获得class文件中java类方法的总个数和java类方法的起始位置,根据起始位置找到当前java类方法;
所述常量池中包括java类方法名称和java类方法描述符;
优选的,获取Classfile结构体中的成员变量constant_pool_count的值,即为class文件中常量池的个数,根据Classfile结构体中的成员变量Cp_infoconstant_pool[constant_pool_cpunt-1]可知常量池的起始位置;
获取Classfile结构体中的成员变量methods_count的值,即为class文件中java类方法的总个数;根据Classfile结构体中的成员变量Method_infomethods[methods_count]可知java类方法的起始位置;
所述当前java类方法为:
步骤104:java虚拟机根据获取的常量池和java类方法,解析当前java类方法及当前java类方法对应的java指令,并判断是否解析成功,如果是,则执行步骤105,否则返回错误信息,结束;
所述解析当前方法,具体为:
步骤104-1:java虚拟机根据当前java类方法的第一成员变量和第二成员变量,从常量池中获取java类方法名称和java类方法描述符,并判断是否获取成功,如果是,则执行步骤104-2,否则返回错误信息,结束;
所述方法的结构体为:
所述第一成员变量为name_index,是对常量池中的java类方法名称的索引,第二成员变量为u2descriptor_index,是对常量池中java类方法描述符的索引;
步骤104-2:java虚拟机根据当前java类方法的第三成员变量和第四成员变量,获取附加属性,并判断是否获取成功,如果是,则执行步骤105,否则返回错误信息,结束;
所述第三成员变量为attributes_count,是附加属性的个数,第四成员变量为attribute_infoattributes[attributes_count],表示附加属性的起始位置;
在本实施例中,所述附加属性包括code属性和Exceptions属性,其中,code属性用于解释java指令的数值,Exceptions属性用来指出java类方法需要检查的可能抛出的异常;
所述解析当前java类方法对应的java指令,具体为:获取当前java类方法对应的java指令的总长度及其所述当前java类方法对应的java指令在code属性结构体中的偏移;
所述code属性的结构体为:
获取所述code属性的结构体的成员变量code_length的值,即为当前java类方法对应的java指令的长度,根据所述code属性结构体的成员变量code[code_length],获取当前java类方法对应的java指令的起始位置,依次遍历所述当前java类方法对应的java指令;
步骤105:java虚拟机显示class文件的当前java类方法和当前java类方法对应的java指令;
步骤106:java虚拟机判断已显示的java类方法的个数是否超过java类方法的总个数,如果是,则执行步骤107,否则将下一java类方法作为当前java类方法,返回执行步骤104;
步骤107:java虚拟机接收用户对显示的java类方法和java类方法对应的java指令的选择,根据所述附加属性,获取java类方法对应的java指令的起始位置,根据起始位置找到当前java类方法对应的java指令;
根据所述附加属性中的成员变量code[code_length],获取当前java类方法对应的java指令的起始位置,根据起始位置找到当前java类方法对应的java指令;
在本实施例中,当前java类方法对应的java指令为:
步骤108:java虚拟机判断当前java类方法对应的java指令是否符合预设可移植指令条件,如果是,则执行步骤109,否则执行步骤114;
参见图2,所述判断当前java类方法对应的java指令是否符合预设可移植指令条件,具体为:
步骤108-1:判断当前java类方法对应的java指令的类型是否存在于预设可移植java指令类型集合中,如果是,则将所述当前java类方法对应的java指令保存到预设缓冲区中,执行步骤108-2,否则执行步骤114;
所述预设可移植的java指令类型集合包括:栈操作指令类型,逻辑运算指令类型,位操作指令类型,算数运算指令类型;
优选的,如果当前java指令的第一个字节为0x01,则表示所述java指令类型为栈操作指令类型;如果当前java指令的第一个字节为0x7e,则表示所述java指令类型为逻辑运算指令类型;如果当前java指令的第一个字节为0x7a,则表示所述java指令类型为位操作指令类型;如果当前java指令的第一个字节为0x6c,则表示所述java指令类型为算术运算指令类型;
步骤108-2:判断当前java类方法对应的java指令是否存在于预设引用常量池指令集合中,如果是,则表示当前java类方法对应的java指令不可被移植,执行步骤114,否则执行步骤108-3;
例如,当前java类方法对应的java指令为ldc指令时,存在于预设引用常量池指令集合中,所述ldc指令用于从常量池中提取数据至栈中,不可被移植;
步骤108-3:判断当前java类方法对应的java指令是否涉及内存操作,如果是,则执行步骤114,否则执行步骤108-4;
例如,当前java类方法对应的java指令为new指令时,用于创建一个对象,涉及内存操作,不可被移植;
步骤108-4:判断当前java类方法对应的java指令是否对classfile的成员变量进行操作,如果是,则执行步骤114,否则执行步骤108-5;
例如,当前java类方法对应的java指令为getfield指令时,用于获取classfile中的成员变量,涉及到对成员变量的操作,不可被移植;
步骤108-5:判断当前java类方法对应的java指令是否调用java虚拟机外部方法,如果是,则执行步骤114,否则执行步骤109;
例如,当前java类方法对应的java指令为invokevirtual指令时,用于调用实例方法,需要调用外部方法,不可被移植;
所述步骤105至步骤108还可以为:
步骤A-1:java虚拟机判断当前java类方法对应的java指令是否符合预设可移植指令条件,如果是,则执行步骤B-1,否则执行步骤114;
步骤B-1:java虚拟机显示java文件的当前java类方法和当前java类方法对应的java指令;
步骤C-1:java虚拟机判断已解析的java类方法的个数是否超过java类方法的总个数,如果是,则执行步骤D-1,否则将下一java类方法作为当前java类方法,返回执行步骤104;
步骤D-1:java虚拟机接收用户对显示的java类方法和java类方法对应的java指令的选择,根据所述附加属性,获取被选择的java类方法对应的java指令的选择的起始位置,根据起始位置找到当前java类方法对应的java指令,将所述当前java类方法对应的java指令移植保存到预设缓冲区中,执行步骤109;
所述步骤105至步骤108还可以为:
步骤A-2:java虚拟机判断当前java类方法对应的java指令是否符合预设可移植指令条件,如果是,则执行步骤B-2,否则执行步骤114;
步骤B-2:java虚拟机将所述当前java类方法对应的java指令移植保存到预设缓冲区中,执行步骤109;
步骤109:java虚拟机获取java类方法的最大java虚拟机栈深度和最大局部变量个数;
Java虚拟机根据所述code属性结构体中的成员max_stack获取java类方法的最大栈深度,根据code属性结构体中的成员max_locals获取java类方法的最大局部变量个数;
步骤110:java虚拟机用获取栈和局部变量的java类方法填充所述class文件中被移植的java指令的位置;
具体为:
步骤110-1:java虚拟机定位到被移植的当前java类方法的位置;
步骤110-2:java虚拟机创建当前java类方法的常量池的索引;
优选的,所述常量池的索引,指向存放的数据结构CONSTANT_Methodref_info,用于描述当前java类方法,所述常量池的索引为两个字节,例如,所述常量池的索引为0001,指向的是常量池中的java类方法为javaanalyzer.R7JavaRuntime.GetLocalData(B)[B;
所述数据结构CONSTANT_Methodref_info为:
其中class_index表示类r7javaanalyzer.R7JavaRuntime,name_and_type_index表示方法描述符GetStackData(B)[B;
所述常量池的索引为0002,则指向的常量池的java类方法为:r7javaanalyzer.R7JavaRuntime.GetStackData(B)[B;
步骤110-3:java虚拟机将获取栈和局部变量的java类方法与所述常量池的索引填充到被移植的当前java类方法的位置;
所述获取栈与局部变量的java类方法为invokestatic方法,该方法的数值为0xb8,它需要两个字节的操作符,这两个字节的操作符即为所述常量池的索引;
在本实施例中,在被移植的java指令的位置插入的内容为:Invokestaticr7javaanalyzer.R7JavaRuntime.GetLocalData(B)[B,对应的数值为0xb80001;invokestaticr7javaanalyzer.R7JavaRuntime.GetStackData(B)[B,对应的数值为0xb80002;
步骤111:java虚拟机用执行加密锁内虚拟机的java类方法填充所述class文件中被移植的java指令的位置;
具体为:
步骤111-1:java虚拟机定位到被移植的当前java类方法的位置;
步骤111-2:java虚拟机创建当前java类方法的常量池的索引;
优选的,所述常量池的索引为两个字节,例如,所述常量池的索引为0003,指向的是常量池中的方法为r7javaanalyzer.R7JavaRuntime.R7Java_RunJava(SS)V;
步骤111-3:java虚拟机将执行加密锁内虚拟机的java类方法与所述常量池的索引填充到被移植的当前java类方法的位置;
所述执行加密锁内虚拟机的java指令为invokevirtual指令,该指令的数值为0xC7,它需要两个字节的操作符,这两个字节的操作符即为所述常量池的索引;
在本实施例中,在被移植的java指令的位置插入的内容为:invokevirtualr7javaanalyzer.R7JavaRuntime.R7Java_RunJava(SS)V,对应的数值为0xb80001;
步骤112:java虚拟机用修改栈和局部变量的java类方法填充所述class文化中被移植的java指令的位置;
具体为:
步骤112-1:java虚拟机定位到被移植的当前java类方法的位置;
步骤112-2:java虚拟机创建当前java类方法的常量池的索引;
优选的,所述常量池的索引为两个字节,例如,所述常量池的索引为0005,指向的是常量池中的方法为r7javaanalyzer.R7JavaRuntime.SetLocalData(B)[B;
所述常量池的索引为0006,指向的常量池的方法为;invokestaticr7javaanalyzer.R7JavaRuntime.SetStackData(B)[B;
步骤112-3:java虚拟机将执行修改栈和局部变量的java类方法与所述常量池的索引填充到被移植的当前java类方法的位置;
所述修改栈和局部变量的java指令为invokestatic指令,该指令的数值为0xD8,它需要两个字节的操作符,这两个字节的操作符即为所述常量池的索引;
在本实施例中,在被移植的java指令的位置插入的内容为:invokestaticr7javaanalyzer.R7JavaRuntime.SetLocalData(B)[B,对应的数值为0xD80005;invokestaticr7javaanalyzer.R7JavaRuntime.SetStackData(B)[B,对应的数值为0xD80006;
步骤113:java虚拟机更新java类方法的附加属性的成员信息;
例如,由于填充的java指令的内容增多,因此需要修改附加属性code属性中的长度;
步骤114:所述java虚拟机判断已解析的java类方法的个数是否达到所述class文件中java类方法的总个数,如果是,则将所述预设缓冲区中的当前java类方法对应的java指令移植到加密锁内,移植结束,否则将下一java类方法作为当前java类方法,返回执行步骤108;
在本实施例中,填充的java类方法为:
。
Claims (12)
1.一种保护java程序的方法,其特征在于,包括:
步骤A:java虚拟机装载class文件,并判断所述class文件是否是合法的文件,如果是,则执行步骤B,否则返回错误信息,结束;
步骤B:所述java虚拟机获取所述class文件中java类方法的总个数和java类方法的起始位置,根据所述起始位置找到当前java类方法;
步骤C:所述java虚拟机解析当前java类方法对应的java指令,并判断是否解析成功,如果是,则执行步骤D,否则返回错误信息,结束;
步骤D:所述java虚拟机判断所述当前java类方法对应的java指令是否符合预设可移植指令条件,如果是,则将所述当前java类方法对应的java指令移植并保存到预设缓冲区中,执行步骤E,否则执行步骤G;
步骤E:所述java虚拟机获取当前java类方法的最大java虚拟机栈深度和最大局部变量个数;
步骤F:所述java虚拟机根据所述最大java虚拟机栈深度和最大局部变量个数,用获取栈和局部变量的java类方法、执行加密锁内虚拟机的java类方法与修改栈和局部变量的java类方法填充所述class文件中被移植的java指令的位置,执行步骤G;
步骤G:所述java虚拟机判断已解析的java类方法的个数是否达到所述class文件中java类方法的总个数,如果是,则将所述预设缓冲区中的当前java类方法对应的java指令移植到加密锁内,结束,否则继续获取下一java类方法作为当前java类方法,返回执行步骤C;
所述步骤C与所述步骤D之间包括:
步骤A-1:所述java虚拟机显示class文件的当前java类方法和当前java类方法对应的java指令;
步骤B-1:所述java虚拟机判断已显示的java类方法的个数是否超过java类方法的总个数,如果是,则执行步骤C-1,否则将下一java类方法作为当前java类方法,返回执行步骤C;
步骤C-1:所述java虚拟机接收用户对显示的java类方法和java类方法对应的java指令的选择,获取当前java类方法对应的java指令,执行步骤D。
2.根据权利要求1所述的方法,其特征在于,所述步骤A中,所述判断所述class文件是否是合法的文件,具体为:获取并判断class文件的文件头是否为预设字符串,如果是,则表示所述class文件是合法的文件,否则表示所述class文件是不合法的文件。
3.根据权利要求1所述的方法,其特征在于,所述步骤C中,所述解析当前java类方法对应的java指令,具体为:
步骤C-1:所述java虚拟机获取所述class文件中常量池的个数和常量池的起始位置;
步骤C-2:所述java虚拟机根据当前java类方法的第一成员变量和第二成员变量,从所述常量池中获取java类方法名称和java类方法描述符,并判断是否获取成功,如果是,则执行步骤C-3,否则返回错误信息,结束;
步骤C-3:所述java虚拟机根据当前java类方法的第三成员变量和第四成员变量,获取当前java类方法的附加属性,并判断是否获取成功,如果是,则执行步骤D,否则返回错误信息,结束。
4.根据权利要求3所述的方法,其特征在于,所述当前java类方法的第一成员变量是对所述常量池中的java类方法名称的索引;所述当前java类方法的第二成员变量是对所述常量池中java类方法描述符的索引;所述当前java类方法的第三成员变量为当前java类方法的附加属性的个数;所述当前java类方法的第四成员变量为当前java类方法的附加属性的起始位置。
5.根据权利要求3或4所述的方法,其特征在于,所述附加属性包括code属性,code属性中包括当前java类方法的java指令和当前java类方法的java指令的长度。
6.根据权利要求3所述的方法,其特征在于,所述步骤C与所述步骤D之间具体包括:
步骤A-1:所述java虚拟机显示class文件的当前java类方法和当前java类方法对应的java指令;
步骤B-1:所述java虚拟机判断已解析的java类方法的个数是否超过所述class文件中java类方法的总个数,如果是,则执行步骤C-1,否则将下一java类方法作为当前java类方法,返回执行步骤C;
步骤C-1:所述java虚拟机接收用户对显示的java类方法和java类方法对应的java指令的选择,根据所述附加属性,获取用户选择的java类方法对应的java指令的起始位置,根据所述起始位置,找到当前java类方法对应的java指令,执行步骤D。
7.根据权利要求3所述的方法,其特征在于,所述步骤D具体为:
步骤A-2:所述java虚拟机判断当前java类方法对应的java指令是否符合预设可移植指令条件,如果是,则执行步骤B-2,否则执行步骤G;
步骤B-2:所述java虚拟机显示java文件的当前java类方法和当前java类方法对应的java指令;
步骤C-2:所述java虚拟机判断已解析的java类方法的个数是否超过class文件中java类方法的总个数,如果是,则执行步骤D-2,否则将下一java类方法作为当前java类方法,返回执行步骤C;
步骤D-2:所述java虚拟机接收用户对显示的java类方法和java类方法对应的java指令的选择,根据附加属性,获取被选择的java指令的起始位置,将起始位置的java指令作为当前java指令,将所述当前java指令移植并保存到预设缓冲区中,执行步骤E。
8.根据权利要求1或6或7中任意一项所述的方法,其特征在于,所述判断当前java类方法对应的java指令是否符合预设可移植指令条件,具体为:
步骤D-1:所述java虚拟机判断当前java类方法对应的java指令的类型是否存在于预设可移植java指令类型集合中,如果是,则执行步骤D-2,否则表示当前指令不可被移植,执行步骤G;
步骤D-2:所述java虚拟机判断当前java类方法对应的java指令是否存在于预设引用常量池指令集合中,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤D-3;
步骤D-3:所述java虚拟机判断当前java类方法对应的java指令是否涉及内存操作,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤D-4;
步骤D-4:所述java虚拟机判断当前java类方法对应的java指令是否对class文件结构体的成员变量进行操作,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤D-5;
步骤D-5:所述java虚拟机判断当前java类方法对应的java指令是否调用外部java类方法,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤E。
9.根据权利要求8所述的方法,其特征在于,所述预设可移植java指令类型集合,包括栈操作指令类型、逻辑运算指令类型、位操作指令类型、算数运算指令类型。
10.根据权利要求1所述的方法,其特征在于,所述步骤F中,所述用获取栈和局部变量的java类方法填充所述class文件中被移植的java指令的位置,具体为:
步骤F-11:所述java虚拟机定位到被移植的当前java类方法的位置;
步骤F-12:所述java虚拟机创建当前java类方法的常量池的索引;
步骤F-13:所述java虚拟机将获取栈和局部变量的java类方法与所述常量池的索引填充到被移植的当前java类方法的位置。
11.根据权利要求1所述的方法,其特征在于,所述步骤F中,所述用执行加密锁内虚拟机的java类方法填充所述class文件中被移植的java指令的位置,具体为:
步骤F-21:所述java虚拟机定位到被移植的当前java类方法的位置;
步骤F-22:所述java虚拟机创建当前java类方法的常量池的索引;
步骤F-23:所述java虚拟机将执行加密锁内虚拟机的java类方法与所述常量池的索引填充到被移植的当前java类方法的位置。
12.根据权利要求1所述的方法,其特征在于,所述步骤F中,所述用修改栈和局部变量的java类方法填充所述class文件中被移植的java指令的位置,具体为:
步骤F-31:所述java虚拟机定位到被移植的当前java类方法的位置;
步骤F-32:所述java虚拟机创建当前java类方法的常量池的索引;
步骤F-33:所述java虚拟机将修改栈和局部变量的java类方法与所述常量池的索引填充到所述class文件中被移植的当前java类方法的位置。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310159747.7A CN103218551B (zh) | 2013-05-03 | 2013-05-03 | 一种保护java程序的方法 |
US14/374,602 US9665730B2 (en) | 2013-05-03 | 2014-03-18 | Method for protecting java program |
PCT/CN2014/073559 WO2014176950A1 (zh) | 2013-05-03 | 2014-03-18 | 一种保护java程序的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310159747.7A CN103218551B (zh) | 2013-05-03 | 2013-05-03 | 一种保护java程序的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103218551A CN103218551A (zh) | 2013-07-24 |
CN103218551B true CN103218551B (zh) | 2016-04-06 |
Family
ID=48816328
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310159747.7A Active CN103218551B (zh) | 2013-05-03 | 2013-05-03 | 一种保护java程序的方法 |
Country Status (3)
Country | Link |
---|---|
US (1) | US9665730B2 (zh) |
CN (1) | CN103218551B (zh) |
WO (1) | WO2014176950A1 (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103218551B (zh) * | 2013-05-03 | 2016-04-06 | 飞天诚信科技股份有限公司 | 一种保护java程序的方法 |
CN107220528A (zh) * | 2017-07-21 | 2017-09-29 | 北京深思数盾科技股份有限公司 | Java程序的保护与运行方法、装置和终端 |
CN108133229B (zh) * | 2017-12-11 | 2021-08-06 | 广州能量盒子科技有限公司 | 一种安卓apk文件的分类加密方法及系统 |
CN111124484B (zh) * | 2018-10-31 | 2023-09-01 | 上海奥陶网络科技有限公司 | 一种java程序参数优化方法 |
CN110069243B (zh) * | 2018-10-31 | 2023-03-03 | 上海奥陶网络科技有限公司 | 一种java程序线程优化方法 |
CN111159662A (zh) * | 2019-12-25 | 2020-05-15 | 郑州阿帕斯数云信息科技有限公司 | 一种数据的处理方法和装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102043932A (zh) * | 2010-12-31 | 2011-05-04 | 中国航空工业集团公司第六三一研究所 | 一种防止Java程序被反编译的方法 |
CN102214281A (zh) * | 2011-04-27 | 2011-10-12 | 北京深思洛克软件技术股份有限公司 | 一种软件保护方法和装置 |
Family Cites Families (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7770016B2 (en) * | 1999-07-29 | 2010-08-03 | Intertrust Technologies Corporation | Systems and methods for watermarking software and other media |
GB0024918D0 (en) * | 2000-10-11 | 2000-11-22 | Sealedmedia Ltd | Method of providing java tamperproofing |
US7877613B2 (en) * | 2002-09-04 | 2011-01-25 | Fraunhofer-Gesellschaft Zur Foerderung Der Angewandten Forschung E.V. | Protecting mobile code against malicious hosts |
AR042599A1 (es) * | 2002-11-19 | 2005-06-29 | Schiavoni Juan Jose | Metodo de proteccion de programas y equipo para realizarlo |
DE102004061634A1 (de) * | 2004-12-17 | 2006-06-29 | Siemens Ag | Verfahren und Vorrichtung zur Verschlüsselung und Ausführung einer Software-Bibliothek |
RU2439669C2 (ru) * | 2005-08-06 | 2012-01-10 | Майкрософт Корпорейшн | Способ предотвращения обратного инжиниринга программного обеспечения, неавторизованной модификации и перехвата данных во время выполнения |
CN101261664B (zh) | 2008-04-10 | 2010-07-07 | 北京深思洛克软件技术股份有限公司 | 一种使用软件保护装置存储程序代码实现软件保护的方法 |
US20090328004A1 (en) | 2008-06-27 | 2009-12-31 | International Business Machines Corporation | Method to collaboratively resolve java program errors within an integrated development environment |
EP2402880A1 (en) * | 2010-07-01 | 2012-01-04 | Aladdin Europe GmbH | Method and device for selectively protecting one of a plurality of methods of a class of an application written in an object-orientated language |
US8869127B2 (en) * | 2011-01-03 | 2014-10-21 | International Business Machines Corporation | Refactoring programs for flexible locking |
US20120272239A1 (en) * | 2011-04-25 | 2012-10-25 | International Business Machines Corporation | Sharing class data |
CN102360412B (zh) * | 2011-09-26 | 2014-07-02 | 飞天诚信科技股份有限公司 | Java源代码的保护方法和系统 |
US9798558B2 (en) * | 2012-04-30 | 2017-10-24 | Waratek Limited | Modified JVM with multi-tenant application domains and class differentiation |
CN102708322B (zh) * | 2012-05-12 | 2016-02-24 | 北京深思数盾科技有限公司 | 安卓系统中java应用程序的保护方法 |
US9069656B2 (en) * | 2012-09-28 | 2015-06-30 | Apple Inc. | Obfuscating function resources while reducing stack consumption |
KR20140077539A (ko) * | 2012-12-14 | 2014-06-24 | 삼성전자주식회사 | 애플리케이션 프로그램 보호 방법 및 장치 |
CN103218551B (zh) * | 2013-05-03 | 2016-04-06 | 飞天诚信科技股份有限公司 | 一种保护java程序的方法 |
-
2013
- 2013-05-03 CN CN201310159747.7A patent/CN103218551B/zh active Active
-
2014
- 2014-03-18 WO PCT/CN2014/073559 patent/WO2014176950A1/zh active Application Filing
- 2014-03-18 US US14/374,602 patent/US9665730B2/en active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102043932A (zh) * | 2010-12-31 | 2011-05-04 | 中国航空工业集团公司第六三一研究所 | 一种防止Java程序被反编译的方法 |
CN102214281A (zh) * | 2011-04-27 | 2011-10-12 | 北京深思洛克软件技术股份有限公司 | 一种软件保护方法和装置 |
Non-Patent Citations (1)
Title |
---|
Java Class文件的结构分析及其解析执行;张洪娜等;《计算机应用与软件》;20110715;第28卷(第7期);第180-182页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103218551A (zh) | 2013-07-24 |
WO2014176950A1 (zh) | 2014-11-06 |
US20160275298A1 (en) | 2016-09-22 |
US9665730B2 (en) | 2017-05-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103218551B (zh) | 一种保护java程序的方法 | |
CN105204823B (zh) | 生成应用程序安装包的方法及装置 | |
CN103714292B (zh) | 一种漏洞利用代码的检测方法 | |
Mai et al. | Verifying security invariants in ExpressOS | |
CN108491235B (zh) | 结合动态加载和函数Native化的DEX保护方法 | |
CN105608393B (zh) | 一种基于Android可执行文件重组的加固方法 | |
CN103235911B (zh) | 一种签名方法 | |
CN104424015B (zh) | 一种虚拟机管理方法和装置 | |
CN104408337A (zh) | 一种apk文件防逆向的加固方法 | |
CN107480476A (zh) | 一种基于ELF感染的Android本地层指令编译虚拟化加壳方法 | |
CN107301095A (zh) | 系统运行方法以及操作系统 | |
CN106169048B (zh) | 文件删除方法、装置及电子设备 | |
WO2020238092A1 (zh) | 链接加壳跳转方法、装置、电子设备和存储介质 | |
CN103914326B (zh) | 一种高效更新java指令的方法和装置 | |
CN108763924A (zh) | 一种安卓应用程序中不可信第三方库访问权限控制方法 | |
CN102902732A (zh) | 一种在xml配置文件中添加校验的方法 | |
CN104360869A (zh) | 一种防止底层驱动拦截消息的方法 | |
CN102752104A (zh) | 一种基于智能卡cos的对称密码服务实现方法 | |
CN106775843B (zh) | 基于内存加载的dalvik字节码优化方法 | |
CN105159668A (zh) | PaaS系统中的类加载实现方法及装置 | |
CN105760164B (zh) | 一种用户空间文件系统中acl权限的实现方法 | |
CN106055935A (zh) | 一种进程控制方法、装置及电子设备 | |
CN106598662A (zh) | 基于android的应用加载方法及装置 | |
CN104978221A (zh) | 实现程序的下载删除的方法及系统 | |
CN105932730B (zh) | 手机充电电路、手机、手机充电方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |