CN103218551B - 一种保护java程序的方法 - Google Patents

一种保护java程序的方法 Download PDF

Info

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
Application number
CN201310159747.7A
Other languages
English (en)
Other versions
CN103218551A (zh
Inventor
陆舟
于华章
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Feitian Technologies Co Ltd
Original Assignee
Feitian Technologies Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Feitian Technologies Co Ltd filed Critical Feitian Technologies Co Ltd
Priority to CN201310159747.7A priority Critical patent/CN103218551B/zh
Publication of CN103218551A publication Critical patent/CN103218551A/zh
Priority to US14/374,602 priority patent/US9665730B2/en
Priority to PCT/CN2014/073559 priority patent/WO2014176950A1/zh
Application granted granted Critical
Publication of CN103218551B publication Critical patent/CN103218551B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/62Protecting access to data via a platform, e.g. using keys or access control rules
    • G06F21/6209Protecting 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring 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/53Monitoring 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test 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指令文件在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类方法的位置。
CN201310159747.7A 2013-05-03 2013-05-03 一种保护java程序的方法 Active CN103218551B (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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程序的方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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