CN108153518A - 一种java程序反混淆方法及终端 - Google Patents
一种java程序反混淆方法及终端 Download PDFInfo
- Publication number
- CN108153518A CN108153518A CN201711418874.9A CN201711418874A CN108153518A CN 108153518 A CN108153518 A CN 108153518A CN 201711418874 A CN201711418874 A CN 201711418874A CN 108153518 A CN108153518 A CN 108153518A
- Authority
- CN
- China
- Prior art keywords
- java programs
- index
- name
- java
- programs
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供了一种JAVA程序反混淆方法及终端,根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序,并通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,删除第一JAVA程序未调用的成员变量及函数,得到第二JAVA程序,以及根据执行信息中的语句执行流程,删除第二JAVA程序中未执行的语句,得到优化JAVA程序;本发明通过上述方法,解决了原本混淆过的Jar包中,其JAVA程序中的包名、类名、方法被替换成没有任何的意义的名称,在逆向分析中查看会产生很多困惑,导致在逆向分析过程中十分的耗时的问题。
Description
技术领域
本发明涉及反混淆技术领域,尤其涉及一种JAVA程序反混淆方法及终端。
背景技术
软件混淆是美国加州大学洛杉矶分校与IBM的研究人员共同设计出一个“数学拼图”加密软件系统,该系统在允许用户将其作为一个程序使用的同时,可阻止任何潜藏在背后的破译。在计算机领域的程序开发过程中,最简单的混淆就是名称混淆,而强度更高的流程混淆,让人看不懂软件编程的原理,阻止那些想得到源代码的行为,以此来保护源代码。
目前Java语言普遍使用ProGuard等作为压缩、优化和混淆工具。ProGuard是一个开源免费的Java字节码压缩,优化,混淆器,被广泛的用在Java应用开发和安卓开发中。它删除没有用的类,字段,方法与属性。使字节码最大程度地优化,使用简短且无意义的名字来重命名类、接口、字段和方法。目前在eclipse和IntelliJ IDEA都有该插件,直接将编译好的Java应用混淆优化后发布。
对于大部分商业付费混淆工具比如DashO Pro、Allatori,其中还包含了流程混淆、增加无效代码、流混淆、调试信息混淆、字符串编码、以及水印技术等。最大程度的提高了软件的逆向分析难度。
在逆向分析行业中,混淆过的字节代码给分析造成了很大的阻碍,导致了需要投入大量的时间精力去分析,所以需要一种反混淆的技术来帮助逆向分析人员来减轻工作量。
网络上现有的Java反编译工具,大部分处理混淆过的JAR包都有会编译失败情况,主要原因是混淆器使用一些无效的代码来使程序的堆栈混乱,反编译器按照正常的代码来分析,就会导致逻辑错误,于是就反编译失败了。
发明内容
本发明所要解决的技术问题是:本发明提供一种JAVA程序反混淆方法及终端,解决了Java程序反混淆的难题,促进了逆向分析行业的发展。
为了解决上述技术问题,本发明提供了一种JAVA程序反混淆方法,包括以下步骤:
S1:根据JAVA程序对应的字节码中的调用指令,得到与调用指令对应的第一索引;根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序;所述第二索引集合包括JAVA程序中的包名、类名、接口名及成员变量分别对应的索引;
S2:通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,所述执行信息包括执行字节码时的调用堆栈、调用函数的类型以及语句执行流程;
S3:根据所述调用堆栈和调用函数的类型,创建与所述调用堆栈对应的第三索引,以及与所述调用函数的类型对应的第四索引;根据所述第三索引及第四索引,删除所述第一JAVA程序中未调用的成员变量及函数,得到第二JAVA程序;
S4:根据所述语句执行流程,删除所述第二JAVA程序中未执行的语句,得到优化JAVA程序;根据所述优化JAVA程序,生成反混淆JAR包。
本发明还提供了一种JAVA程序反混淆终端,包括存储器、处理器以及存储在存储器上并可在处理器上执行的计算机程序,所述处理器执行所述程序时实现以下步骤:
S1:根据JAVA程序对应的字节码中的调用指令,得到与调用指令对应的第一索引;根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序;所述第二索引集合包括JAVA程序中的包名、类名、接口名及成员变量分别对应的索引;
S2:通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,所述执行信息包括执行字节码时的调用堆栈、调用函数的类型以及语句执行流程;
S3:根据所述调用堆栈和调用函数的类型,创建与所述调用堆栈对应的第三索引,以及与所述调用函数的类型对应的第四索引;根据所述第三索引及第四索引,删除所述第一JAVA程序中未调用的成员变量及函数,得到第二JAVA程序;
S4:根据所述语句执行流程,删除所述第二JAVA程序中未执行的语句,得到优化JAVA程序;根据所述优化JAVA程序,生成反混淆JAR包。
本发明的有益效果为:
本发明提供的一种JAVA程序反混淆方法及终端,根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序,并通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,删除第一JAVA程序未调用的成员变量及函数,得到第二JAVA程序,以及根据执行信息中的语句执行流程,删除第二JAVA程序中未执行的语句,得到优化JAVA程序;通过上述方法,解决了原本混淆过的Jar包中,其JAVA程序中的包名、类名、方法被替换成没有任何的意义的名称,在逆向分析中查看会产生很多困惑,导致在逆向分析过程中十分的耗时的问题,同时本发明通过Java虚拟机动态执行所述字节码,并获取其相应的执行信息,对JAVA程序进行优化,解决了静态分析器在静态分析过程中无法确定的实际对象类型和插入的混淆的流程使反编译器出现错误的问题;本发明降低了反混淆技术的成本,促进了逆向分析行业的发展。
附图说明
图1为根据本发明实施例的一种JAVA程序反混淆方法的主要步骤示意图;
图2为根据本发明实施例的一种JAVA程序反混淆终端的结构示意图;
标号说明:
1、存储器;2、处理器。
具体实施方式
为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图详予说明。
请参照图1,本发明提供了一种JAVA程序反混淆方法,包括以下步骤:
S1:根据JAVA程序对应的字节码中的调用指令,得到与调用指令对应的第一索引;根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序;所述第二索引集合包括JAVA程序中的包名、类名、接口名及成员变量分别对应的索引;
S2:通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,所述执行信息包括执行字节码时的调用堆栈、调用函数的类型以及语句执行流程;
S3:根据所述调用堆栈和调用函数的类型,创建与所述调用堆栈对应的第三索引,以及与所述调用函数的类型对应的第四索引;根据所述第三索引及第四索引,删除所述第一JAVA程序中未调用的成员变量及函数,得到第二JAVA程序;
S4:根据所述语句执行流程,删除所述第二JAVA程序中未执行的语句,得到优化JAVA程序;根据所述优化JAVA程序,生成反混淆JAR包。
从上述描述可知,本发明提供的一种JAVA程序反混淆方法,根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序,并通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,删除第一JAVA程序未调用的成员变量及函数,得到第二JAVA程序,以及根据执行信息中的语句执行流程,删除第二JAVA程序中未执行的语句,得到优化JAVA程序;通过上述方法,解决了原本混淆过的Jar包中,其JAVA程序中的包名、类名、方法被替换成没有任何的意义的名称,在逆向分析中查看会产生很多困惑,导致在逆向分析过程中十分的耗时的问题,同时本发明通过Java虚拟机动态执行所述字节码,并获取其相应的执行信息,对JAVA程序进行优化,解决了静态分析器在静态分析过程中无法确定的实际对象类型和插入的混淆的流程使反编译器出现错误的问题;本发明降低了反混淆技术的成本,促进了逆向分析行业的发展。
进一步的,所述S1具体为:
根据预设的JAR包,得到JAVA程序及与JAVA程序对应的字节码;
根据JAVA程序的混淆规则,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第三JAVA程序;
根据所述字节码,获取得到调用指令;
创建与所述调用指令对应的索引,得到第一索引;
根据所述JAVA程序中的包名、类名、接口名及成员变量分别对应的索引,创建第二索引集合;
根据所述第一索引及所述第二索引集合,重命名所述第三JAVA程序中的包名、类名、接口名及成员变量,得到所述第一JAVA程序。
从上述描述可知,通过上述方法,可有效地对混淆的包名、类名、接口名及成员变量进行重命名,提高JAVA程序的阅读性。
进一步的,所述S3具体为:
根据所述调用堆栈,创建与所述调用堆栈对应的第三索引;
根据调用函数的类型,创建与所述调用函数的类型对应的第四索引;
根据所述第三索引及所述第四索引,重合名第一JAVA程序中的包名、类名、接口名及成员变量,得到第四JAVA程序;
根据所述第三索引及第四索引,删除所述第四JAVA程序中未调用的成员变量及函数,得到所述第二JAVA程序。
从上述描述可知,通过上述方法,通过动态执行字节码的执行信息,可对第一JAVA程序中的包名、类名、接口名及成员变量进行重命名,进一步提高了JAVA程序的可阅读性,并且通过上述方法还可简化混淆的JAVA程序,缩短反混淆所需要的时间。
进一步的,“根据调用函数的类型,创建与所述调用函数的类型对应的第四索引”具体为:
根据JAVA反射机制,分析JAVA程序的反射代码,得到反射代码中所使用的包名、类名、接口名及成员变量;
根据所述调用函数的类型和反射代码中所使用的包名、类名、接口名及成员变量,创建得到相应的第四索引。
从上述描述可知,其中,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。要分析反射代码的目的是防止动态调用的时候符号找不到导致错误,分析反射使用到的符号(包名/类名/接口名/成员变量),将其添加到第四索引中,以便重命名时能够将反射使用的符号一起重命名。
进一步的,所述S4具体为:
根据所述语句执行流程,分析所述字节码中未被执行的程序语句,删除所述第二JAVA程序与所述未被执行的程序语句对应的JAVA语句,得到优化JAVA程序;
根据所述优化JAVA程序,生成反混淆JAR包。
从上述描述可知,JAVA程序混淆还包括流程混淆,流程混淆主要是加了一些无用的代码,增加流程的复杂程度,或者通过一些无效的指令来破坏函数的堆栈平衡,使静态分析的java反编译器会产生错误;但是一个可以正常执行的流程中必然会跳过哪些会导致错误的代码;于是只要记录字节码的语句执行流程,就可以把不需要的代码移除。
请参照图2,本发明还提供了一种JAVA程序反混淆终端,包括存储器1、处理器2以及存储在存储器1上并可在处理器2上执行的计算机程序,所述处理器2执行所述程序时实现以下步骤:
S1:根据JAVA程序对应的字节码中的调用指令,得到与调用指令对应的第一索引;根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序;所述第二索引集合包括JAVA程序中的包名、类名、接口名及成员变量分别对应的索引;
S2:通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,所述执行信息包括执行字节码时的调用堆栈、调用函数的类型以及语句执行流程;
S3:根据所述调用堆栈和调用函数的类型,创建与所述调用堆栈对应的第三索引,以及与所述调用函数的类型对应的第四索引;根据所述第三索引及第四索引,删除所述第一JAVA程序中未调用的成员变量及函数,得到第二JAVA程序;
S4:根据所述语句执行流程,删除所述第二JAVA程序中未执行的语句,得到优化JAVA程序;根据所述优化JAVA程序,生成反混淆JAR包。
进一步的,所述的一种JAVA程序反混淆终端,所述S1具体为:
根据预设的JAR包,得到JAVA程序及与JAVA程序对应的字节码;
根据JAVA程序的混淆规则,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第三JAVA程序;
根据所述字节码,获取得到调用指令;
创建与所述调用指令对应的索引,得到第一索引;
根据所述JAVA程序中的包名、类名、接口名及成员变量分别对应的索引,创建第二索引集合;
根据所述第一索引及所述第二索引集合,重命名所述第三JAVA程序中的包名、类名、接口名及成员变量,得到所述第一JAVA程序。
进一步的,所述的一种JAVA程序反混淆终端,所述S3具体为:
根据所述调用堆栈,创建与所述调用堆栈对应的第三索引;
根据调用函数的类型,创建与所述调用函数的类型对应的第四索引;
根据所述第三索引及所述第四索引,重合名第一JAVA程序中的包名、类名、接口名及成员变量,得到第四JAVA程序;
根据所述第三索引及第四索引,删除所述第四JAVA程序中未调用的成员变量及函数,得到所述第二JAVA程序。
进一步的,所述的一种JAVA程序反混淆终端,“根据调用函数的类型,创建与所述调用函数的类型对应的第四索引”具体为:
根据JAVA反射机制,分析JAVA程序的反射代码,得到反射代码中所使用的包名、类名、接口名及成员变量;
根据所述调用函数的类型和反射代码中所使用的包名、类名、接口名及成员变量,创建得到相应的第四索引。
进一步的,所述的一种JAVA程序反混淆终端,所述S4具体为:
根据所述语句执行流程,分析所述字节码中未被执行的程序语句,删除所述第二JAVA程序与所述未被执行的程序语句对应的JAVA语句,得到优化JAVA程序;
根据所述优化JAVA程序,生成反混淆JAR包。
请参照图1,本发明的实施例一为:
本发明提供的一种JAVA程序反混淆方法,包括以下步骤:
S1:根据JAVA程序对应的字节码中的调用指令,得到与调用指令对应的第一索引;根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序;所述第二索引集合包括JAVA程序中的包名、类名、接口名及成员变量分别对应的索引;
所述S1具体为:
根据预设的JAR包,得到JAVA程序及与JAVA程序对应的字节码;
根据JAVA程序的混淆规则,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第三JAVA程序;
根据所述字节码,获取得到调用指令;
创建与所述调用指令对应的索引,得到第一索引;
根据所述JAVA程序中的包名、类名、接口名及成员变量分别对应的索引,创建第二索引集合;
根据所述第一索引及所述第二索引集合,重命名所述第三JAVA程序中的包名、类名、接口名及成员变量,得到所述第一JAVA程序(此过程对应实施例三中的静态重命名,静态的分析字节码指令然后按照后文描述的规则重命名)。
其中,Java虚拟机字节码对应的调用指令如表1所示;
表1
某方法中的完整字节码的调用指令如表2所示:
表2
创建调用指令对应的索引,具体为:
创建索引,在所述索引添加两条记录:每条都记录包含调用指令的类型及对应的调用方和被调用方。
S2:通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,所述执行信息包括执行字节码时的调用堆栈、调用函数的类型以及语句执行流程;
S3:根据所述调用堆栈和调用函数的类型,创建与所述调用堆栈对应的第三索引,以及与所述调用函数的类型对应的第四索引;根据所述第三索引及第四索引,删除所述第一JAVA程序中未调用的成员变量及函数,得到第二JAVA程序;
所述S3具体为:
根据所述调用堆栈,创建与所述调用堆栈对应的第三索引;
根据调用函数的类型,创建与所述调用函数的类型对应的第四索引;
根据所述第三索引及所述第四索引,重合名第一JAVA程序中的包名、类名、接口名及成员变量,得到第四JAVA程序;
根据所述第三索引及第四索引,删除所述第四JAVA程序中未调用的成员变量及函数,得到所述第二JAVA程序(此过程对应实施例三中的动态重命名,在虚拟机中运行时记录具体的调用信息,类型信息,优化索引,再使用重命名的规则优化)。
其中,“根据调用函数的类型,创建与所述调用函数的类型对应的第四索引”具体为:
根据JAVA反射机制,分析JAVA程序的反射代码,得到反射代码中所使用的包名、类名、接口名及成员变量;
根据所述调用函数的类型和反射代码中所使用的包名、类名、接口名及成员变量,创建得到相应的第四索引。
S4:根据所述语句执行流程,删除所述第二JAVA程序中未执行的语句,得到优化JAVA程序;根据所述优化JAVA程序,生成反混淆JAR包;
所述S4具体为:
根据所述语句执行流程,分析所述字节码中未被执行的程序语句,删除所述第二JAVA程序与所述未被执行的程序语句对应的JAVA语句,得到优化JAVA程序;
根据所述优化JAVA程序,生成反混淆JAR包。
请参照图2,本发明的实施例二为:
本发明提供的一种JAVA程序反混淆终端,包括存储器、处理器以及存储在存储器上并可在处理器上执行的计算机程序,所述处理器执行所述程序时实现以下步骤:
S1:根据JAVA程序对应的字节码中的调用指令,得到与调用指令对应的第一索引;根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序;所述第二索引集合包括JAVA程序中的包名、类名、接口名及成员变量分别对应的索引;
所述S1具体为:
根据预设的JAR包,得到JAVA程序及与JAVA程序对应的字节码;
根据JAVA程序的混淆规则,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第三JAVA程序;
根据所述字节码,获取得到调用指令;
创建与所述调用指令对应的索引,得到第一索引;
根据所述JAVA程序中的包名、类名、接口名及成员变量分别对应的索引,创建第二索引集合;
根据所述第一索引及所述第二索引集合,重命名所述第三JAVA程序中的包名、类名、接口名及成员变量,得到所述第一JAVA程序。
S2:通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,所述执行信息包括执行字节码时的调用堆栈、调用函数的类型以及语句执行流程;
S3:根据所述调用堆栈和调用函数的类型,创建与所述调用堆栈对应的第三索引,以及与所述调用函数的类型对应的第四索引;根据所述第三索引及第四索引,删除所述第一JAVA程序中未调用的成员变量及函数,得到第二JAVA程序;
所述S3具体为:
根据所述调用堆栈,创建与所述调用堆栈对应的第三索引;
根据调用函数的类型,创建与所述调用函数的类型对应的第四索引;
根据所述第三索引及所述第四索引,重合名第一JAVA程序中的包名、类名、接口名及成员变量,得到第四JAVA程序;
根据所述第三索引及第四索引,删除所述第四JAVA程序中未调用的成员变量及函数,得到所述第二JAVA程序。
其中,“根据调用函数的类型,创建与所述调用函数的类型对应的第四索引”具体为:
根据JAVA反射机制,分析JAVA程序的反射代码,得到反射代码中所使用的包名、类名、接口名及成员变量;
根据所述调用函数的类型和反射代码中所使用的包名、类名、接口名及成员变量,创建得到相应的第四索引。
S4:根据所述语句执行流程,删除所述第二JAVA程序中未执行的语句,得到优化JAVA程序;根据所述优化JAVA程序,生成反混淆JAR包;
所述S4具体为:
根据所述语句执行流程,分析所述字节码中未被执行的程序语句,删除所述第二JAVA程序与所述未被执行的程序语句对应的JAVA语句,得到优化JAVA程序;
根据所述优化JAVA程序,生成反混淆JAR包。
本发明的实施例三为:
本实施例中的符号指的为:包名/类名/接口名/成员变量;
本发明的反混淆方案是在Java字节码的基础上分析的。使用的JDK提供的工具javap会将java字节码反编译成类似汇编指令的JVM指令。
重命名包括静态重命名和动态重命名2种情况。
静态重命名是指在未运行的情况下,分析JVM指令。主要是通过分析指令中使用的类名、接口、方法,对每个类初步建立一个调用索引,然后重命名时候根据索引的记录将全部引用到该符号的对象全部替换。
动态重命名是指在定制的JVM虚拟机中执行Java字节码,通过反射,调用堆栈,完善静态分析中生成的调用索引。根据在JVM中的执行流程去简化,混淆过的流程。
本发明的最大亮点在于使用了JVM动态的分析,解决了静态分析器在静态分析过程中无法确定的实际对象类型和插入的混淆的流程使反编译器出现错误的问题,具体过程如下:
1、根据对象类型来重命名对象
对于混淆来说大部分的重命名都是不可逆的信息破坏,反混淆可以在语意上对其进行恢复,在保证可用的基础上去重命名。首先需要检测Jar包中存在的符号的混淆规则,以便建立合理的重命名方案,符号的混淆包括对方法、包名、类名、接口、成员变量、局部变量混淆,在目前众多的混淆工具中,目前已知的混淆规则如下:
1.1按字母排序
按照字母a-z和A-Z来重命名包名、类名等以至于出现包名类名冲突、同时有2个符号只有大小写有区分的类,对于只有大小写区分的文件在windows环境下无法共同存在在同一个目录。
1.2随机字母数字组合
使用随机长度、随机字母组合重命名包名类型,达到混淆的效果。
1.3空白字符等不可见的符号
空白字符包括空白符(\0),制表符(\t),换行回车(\n\r),使符号不可见。
1.4不可阅读的Uncode字符
使用不可阅读的Uncode字符来命名对象,符号呈现出乱码的状态。
1.5使用‘0’‘o’‘O’
使用很相近的数字‘0’,大写‘O’,小写‘o’来组成符号,由于这样是组合比较少,如果类名太多会导致类名过长,所以比较少看到这种混淆方式。
2、创建索引
对将要分析的Jar包需要创建以下几种索引,如表3所示。索引采用无序树结构,每个符号对应一个或多个对该符号使用(即每个符号可被其他一个或多个符合调用、被调用、继承、被继承、实现、被实现、实例化和被重写的使用关系)的符号,形成一对多的关系。
索引 | 中文解释 |
Used | 调用 |
Used By | 被调用 |
Extend | 继承 |
Extend By | 被继承 |
Implemented | 实现 |
Implemented By | 被实现 |
Instantiated By | 实例化 |
Overridden By | 被重写 |
表3
3、静态重命名
3.1保留的符号
混淆过的java包中为了正常使用还是会有部分保留的符号。这些符号是共有的(public)的类、方法等,因为这些需要暴露给外部使用,或者是留给反射去使用的。可以根据这些保留的符号被使用情况(赋值、调用、继承)情况来重命名相关的成员变量。
3.2调用未混淆的符号
在编写功能的过程中,由于Java的特性必然会调用一些Java语言提供的标准库中的接口。还有开发过程中使用一些常用的开源第三方JAR包,调用了其中的类、接口、方法,会保留符号的信息,可以根据这些符号来重命名恢复一些符号。
如表4所示,对于一些继承同一个已知类的可以按照类似如下规则重命名,其中Runnable、Thread和Jpanel为类名,xxx为随机字母组合;
Runnable | Runnablexxx |
Thread | Threadxxx |
Jpanel | Jpanelxxx |
表4
3.3重命名丢失的符号
某些类因为属于内部类,不需要暴露符号给外部调用,所以在混淆时候相关信息全部丢失。只能按照类、接口、方法、成员变量的功能给予相应的前缀命名,增加其语言来帮助分析,如表5所示,即丢失后,若判断其符号对应为类,则可用Class进行命名,存在多个的话可用Class1、Class2、……、ClassN表示。
类 | Class |
接口 | Interface |
方法 | Method |
成员变量 | Field |
局部变量 | Local |
表5
这样做的好处在于,增加了符号的意义,可以清晰的确定该符号的基本功能。
4、定制JVM
Java虚拟机(JVM)用于执行Java字节码。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。基于开源项目OpenJDK,定制一个可以监视、记录调用流程、调用堆栈的Java虚拟机。
OpenJDK的虚拟机是Hotspot JVM,在官网下载的源码包的Hotspot目录中。采用c++语言编写。
对cpu目录下的源码修改,主要修改以下文件:
methodHandles_xxx.cpp;
templateInterpreter_xxx.cpp;
registerMap_xxx.cpp;
bytecodeInterpreter_xxx.cpp;
c1_LIRAssembler_xxx.cpp;
templateTable_xxx.cpp;
runtime_xxx.cpp;
其中xxx对应的CPU的平台。在其中添加Hook方法,然后在执行Java字节码的过程中会调用Hook方法将信息存到索引中。
5、动态重命名
在Java这类面向对象(OOP)的语言,多态性是其重要的特性,所以经常涉及继承和接口的转换,静态分析不能确定类型,需要动态的确定类型。
在JVM运行时记录的继承索引和被继承索引中,对于继承关系的重命名的规则,如下的代码子类class B继承基类class A,有方法public A GetA();则可以将a命名为class B_ext_A这样的规则。如表6所示为混淆的代码,如表7所示为动态重合名后的代码。
表6
表7
6、分析反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。要分析反射的代码的目的是防止动态调用的时候符号找不到导致错误,分析反射使用到的符号,添加到调用索引中,以便重命名时能够将反射使用的符号一起重命名。
7、去除流程逻辑混淆
在商业混淆中还有流程混淆,流程混淆主要是加了一些无用的代码,增加流程的复杂程度,或者通过一些无效的指令来破坏函数的堆栈平衡,使静态分析的java反编译器会产生错误。但是一个可以正常执行的流程中必然会跳过哪些会导致错误的代码。于是只要记录字节码的执行流程,就可以把不需要的代码移除。
根据修改的JVM虚拟机,能够逐语句记录执行流程,然后分析未被执行的字节码,将无效代码特征的字节码移除。无效代码都有不会被执行到的特征,或者是执行完成后不会对结果产生影响的代码的特征。
8、去除无效的符号
根据在静态分析和虚拟机中执行时建立的索引,对于没有使用到的符号进行删除,从而达到减少需要分析的无用符号的目的。
综上所述,本发明提供的一种JAVA程序反混淆方法及终端,根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序,并通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,删除第一JAVA程序未调用的成员变量及函数,得到第二JAVA程序,以及根据执行信息中的语句执行流程,删除第二JAVA程序中未执行的语句,得到优化JAVA程序;通过上述方法,解决了原本混淆过的Jar包中,其JAVA程序中的包名、类名、方法被替换成没有任何的意义的名称,在逆向分析中查看会产生很多困惑,导致在逆向分析过程中十分的耗时的问题,同时本发明通过Java虚拟机动态执行所述字节码,并获取其相应的执行信息,对JAVA程序进行优化,解决了静态分析器在静态分析过程中无法确定的实际对象类型和插入的混淆的流程使反编译器出现错误的问题;本发明降低了反混淆技术的成本,促进了逆向分析行业的发展。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (10)
1.一种JAVA程序反混淆方法,其特征在于,包括以下步骤:
S1:根据JAVA程序对应的字节码中的调用指令,得到与调用指令对应的第一索引;根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序;所述第二索引集合包括JAVA程序中的包名、类名、接口名及成员变量分别对应的索引;
S2:通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,所述执行信息包括执行字节码时的调用堆栈、调用函数的类型以及语句执行流程;
S3:根据所述调用堆栈和调用函数的类型,创建与所述调用堆栈对应的第三索引,以及与所述调用函数的类型对应的第四索引;根据所述第三索引及第四索引,删除所述第一JAVA程序中未调用的成员变量及函数,得到第二JAVA程序;
S4:根据所述语句执行流程,删除所述第二JAVA程序中未执行的语句,得到优化JAVA程序;根据所述优化JAVA程序,生成反混淆JAR包。
2.根据权利要求1所述的一种JAVA程序反混淆方法,其特征在于,所述S1具体为:
根据预设的JAR包,得到JAVA程序及与JAVA程序对应的字节码;
根据JAVA程序的混淆规则,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第三JAVA程序;
根据所述字节码,获取得到调用指令;
创建与所述调用指令对应的索引,得到第一索引;
根据所述JAVA程序中的包名、类名、接口名及成员变量分别对应的索引,创建第二索引集合;
根据所述第一索引及所述第二索引集合,重命名所述第三JAVA程序中的包名、类名、接口名及成员变量,得到所述第一JAVA程序。
3.根据权利要求1所述的一种JAVA程序反混淆方法,其特征在于,所述S3具体为:
根据所述调用堆栈,创建与所述调用堆栈对应的第三索引;
根据调用函数的类型,创建与所述调用函数的类型对应的第四索引;
根据所述第三索引及所述第四索引,重合名第一JAVA程序中的包名、类名、接口名及成员变量,得到第四JAVA程序;
根据所述第三索引及第四索引,删除所述第四JAVA程序中未调用的成员变量及函数,得到所述第二JAVA程序。
4.根据权利要求3所述的一种JAVA程序反混淆方法,其特征在于,“根据调用函数的类型,创建与所述调用函数的类型对应的第四索引”具体为:
根据JAVA反射机制,分析JAVA程序的反射代码,得到反射代码中所使用的包名、类名、接口名及成员变量;
根据所述调用函数的类型和反射代码中所使用的包名、类名、接口名及成员变量,创建得到相应的第四索引。
5.根据权利要求1所述的一种JAVA程序反混淆方法,其特征在于,所述S4具体为:
根据所述语句执行流程,分析所述字节码中未被执行的程序语句,删除所述第二JAVA程序与所述未被执行的程序语句对应的JAVA语句,得到优化JAVA程序;
根据所述优化JAVA程序,生成反混淆JAR包。
6.一种JAVA程序反混淆终端,包括存储器、处理器以及存储在存储器上并可在处理器上执行的计算机程序,其特征在于,所述处理器执行所述程序时实现以下步骤:
S1:根据JAVA程序对应的字节码中的调用指令,得到与调用指令对应的第一索引;根据所述第一索引及预设的第二索引集合,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第一JAVA程序;所述第二索引集合包括JAVA程序中的包名、类名、接口名及成员变量分别对应的索引;
S2:通过OpenJDK记录Java虚拟机执行所述字节码时的执行信息,所述执行信息包括执行字节码时的调用堆栈、调用函数的类型以及语句执行流程;
S3:根据所述调用堆栈和调用函数的类型,创建与所述调用堆栈对应的第三索引,以及与所述调用函数的类型对应的第四索引;根据所述第三索引及第四索引,删除所述第一JAVA程序中未调用的成员变量及函数,得到第二JAVA程序;
S4:根据所述语句执行流程,删除所述第二JAVA程序中未执行的语句,得到优化JAVA程序;根据所述优化JAVA程序,生成反混淆JAR包。
7.根据权利要求6所述的一种JAVA程序反混淆终端,其特征在于,所述S1具体为:
根据预设的JAR包,得到JAVA程序及与JAVA程序对应的字节码;
根据JAVA程序的混淆规则,重命名所述JAVA程序中的包名、类名、接口名及成员变量,得到第三JAVA程序;
根据所述字节码,获取得到调用指令;
创建与所述调用指令对应的索引,得到第一索引;
根据所述JAVA程序中的包名、类名、接口名及成员变量分别对应的索引,创建第二索引集合;
根据所述第一索引及所述第二索引集合,重命名所述第三JAVA程序中的包名、类名、接口名及成员变量,得到所述第一JAVA程序。
8.根据权利要求6所述的一种JAVA程序反混淆终端,其特征在于,所述S3具体为:
根据所述调用堆栈,创建与所述调用堆栈对应的第三索引;
根据调用函数的类型,创建与所述调用函数的类型对应的第四索引;
根据所述第三索引及所述第四索引,重合名第一JAVA程序中的包名、类名、接口名及成员变量,得到第四JAVA程序;
根据所述第三索引及第四索引,删除所述第四JAVA程序中未调用的成员变量及函数,得到所述第二JAVA程序。
9.根据权利要求8所述的一种JAVA程序反混淆终端,其特征在于,“根据调用函数的类型,创建与所述调用函数的类型对应的第四索引”具体为:
根据JAVA反射机制,分析JAVA程序的反射代码,得到反射代码中所使用的包名、类名、接口名及成员变量;
根据所述调用函数的类型和反射代码中所使用的包名、类名、接口名及成员变量,创建得到相应的第四索引。
10.根据权利要求6所述的一种JAVA程序反混淆终端,其特征在于,所述S4具体为:
根据所述语句执行流程,分析所述字节码中未被执行的程序语句,删除所述第二JAVA程序与所述未被执行的程序语句对应的JAVA语句,得到优化JAVA程序;
根据所述优化JAVA程序,生成反混淆JAR包。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711418874.9A CN108153518B (zh) | 2017-12-25 | 2017-12-25 | 一种java程序反混淆方法及终端 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711418874.9A CN108153518B (zh) | 2017-12-25 | 2017-12-25 | 一种java程序反混淆方法及终端 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108153518A true CN108153518A (zh) | 2018-06-12 |
CN108153518B CN108153518B (zh) | 2021-02-26 |
Family
ID=62465749
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711418874.9A Active CN108153518B (zh) | 2017-12-25 | 2017-12-25 | 一种java程序反混淆方法及终端 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108153518B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110675256A (zh) * | 2019-08-30 | 2020-01-10 | 阿里巴巴集团控股有限公司 | 部署和执行智能合约的方法及装置 |
CN110795704A (zh) * | 2019-10-28 | 2020-02-14 | 成都超有爱科技有限公司 | 一种应用程序的源代码混淆方法、装置及存储介质 |
CN110837372A (zh) * | 2019-11-04 | 2020-02-25 | 贵阳动视云科技有限公司 | 汇编代码清除混淆的方法、装置、介质及设备 |
US10783082B2 (en) | 2019-08-30 | 2020-09-22 | Alibaba Group Holding Limited | Deploying a smart contract |
CN111814120A (zh) * | 2020-07-10 | 2020-10-23 | 北京嘀嘀无限科技发展有限公司 | 程序反混淆处理方法、装置、设备及存储介质 |
CN112016059A (zh) * | 2020-08-31 | 2020-12-01 | 百度时代网络技术(北京)有限公司 | 用于处理数据的方法、装置、设备以及存储介质 |
CN112528282A (zh) * | 2020-12-14 | 2021-03-19 | 山东小葱数字科技有限公司 | 反混淆代码的方法、装置和电子设备 |
CN112711400A (zh) * | 2020-12-31 | 2021-04-27 | 北京字跳网络技术有限公司 | 视图的处理方法、设备、存储介质及计算机程序产品 |
CN113094665A (zh) * | 2021-04-09 | 2021-07-09 | 每日互动股份有限公司 | 一种防止java程序被反编译的系统 |
CN115309405A (zh) * | 2022-08-24 | 2022-11-08 | 北京熵核科技有限公司 | 一种代码链接优化方法 |
CN117573142A (zh) * | 2024-01-15 | 2024-02-20 | 广州大学 | 基于模拟执行的java代码反混淆器 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080222736A1 (en) * | 2007-03-07 | 2008-09-11 | Trusteer Ltd. | Scrambling HTML to prevent CSRF attacks and transactional crimeware attacks |
CN103544414A (zh) * | 2013-10-25 | 2014-01-29 | 苏州通付盾信息技术有限公司 | 一种Android系统应用的深度代码混淆方法 |
US20140189882A1 (en) * | 2012-12-28 | 2014-07-03 | Robert Jung | System and method for the programmatic runtime de-obfuscation of obfuscated software utilizing virtual machine introspection and manipulation of virtual machine guest memory permissions |
CN104834837A (zh) * | 2015-04-03 | 2015-08-12 | 西北大学 | 一种基于语义的二进制代码反混淆方法 |
CN105574368A (zh) * | 2015-12-10 | 2016-05-11 | 华青融天(北京)技术股份有限公司 | 一种Python程序模块的安全调用方法和装置 |
CN106203007A (zh) * | 2015-05-08 | 2016-12-07 | 腾讯科技(深圳)有限公司 | 一种代码处理方法、装置及计算设备 |
CN106845171A (zh) * | 2017-01-20 | 2017-06-13 | 暨南大学 | 一种Android应用程序代码保护机制鉴别方法 |
-
2017
- 2017-12-25 CN CN201711418874.9A patent/CN108153518B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080222736A1 (en) * | 2007-03-07 | 2008-09-11 | Trusteer Ltd. | Scrambling HTML to prevent CSRF attacks and transactional crimeware attacks |
US20140189882A1 (en) * | 2012-12-28 | 2014-07-03 | Robert Jung | System and method for the programmatic runtime de-obfuscation of obfuscated software utilizing virtual machine introspection and manipulation of virtual machine guest memory permissions |
CN103544414A (zh) * | 2013-10-25 | 2014-01-29 | 苏州通付盾信息技术有限公司 | 一种Android系统应用的深度代码混淆方法 |
CN104834837A (zh) * | 2015-04-03 | 2015-08-12 | 西北大学 | 一种基于语义的二进制代码反混淆方法 |
CN106203007A (zh) * | 2015-05-08 | 2016-12-07 | 腾讯科技(深圳)有限公司 | 一种代码处理方法、装置及计算设备 |
CN105574368A (zh) * | 2015-12-10 | 2016-05-11 | 华青融天(北京)技术股份有限公司 | 一种Python程序模块的安全调用方法和装置 |
CN106845171A (zh) * | 2017-01-20 | 2017-06-13 | 暨南大学 | 一种Android应用程序代码保护机制鉴别方法 |
Non-Patent Citations (2)
Title |
---|
S. CIMATO 等: "Overcoming the obfuscation of Java programs by identifier renaming", 《THE JOURNALOF SYSTEMS AND SOFTWARE》 * |
张宇嘉 等: "代码混淆技术研究综述", 《信息工程大学学报》 * |
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11010303B2 (en) | 2019-08-30 | 2021-05-18 | Advanced New Technologies Co., Ltd. | Deploying a smart contract |
US10783082B2 (en) | 2019-08-30 | 2020-09-22 | Alibaba Group Holding Limited | Deploying a smart contract |
CN110675256A (zh) * | 2019-08-30 | 2020-01-10 | 阿里巴巴集团控股有限公司 | 部署和执行智能合约的方法及装置 |
US11307990B2 (en) | 2019-08-30 | 2022-04-19 | Advanced New Technologies Co., Ltd. | Deploying a smart contract |
CN110795704A (zh) * | 2019-10-28 | 2020-02-14 | 成都超有爱科技有限公司 | 一种应用程序的源代码混淆方法、装置及存储介质 |
CN110837372A (zh) * | 2019-11-04 | 2020-02-25 | 贵阳动视云科技有限公司 | 汇编代码清除混淆的方法、装置、介质及设备 |
CN110837372B (zh) * | 2019-11-04 | 2021-01-26 | 贵阳动视云科技有限公司 | 汇编代码清除混淆的方法、装置、介质及设备 |
CN111814120A (zh) * | 2020-07-10 | 2020-10-23 | 北京嘀嘀无限科技发展有限公司 | 程序反混淆处理方法、装置、设备及存储介质 |
CN111814120B (zh) * | 2020-07-10 | 2021-04-23 | 北京嘀嘀无限科技发展有限公司 | 程序反混淆处理方法、装置、设备及存储介质 |
CN112016059A (zh) * | 2020-08-31 | 2020-12-01 | 百度时代网络技术(北京)有限公司 | 用于处理数据的方法、装置、设备以及存储介质 |
CN112528282A (zh) * | 2020-12-14 | 2021-03-19 | 山东小葱数字科技有限公司 | 反混淆代码的方法、装置和电子设备 |
CN112528282B (zh) * | 2020-12-14 | 2022-10-18 | 山东小葱数字科技有限公司 | 反混淆代码的方法、装置和电子设备 |
CN112711400A (zh) * | 2020-12-31 | 2021-04-27 | 北京字跳网络技术有限公司 | 视图的处理方法、设备、存储介质及计算机程序产品 |
CN113094665A (zh) * | 2021-04-09 | 2021-07-09 | 每日互动股份有限公司 | 一种防止java程序被反编译的系统 |
CN115309405A (zh) * | 2022-08-24 | 2022-11-08 | 北京熵核科技有限公司 | 一种代码链接优化方法 |
CN115309405B (zh) * | 2022-08-24 | 2023-08-04 | 北京熵核科技有限公司 | 一种代码链接优化方法 |
CN117573142A (zh) * | 2024-01-15 | 2024-02-20 | 广州大学 | 基于模拟执行的java代码反混淆器 |
CN117573142B (zh) * | 2024-01-15 | 2024-04-23 | 广州大学 | 基于模拟执行的java代码反混淆器 |
Also Published As
Publication number | Publication date |
---|---|
CN108153518B (zh) | 2021-02-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108153518A (zh) | 一种java程序反混淆方法及终端 | |
TWI648648B (zh) | 安卓平台上可執行程式的保護方法 | |
JP4902129B2 (ja) | セキュリティ仮想マシンを介してセキュリティポリシーを実施するための方法およびシステム | |
JP5602597B2 (ja) | 外来情報を区分けすることにより仮想マシン・コードをメモリ最適化する方法、コンピュータ・プログラム、およびシステム | |
Fournet et al. | Fully abstract compilation to JavaScript | |
CN108932406A (zh) | 虚拟化软件保护方法和装置 | |
CN112052006B (zh) | 一种软件代码编译方法及系统 | |
CN104866734B (zh) | 一种dex文件的保护方法及装置 | |
KR101234591B1 (ko) | Jni를 이용한 안드로이드 난독화 방법 | |
CN106845171A (zh) | 一种Android应用程序代码保护机制鉴别方法 | |
CN108416216A (zh) | 漏洞检测方法、装置及计算设备 | |
CN109948308A (zh) | 代码安全保护方法、装置、电子设备和计算机可读存储介质 | |
CN101986326A (zh) | 保护软件安全的方法及装置 | |
CN106557350B (zh) | 应用程序安装包中java字节码转换方法、装置及设备 | |
CN111090425A (zh) | 一种程序封装方法、装置及电子设备 | |
de Dios et al. | Model-driven development of a secure ehealth application | |
CN107122656A (zh) | 一种通过自调试防止外部调试的方法和装置 | |
KR101220014B1 (ko) | 보안 임계적인 데이터 컨테이너를 제공하기 위한 방법 및컴퓨터 판독가능 매체 | |
CN109669799A (zh) | 错误上报控制方法、装置及存储介质 | |
Paykin et al. | Weird machines as insecure compilation | |
CN109918872B (zh) | Android应用加固方法 | |
Loch | Juturna: Lightweight, Pluggable and Selective Taint Tracking for Java | |
Jeong et al. | Intermediate Language Translation and Evaluation for Binary Code Software Weakness Analysis [J] | |
CN118779850A (zh) | 一种代码混淆配置方法、装置、设备及介质 | |
Stewart et al. | A fine-grained framework for quantifying secure management of state in object-oriented programs |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |