一种防止反编译的方法、系统、装置及存储介质与流程

文档序号:30659844发布日期:2022-07-06 01:35阅读:196来源:国知局
一种防止反编译的方法、系统、装置及存储介质与流程

1.本发明涉及计算机安全领域,特别是涉及一种防止反编译的方法、系统、装置及存储介质。


背景技术:

2.java作为一种面向对象编程的计算机语言,其依托高效、开源、易维护等特性得到了广泛的应用。但是,由于java语言的上述特性,导致java class文件存在被反编译的风险。不法分子通过获取的程序包,将程序包反编译为源代码,很容易发现软件的内部接口。通过该内部接口,利用非法手段绕过软件的校验机制,从而实现对服务器中信息进行窃取或破坏等行为。
3.目前防止反编译的技术手段,主要是通过对java class文件进行加密或对变量名进行混淆。但是,由于java class文件需要在虚拟机中运行才能实现既定的功能,而虚拟机所能识别的java class文件必须是解密或恢复正常变量的正常状态。因此,不法分子可以通过虚拟机将已解密或恢复正常状态的class文件转储到本地,从而实现根据该class文件实现反编译。因此,如何防止java源代码被反编译,已成为亟待解决的问题。


技术实现要素:

4.本发明实施例的目的在于提供一种防止反编译的方法、系统、装置及存储介质,以实现防止java源代码被反编译。具体技术方案如下:
5.一种防止反编译的方法,所述方法包括:
6.在初始源代码中添加第一预设成员变量和第二预设成员变量,获得第一目标源代码,其中,所述第一预设成员变量和所述第二预设成员变量不同。
7.识别所述第一目标源代码中各判断逻辑代码块的布尔表达式。
8.利用所述第一预设成员变量和所述第二预设成员变量,按照预设替换规则,对所述布尔表达式执行替换操作,获得第二目标源代码。
9.编译所述第二目标源代码,获得初始class文件。
10.按照预设常量同名化规则,对所述初始class文件进行同名化处理,获得目标class文件。
11.可选的,所述识别所述第一目标源代码中各判断逻辑代码块的布尔表达式,包括:
12.遍历所述第一目标源代码,对所述第一目标源代码中的各代码块:根据预设目标代码块识别规则,判断该代码块中是否存在判断逻辑代码,若是,则将该代码块确定为所述判断逻辑代码块。
13.识别各判断逻辑代码块的所述布尔表达式。
14.可选的,所述布尔表达式分为第一类型和第二类型,所述第一类型的所述布尔表达式是无法被拆分为子表达式的布尔表达式,所述第二类型与所述第一类型不同,所述利用所述第一预设成员变量和所述第二预设成员变量,按照预设替换规则,对所述布尔表达
式执行替换操作,获得第二目标源代码,包括:
15.在所述布尔表达式的类型为第一类型时,按照所述预设替换规则,将第一布尔表达式赋值于所述第一预设成员变量,并将所述第一布尔表达式替换为所述第一预设成员变量的变量名,将第二布尔表达式赋值于所述第二预设成员变量,并将所述第二布尔表达式替换为所述第二预设成员变量的变量名,获得第二目标源代码,其中,所述第一布尔表达式和所述第二布尔表达式不同,所述第一布尔表达式和所述第二布尔表达不在同一个所述判断逻辑代码块中。
16.可选的,所述布尔表达式分为第一类型和第二类型,所述第一类型的所述布尔表达式是无法被拆分为子表达式的布尔表达式,所述第二类型与所述第一类型不同,所述利用所述第一预设成员变量和所述第二预设成员变量,按照预设替换规则,对所述布尔表达式执行替换操作,获得第二目标源代码,还包括:
17.在所述布尔表达式的类型为第二类型时,将所述布尔表达式拆分为第一子布尔表达式和第二子布尔表达式。
18.按照所述预设替换规则,将所述第一子布尔表达式赋值于所述第一预设成员变量,并将所述第一子布尔表达式替换为所述第一预设成员变量的变量名,将所述第二子布尔表达式进行取反操作后赋值于所述第二预设成员变量,并将所述第二子布尔表达式替换为经过所述取反操作后的所述第二预设成员变量的变量名,获得所述第二目标源代码,其中,所述第一子布尔表达式和所述第二子布尔表达式在同一个所述判断逻辑码块中。
19.可选的,按照预设常量同名化规则,对所述初始class文件进行同名化处理,获得目标class文件,包括:
20.根据所述第一预设成员变量的变量名,在所述初始class文件的常量池中查找与所述第一预设成员变量的变量名匹配的字符串常量,将所述字符串常量的字符串内容替换为所述第二预设成员变量的变量名。
21.或,根据所述第二预设成员变量的变量名,在所述初始class文件的常量池中查找与所述第二预设成员变量的变量名匹配的字符串常量,将所述字符串常量的字符串内容替换为所述第一预设成员变量的变量名。
22.一种防止反编译的系统,所述系统包括:
23.变量添加模块,用于在初始源代码中添加第一预设成员变量和第二预设成员变量,获得第一目标源代码,其中,所述第一预设成员变量和所述第二预设成员变量不同。
24.表达式获取模块,用于识别所述第一目标源代码中各判断逻辑代码块的布尔表达式。
25.表达式替换模块,用于利用所述第一预设成员变量和所述第二预设成员变量,按照预设替换规则,对所述布尔表达式执行替换操作,获得第二目标源代码。
26.编译模块,用于编译所述第二目标源代码,获得初始class文件。
27.同名化处理模块,用于按照预设常量同名化规则,对所述初始class文件进行同名化处理,获得目标class文件。
28.可选的,所述表达式获取模块被设置为:
29.遍历所述第一目标源代码,对所述第一目标源代码中的各代码块:根据预设目标代码块识别规则,判断该代码块中是否存在判断逻辑代码,若是,则将该代码块确定为所述
判断逻辑代码块。
30.识别各判断逻辑代码块的所述布尔表达式。
31.可选的,所述表达式替换模块被设置为:
32.在所述布尔表达式的类型为第一类型时,按照所述预设替换规则,将第一布尔表达式赋值于所述第一预设成员变量,并将所述第一布尔表达式替换为所述第一预设成员变量的变量名,将第二布尔表达式赋值于所述第二预设成员变量,并将所述第二布尔表达式替换为所述第二预设成员变量的变量名,获得第二目标源代码,其中,所述第一布尔表达式和所述第二布尔表达式不同,所述第一布尔表达式和所述第二布尔表达式不在同一个所述判断逻辑代码块中。
33.可选的,所述表达式替换模块还被设置为:
34.在所述布尔表达式的类型为第二类型时,将所述布尔表达式拆分为第一子布尔表达式和第二子布尔表达式。
35.按照所述预设替换规则,将所述第一子布尔表达式赋值于所述第一预设成员变量,并将所述第一子布尔表达式替换为所述第一预设成员变量的变量名,将所述第二子布尔表达式进行取反操作后赋值于所述第二预设成员变量,并将所述第二子布尔表达式替换为经过所述取反操作后的所述第二预设成员变量的变量名,获得所述第二目标源代码,其中,所述第一子布尔表达式和所述第二子布尔表达式在同一个所述判断逻辑码块中。
36.可选的,所述同名化处理模块被设置为:
37.根据所述第一预设成员变量的变量名,在所述初始class文件的常量池中查找与所述第一预设成员变量的变量名匹配的字符串常量,将所述字符串常量的字符串内容替换为所述第二预设成员变量的变量名。
38.或,根据所述第二预设成员变量的变量名,在所述初始class文件的常量池中查找与所述第二预设成员变量的变量名匹配的字符串常量,将所述字符串常量的字符串内容替换为所述第一预设成员变量的变量名。
39.一种防止反编译的装置,所述装置包括:
40.处理器;
41.用于存储所述处理器可执行指令的存储器。
42.其中,所述处理器被配置为执行所述指令,以实现如上述任一项所述的防止反编译的方法。
43.一种计算机可读存储介质,当所述计算机可读存储介质中的指令由防止反编译的装置的处理器执行时,使得所述防止反编译的装置能够执行如上述任一项所述的防止反编译的方法。
44.本发明实施例提供的一种防止反编译的方法、系统、装置及存储介质,利用预设成员变量对布尔表达式进行替换,实现对源代码中判断逻辑的混淆。使得本发明相较于现有混淆变量名的方式,在不影响源代码正常运行的情况下,提高了在反编译时对源代码的理解难度。同时,基于java语言规范与虚拟机规范间的差异性,通过对经过替换操作后获得的初始class文件进行同名化处理,使得获得的目标class文件可以满足虚拟机规范并被正常运行。但对其进行反编译后无法获得满足java语言规范的源代码,且获得的源代码不具备可读性。这使得本发明相较于现有技术,在class文件送入虚拟机进行运行时,无需将class
文件恢复为java语法标准可读状态,即可实现class文件的正常运行,从而降低了被反编译的风险。可见,本发明可以防止java源代码被反编译。
45.当然,实施本发明的任一产品或方法必不一定需要同时达到以上所述的所有优点。
附图说明
46.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
47.图1为本发明实施例提供的一种防止反编译的方法的流程图;
48.图2为本发明实施例提供的一种防止反编译的系统的框图;
49.图3为本发明实施例提供的一种防止反编译的装置的框图。
具体实施方式
50.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
51.本发明实施例提供了一种防止反编译的方法,如图1所示,该方法包括:
52.s101、在初始源代码中添加第一预设成员变量和第二预设成员变量,获得第一目标源代码,其中,第一预设成员变量和第二预设成员变量不同。
53.可选的,在本发明的一个可选实施例中,上述初始源代码可以是由程序设计人员按照程序设计语言规范编辑完毕后,未进行编译的文本文件。其中,上述程序设计语言规范可以是java语言规范。可选的,在本发明的另一个可选实施例中,上述预设成员变量可以是对java语言中,用于执行判断逻辑的数据类型的变量内容进行定义的变量。其中,上述执行判断逻辑的数据类型可以是布尔值类型。由于java的语言规范只允许兼容两种布尔值类型,且只有数量大于一个的布尔值类型才能实现混淆判断逻辑的效果,因此上述预设成员变量的个数有且仅有两个。
54.具体的,在实际应用中,上述在初始源代码中添加第一预设成员变量和第二预设成员变量的具体实施方式,可以是利用预设代码添加算法,以静态字段方式表示的上述第一预设成员变量和第二预设成员变量,添加至初始源代码的类中。本发明对上述预设成员变量的具体添加位置不作过多限定,以实际应用场景为准。
55.本领域技术人员可以理解的是,由于java的语言规范规定源代码中同一个类的成员变量的类型可以相同,但名称不可以相同。因此,在设定上述第一预设成员变量和第二预设成员变量时,其数据类型可以分别为boolean和boolean,且其数据名不同。其中,boolean是java中的布尔型数据类型,而boolean是boolean的封装类。本发明通过上述设定,使得设定的第一预设成员变量和第二预设成员变量是满足java语言规范的两种布尔值类型,不影响源代码的正常运行。
56.s102、识别第一目标源代码中各判断逻辑代码块的布尔表达式。
57.其中,代码块是在源代码中,由多行代码封装在一起的实现特定功能的独立代码区。
58.可选的,在本发明的一个可选实施例中,上述判断逻辑代码块可以是上述第一目标源代码中,基于布尔值实现分支流程控制的代码块。例如,将关键字为if、while和for等用于判断逻辑的代码块,确定为判断逻辑代码块。
59.可选的,在本发明的另一个可选实施例中,上述布尔表达式(boolean expression)在java中,是判断逻辑值只能取真值或假值的一段代码声明。布尔表达式取的判断逻辑值表征了代码的判断逻辑。
60.s103、利用第一预设成员变量和第二预设成员变量,按照预设替换规则,对布尔表达式执行替换操作,获得第二目标源代码。
61.可选的,在本发明的一个可选实施例中,上述如图1所示的步骤s103的具体实施方式,可以采用赋值的方式,将布尔表达式的判断逻辑值赋值给对应的预设成员变量,从而在后续程序的运行中,以预设成员变量来代替布尔表达式完成判断逻辑代码块的逻辑判断。由于预设成员变量的变量名可以自行设定,并不直接体现判断逻辑条件的内容。
62.因此,本发明通过利用预设成员变量对布尔表达式进行替换的方式,可以实现对源代码中判断逻辑的混淆。即使操作人员通过反编译获得源代码,所得到的也只是经过替换操作后的第二目标源代码,其中的判断逻辑值仅是自行设定的预设成员变量的变量名,且经过后续同名化处理后,操作人员仍旧无法获得具体的判断逻辑,从而提高了对java源代码进行保护的安全性。
63.s104、编译第二目标源代码,获得初始class文件。
64.可选的,在本发明的一个可选实施例中,上述如图1所示的步骤s104可以通过预设编译程序来实现,也可以通过编译器来实现,本发明对此不作过多限定。
65.s105、按照预设常量同名化规则,对初始class文件进行同名化处理,获得目标class文件。
66.可选的,在本发明的一个可选实施例中,上述同名化处理,可以是将上述初始class文件的常量池中的各判断逻辑常量的常量名称进行统一。
67.例如,假设初始class文件的常量池中有两个判断逻辑常量:甲和乙。现对甲和乙进行上述同名化处理,设定将常量名统一为“甲”。则经过上述同名化处理后得到的目标class文件,其中的判断逻辑常量名称均为“甲”。
68.此时,在操作人员根据目标class文件进行反编译时,由于反编译获得源代码需要满足java语言规范。而java语言规范规定源代码中成员变量的名称不可以相同。显然,由目标class文件进行反编译获得的源代码不满足java语言规范,这导致编译器在进行反编译时会提示报错,必须纠正错误才可以正常编译。但是,由于如图1所示的步骤s105中的目标class文件是对初始class文件进行同名化处理后获得的,而初始class文件是由第二目标源代码编译获得的,第二目标源代码中的判断逻辑值已被第一预设成员变量和第二预设成员变量替换,这导致操作人员无法区分第二目标源代码中,逻辑代码块的判断逻辑值源自哪个布尔表达式。进而使得操作人员无法确认该判断逻辑值得真假,也无法确认各逻辑代码块的业务逻辑,从而防止了源代码被反编译。
69.可选的,在本发明的另一个可选实施例中,由于class文件需要在虚拟机中运行才可以实现设定的功能,因此,class文件需要满足虚拟机规范才可以被运行。由于虚拟机规范规定,只要class文件中的常量类型或常量名有一个不同,则该class文件满足规范,可以被虚拟机运行。而上述目标class文件,虽然其中的判断逻辑常量的常量名相同,但是其常量类型不同。可见,上述目标class文件满足虚拟机规范,可以被正常运行。
70.本发明利用预设成员变量对布尔表达式进行替换,实现对源代码中判断逻辑的混淆。使得本发明相较于现有混淆变量名的方式,在不影响源代码正常运行的情况下,提高了在反编译时对源代码的理解难度。同时,基于java语言规范与虚拟机规范间的差异性,通过对经过替换操作后获得的初始class文件进行同名化处理,使得获得的目标class文件可以满足虚拟机规范并被正常运行。但对其进行反编译后无法获得满足java语言规范的源代码,且获得的源代码不具备可读性。这使得本发明相较于现有技术,在class文件送入虚拟机进行运行时,无需将class文件恢复为java语法标准可读状态,即可实现class文件的正常运行,从而降低了被反编译的风险。可见,本发明可以防止java源代码被反编译。
71.可选的,上述获取第一目标源代码中各判断逻辑代码块的布尔表达式,包括:
72.遍历第一目标源代码,对第一目标源代码中的各代码块:根据预设目标代码块识别规则,判断该代码块中是否存在判断逻辑代码,若是,则将该代码块确定为判断逻辑代码块。
73.识别各判断逻辑代码块的布尔表达式。
74.需要说明的是,在实际应用中,上述识别各判断逻辑代码块的布尔表达式的实施方式有多种,在此示例性的提供一种:
75.根据确定的判断逻辑代码块的关键字,查找该关键字的java语法结构。并根据该语法结构,确定布尔表达式在上述判断逻辑代码块中的位置。
76.例如:在判断逻辑代码块的关键字为if的情况下,从预设数据库中查找if语句的语法结构。if语句的语法结构为:if(布尔表达式){业务逻辑}。则由该语法结构可以定位小括号内的内容为布尔表达式,其中,布尔表达式表征了该判断代码块的判断逻辑。
77.可选的,上述判断逻辑代码可以是用于判断逻辑的关键字。例如if、while和for。
78.可选的,布尔表达式分为第一类型和第二类型,第一类型的布尔表达式是无法被拆分为子表达式的布尔表达式,第二类型与第一类型不同,利用第一预设成员变量和第二预设成员变量,按照预设替换规则,对布尔表达式执行替换操作,获得第二目标源代码,包括:
79.在布尔表达式的类型为第一类型时,按照预设替换规则,将第一布尔表达式赋值于第一预设成员变量,并将第一布尔表达式替换为第一预设成员变量的变量名,将第二布尔表达式赋值于第二预设成员变量,并将第二布尔表达式替换为第二预设成员变量的变量名,获得第二目标源代码,其中,第一布尔表达式和第二布尔表达式不同,第一布尔表达式和第二布尔表达式不在同一个判断逻辑代码块中。
80.可选的,在本发明的一个可选实施例中,上述第一类型和第二类型的布尔表达式的判断方式,可以通过判断该布尔表达式中是否包含特定java逻辑运算符来实现。若包含特定java逻辑运算符,则将该布尔表达式确定为第二类型的布尔表达式。若不包含特定java逻辑运算符,则将该布尔表达式确定为第一类型的布尔表达式。
81.需要说明的是,上述特定java逻辑运算符仅限于:“&&”,“&”,“|”和“||”。其中“&&”和“&”均表示逻辑“且”,“|”和“||”表示逻辑“或”。
82.可选的,在本发明的另一个可选实施例中,预设成员变量可以由变量类型和变量名构成。上述第一预设成员变量与第二预设成员变量的变量类型不同,上述第一预设成员变量与第二预设成员变量的变量名也不同。
83.为了便于对上述在布尔表达式的类型为第一类型时,利用第一预设成员变量和第二预设成员变量,按照预设替换规则,将第一布尔表达式赋值于第一预设成员变量,并将第一布尔表达式替换为第一预设成员变量的变量名,将第二布尔表达式赋值于第二预设成员变量,并将第二布尔表达式替换为第二预设成员变量的变量名,获得第二目标源代码的实施过程的理解,在此特结合本发明的一个可选实施例进行说明:
84.假设现有第一目标源代码包括两个关键字为if的判断逻辑代码块:
85.if(old==true);if(man==true)。
86.其中,“old==true”是布尔表达式1,该布尔表达式1所在的判断逻辑代码块的代码逻辑是“判断是否是老人”。“man==true”是布尔表达式2,该布尔表达式2所在的判断逻辑代码块的代码逻辑是“是否是男人”。
87.设定第一预设成员变量的变量类型为boolean,变量名为x。设定第二预设成员变量的变量类型为boolean,变量名为y。
88.则按照预设替换规则,将布尔表达式1替换为第一预设成员变量的变量名,将布尔表达2式替换为第二预设成员变量的变量名。该替换操作的具体实施方式,可以是通过赋值的方式:令“x=old==true,并将布尔表达式1:old==true替换为x”,令“y=man==true,并将布尔表达式2:man==true替换为y”。则经过上述替换操作后获得的第二目标源代码是:
89.x=old==true;y=man==true;if(x);if(y)。
90.可选的,对于经过上述替换操作后获得的第二目标源代码,在该第二目标源代码经过如图1所示的步骤s104和步骤s105处理后,获得的目标class文件的源代码可以被修改为:
91.x=old==true;x=man==true;if(x);if(x)。
92.或:y=old==true;y=man==true;if(y);if(y)。
93.可见,通过上述操作,隐藏了初始源代码中的判断逻辑。即使操作人员对经过同名化处理后的class文件强制反编译,获得上述第二目标源代码,其依旧无法确定初始源代码的判断逻辑。从而,使得操作人员无法理解强制反编译后获得源代码。
94.可选的,上述利用第一预设成员变量和第二预设成员变量,按照预设替换规则,对布尔表达式执行替换操作,获得第二目标源代码,还包括:
95.在布尔表达式的类型为第二类型时,将布尔表达式拆分为第一子布尔表达式和第二子布尔表达式。
96.按照预设替换规则,将第一子布尔表达式赋值于第一预设成员变量,并将第一子布尔表达式替换为第一预设成员变量的变量名,将第二子布尔表达式进行取反操作后赋值于第二预设成员变量,并将第二子表达式替换为经过取反操作后的第二预设成员变量的变量名,获得第二目标源代码,其中,第一子布尔表达式和第二子布尔表达式在同一个判断逻
辑码块中。
97.可选的,在本发明的一个可选实施例中,上述在布尔表达式的类型为第二类型时,将布尔表达式拆分为第一子布尔表达式和第二子布尔表达式的具体实施方式,可以是通过定位特定java逻辑运算符,从而将该逻辑运算符左右两侧的表达式分别确定为第一子布尔表达式和第二子布尔表达式。需要说明的是,本发明对将逻辑运算符哪一侧的表达式确定为第一子布尔表达式,哪一侧的表达式确定为第二子布尔表达式,不做过多限定,以实际应用场景为准。
98.可选的,在本发明的另一个可选实施例中,上述取反操作可以是通过在子布尔表达式和变量名前,添加逻辑运算符“!”来实现。通过上述取反操作,可以在保证代码逻辑正确的同时,增加进行反编译的人员的代码理解难度。
99.为了便于对上述在布尔表达式的类型为第二类型时,利用第一预设成员变量和第二预设成员变量,按照预设替换规则,对布尔表达式执行替换操作,获得第二目标源代码的实施过程的理解,在此特结合本发明的一个可选实施例进行说明:
100.假设现有第一目标源代码包括一个关键字为if的判断逻辑代码块:
101.boolean old=is old;boolean man=is man;if(man&&old)。
102.其中,&&表示逻辑“且”。则该判断逻辑代码块的布尔表达式“man&&old”的代码逻辑为“是男人且是老人”。
103.由此判断,该布尔表达式“man&&old”为上述第二类型的布尔表达式,需要将其拆分为第一子布尔表达式“man”,和第二子布尔表达式“old”。
104.按照预设替换规则,将第一子布尔表达式赋值于x:x=man。并将第一子布尔表达式替换为第一预设成员变量的变量名。将第二子布尔表达式进行取反操作后赋值于y:y=!(old)。并将第二子布尔表达式替换为经过取反操作后的第二预设成员变量的变量名。则经过上述操作后,获得的第二目标源代码为:
105.x=man;y=!(old);if(x&&!y)。
106.可选的,对于经过上述替换操作后获得的第二目标源代码,在该第二目标源代码经过如图1所示的步骤s104和步骤s105处理后,获得的目标class文件的源代码可以被修改为:
107.if(x&&!x),或if(y&&!y)。
108.从而隐藏初始源代码中的判断逻辑,使得操作人员无法理解强制反编译后获得源代码。
109.可选的,按照预设常量同名化规则,对初始class文件进行同名化处理,获得目标class文件,包括:
110.根据第一预设成员变量的变量名,在初始class文件的常量池中查找与第一预设成员变量的变量名匹配的字符串常量,将字符串常量的字符串内容替换为第二预设成员变量的变量名;
111.或,根据第二预设成员变量的变量名,在初始class文件的常量池中查找与第二预设成员变量的变量名匹配的字符串常量,将字符串常量的字符串内容替换为第一预设成员变量的变量名。
112.需要说明的是,在实际应用中,上述按照预设常量同名化规则,对初始class文件
进行同名化处理的实施方式有多种,在此示例性的提供一种:
113.现设定将第二预设成员变量的变量名替换为第一预设成员变量的变量名。
114.基于java虚拟机规范对class文件格式的设定,获取与第二预设成员变量的变量类型匹配的标识符。
115.根据该标识符,遍历初始class文件的常量池,查找与该表示符匹配的,且数据类型为字符串类型的常量。
116.将该字符串常量的字符串内容,替换为第一预设成员变量的变量名,并进行保存。
117.将经过上述同名化处理后的初始class文件,确定为目标class文件。
118.经过上述同名化处理后获得的目标class文件,其源代码中的布尔表达式的变量名均相同,而变量类型不同,因此,虽然该目标class文件可以被虚拟机正常运行,但其源代码已不满足java语言规范的要求。在对目标class文件进行反编译时,会产生编译错误的提示,导致反编译失败。且由于目标class文件的源代码中的布尔表达式所表达的判断逻辑,已通过替换操作被混淆为预设成员变量的变量名,这导致反编译出的代码可读性差。当目标class文件中包括大量的类或大量的复杂判断逻辑时,操作人员无法根据反编译出的部分代码推断出正确的判断逻辑,从而实现了防止反编译。
119.与上述方法实施例相对应的,本发明还提供了一种防止反编译的系统,如图2所示,该系统包括:
120.变量添加模块201,用于在初始源代码中添加第一预设成员变量和第二预设成员变量,获得第一目标源代码,其中,第一预设成员变量和第二预设成员变量不同。
121.表达式获取模块202,用于识别第一目标源代码中各判断逻辑代码块的布尔表达式。
122.表达式替换模块203,用于利用第一预设成员变量和第二预设成员变量,按照预设替换规则,对布尔表达式执行替换操作,获得第二目标源代码。
123.编译模块204,用于编译第二目标源代码,获得初始class文件。
124.同名化处理模块205,用于按照预设常量同名化规则,对初始class文件进行同名化处理,获得目标class文件。
125.可选的,上述表达式获取模块202被设置为:
126.遍历第一目标源代码,对第一目标源代码中的各代码块:根据预设目标代码块识别规则,判断该代码块中是否存在判断逻辑代码,若是,则将该代码块确定为判断逻辑代码块。
127.识别各判断逻辑代码块的布尔表达式。
128.可选的,上述表达式替换模块203被设置为:
129.在布尔表达式的类型为第一类型时,按照预设替换规则,将第一布尔表达式赋值于第一预设成员变量,并将第一布尔表达式替换为第一预设成员变量的变量名,将第二布尔表达式赋值于第二预设成员变量,并将第二布尔表达式替换为第二预设成员变量的变量名,获得第二目标源代码,其中,第一布尔表达式和第二布尔表达式不同,第一布尔表达式和第二布尔表达式不在同一个判断逻辑代码块中。
130.可选的,上述表达式替换模块203还被设置为:
131.在布尔表达式的类型为第二类型时,将布尔表达式拆分为第一子布尔表达式和第
二子布尔表达式。
132.按照预设替换规则,将第一子布尔表达式赋值于第一预设成员变量,并将第一子布尔表达式替换为第一预设成员变量的变量名,将第二子布尔表达式进行取反操作后赋值于第二预设成员变量,并将第二子表达式替换为经过取反操作后的第二预设成员变量的变量名,获得第二目标源代码,其中,第一子布尔表达式和第二子布尔表达式在同一个判断逻辑码块中。
133.可选的,上述同名化处理模块205被设置为:
134.根据第一预设成员变量的变量名,在初始class文件的常量池中查找与第一预设成员变量的变量名匹配的字符串常量,将字符串常量的字符串内容替换为第二预设成员变量的变量名。
135.或,根据第二预设成员变量的变量名,在初始class文件的常量池中查找与第二预设成员变量的变量名匹配的字符串常量,将字符串常量的字符串内容替换为第一预设成员变量的变量名。
136.本发明实施例提供了一种防止反编译的装置,如图3所示,该装置包括:
137.处理器301;
138.用于存储处理器301可执行指令的存储器302。
139.其中,处理器301被配置为执行指令,以实现上述如图1所示的一种防止反编译的方法。
140.本发明实施例提供了一种计算机可读存储介质,当计算机可读存储介质中的指令由防止反编译的装置的处理器执行时,使得防止反编译的装置能够执行上述如图1所示的一种防止反编译的方法。
141.存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram),存储器包括至少一个存储芯片。存储器是计算机可读介质的示例。
142.计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
143.本领域技术人员应明白,本技术的实施例可提供为方法、系统或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
144.需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存
在任何这种实际的关系或者顺序。还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
145.本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
146.以上仅为本技术的实施例而已,并不用于限制本技术。对于本领域技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本技术的权利要求范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1