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简介:)

参考文章来源:

  1. Java| 编译和反编译(内含)
  2. 一些防止java代码被反编译的方法

完结,撒花~
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值