Java编译和反编译
编程语言
低级语言(Low-level Language):计算机直接使用的语言,机器语言和汇编语言等。
高级语言(Low-level Language):利用计算机指令的抽象表示——语句,来编写程序,更偏向于人类易懂,例如,C,C++,Java,python等。
编译
将人类更易懂的语言,转变为机器能够解读和运行的低级语言,其过程成为编译,而处理这一工作的工具成为编译器。
Java中负责编译的编译器是命令javac
。javac将Java程序编译为class文件,而此文件只是JVM识别,而非机器语言,因此,需要JVM将class字节码转换成机器语言。
反编译
将编译好的文件转换为源文件,称为反编译。Java中反编译是指将class字节码文件转换为Java文件。
反编译工具
Javap
可以反编译,也可以查看字节码。Javap
反编译的结果是更易于读的字节码,只是将String转化为hashcode。字节码可以暴露的信息是最多的,所以Javap适合用于分析底层原理使用。
JAD(需下载执行工具)
反编译之后,是标准的java源代码,但是很久不更新了,目前全面支持Java7之前生成的字节码,Java7之后会有部分不支持。
CFR(需下载执行工具)
与JAD类似,但是支持所有Java版本的字节码,有许多参数可以使用。
--decodestringswitch
表示对于switch支持string的细节进行解码。类似的还有
--decodeenumswitch
、--decodefinally
、--decodelambdas
等。
--decodelambdas
可以对lambda表达式进行反编译。CFR还有很多其他参数,均用于不同场景,读者可以使用
java -jar cfr_0_125.jar --help
进行了解。这里不逐一介绍了。
JadClipse
Eclipse中的JAD插件,需要net.sf.jadclipse_3.3.0.jar
插件jar和JAD.exe
反编译软件。
相关资源
在线反编译:
http://www.javadecompilers.com/ (支持选择多种反编译器)
http://javare.cn/
资源下载:
https://varaneckas.com/jad/ (JAD支持各种平台)
http://jd.benow.ca/ (JD相关)
https://baike.xsoftlab.net/view/264.html (JD-GUI)
http://www.benf.org/other/cfr/ (CFR)
http://jadclipse.sourceforge.net/wiki/index.php/Main_Page (JadClipse:Eclipse插件,也可以通过配置外部的Jad来在Eclipse中实现反编译)
防止反编译
以下介绍几种防止反编译的方法,但是这些方法都不能绝对防御,只能加大反编译难度。
隔离Java程序
最简单的方式就是让用户无法直接访问到Java Class程序。例如客户端通过访问服务器的相关解耦来获得服务,而非直接访问Class文件,像HTTP,Web Service等。
对Class文件进行加密
对一些关键的Class文件加密,使用的时候,先进行解密,再将期装载到JVM中。一般情况下,开发人员会自定义ClassLoader来完成类加载,ClassLoader找到加密类进行解密,再装载到JVM中。
这种方式中,ClassLoader是解密的关键,所以可能会被首先攻击,一旦破解, 此种方式就会被轻易破解。
转换为本地代码
将程序装换成难以破解的本地代码,可将应用整个转换为本地代码,也可以转换部分,但是如果部分转换,需要使用JNI技术进行调用。为了保护这些代码不被修改和替换,需要进行数字签名,使用时先进行认证,确保无误后,调用相关JNI方法。
这种方法是需要用丧失Java跨平台性为代价的,不同平台本地代码不同,维护增加了工作量。
代码混淆
对Class文件进行重新组织和处理,使得处理后的代码与处理前的代码具有完全相同的功能,但很难被反编译。
到目前为止,混淆技术是最基本的Java程序保护方法,目前混淆工具比较成功的包括JProof公司的1stBarrier系列、Eastridge公司的JShrink和4thpass.com的SourceGuard等。主要的混淆技术分为以下几类:
-
符号混淆
将许多与程序执行无关的符号(例如方法名称、参数名称、变量名称等)打乱,这些符号往往具备一定的含义,因此需要替换为无意义的表示。
但是有些方法、变量是需要外部引用和访问的,这些符号就不能被混淆,因此很多混淆工具提供了丰富的选项。
-
数据混淆
对程序使用的数据进行混淆,分为两种:改变数据存储和编码以及改变数据访问。
-
改变数据存储和编码
可以打乱程序使用的数据存储方式。例如将10个成员的数组,拆分为10个变量;将二维数组转换为一维数组。
-
改变数据访问
例如访问数组下标时,进行一定量的计算。
实际使用过程中,这两种方法是混合使用的。
-
-
控制混淆
-
增加混淆控制
增加额外的、复杂的控制流,将原来的语义隐藏起来。如下图
A,B顺序执行,可以在A,B中增加判断控制条件,已决定B的执行,但是无论如何增加,B是一定要执行的。
-
控制流重组
重组控制流,例如将一个循环控制流转化为递归,或者将多个控制流整合成一个等。
-
-
预防性混淆
针对于反编译器设计的,对于不同反编译器作用不同。
反编译软件(JAD,JadClipse,JD-GUI,CRF)打包下载
参考链接:
http://www.admin10000.com/document/5064.html (7款开源Java反编译工具:)
https://blog.csdn.net/chenchunlin526/article/details/78259682 (反编译工具对比)
http://53873039oycg.iteye.com/blog/2015192(工具CFR,Procyon简介:)
参考文章来源:
完结,撒花~