Java jar 如何防止被反编译?代码写的太烂,害怕被人发现

java作为解释型的语言,其高度抽象的特性意味其很容易被反编译,容易被反编译,自然有防止反编译措施存在。今天就拜读了一篇相关的文章,受益匪浅,知彼知己嘛!!之所以会对java的反编译感兴趣,那是因为自己在学习的过程中,常常需要借鉴一下别人的成果(你懂的...)。或许反编译别人的代码不怎么道德,这个嘛......

废话不多说,正文如下:

常用的保护技术

由于Java字节码的抽象级别较高,因此它们较容易被反编译。本节介绍了几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已,因为这些方法都有自己的使用环境和弱点。

隔离Java程序

最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式。例如,开发人员可以将关键的Java Class放在服务器端,客户端通过访问服务器的相关接口来获得服务,而不是直接访问Class文件。这样黑客就没有办法[反编译Class文件。目前,通过接口提供服务的标准和协议也越来越多,例如 HTTP、Web Service、RPC等。但是有很多应用都不适合这种保护方式,例如对于单机运行的程序就无法隔离Java程序。这种保护方式见图1所示。

图片

对Class文件进行加密

为了防止Class文件被直接反编译,许多开发人员将一些关键的Class文件进行加密,例如对注册码、序列号管理相关的类等。在使用这些被加密的类之前,程序首先需要对这些类进行解密,而后再将这些类装载到JVM当中。这些类的解密可以由硬件完成,也可以使用软件完成。

在实现时,开发人员往往通过自定义ClassLoader类来完成加密类的装载(注意由于安全性的原因,Applet不能够支持自定义的 ClassLoader)。自定义的ClassLoader首先找到加密的类,而后进行解密,最后将解密后的类装载到JVM当中。在这种保护方式中,自定义的ClassLoader是非常关键的类。由于它本身不是被加密的,因此它可能成为黑客最先攻击的目标。如果相关的解密密钥和算法被攻克,那么被加密的类也很容易被解密。这种保护方式示意图见图2。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用IntelliJ IDEA将整个JAR反编译Java代码,可以按照以下步骤操作: 1. 在IntelliJ IDEA中打开一个新项目。 2. 将JAR包复制到项目的根目录下。 3. 在项目根目录下创建一个新的文件夹,用于存放反编译后的Java代码。 4. 在IntelliJ IDEA的菜单栏中,选择File -> Project Structure。 5. 在Project Structure对话框中,选择Modules,然后点击加号图标,选择“Import JAR or AAR Package”选项。 6. 选择要反编译JAR包,然后点击“OK”按钮。 7. 在Modules列表中,找到导入的JAR包,并将其展开。 8. 右键点击“src”文件夹,选择“New” -> “Directory”,并创建一个新的文件夹,用于存放反编译后的Java代码。 9. 右键点击刚刚创建的文件夹,选择“New” -> “Java Class”,并创建一个新的Java类。 10. 在新的Java类中,输入以下代码: ``` public static void main(String[] args) throws IOException { String jarFilePath = "path/to/jar/file.jar"; // 替换为实际的JAR文件路径 String outputDirPath = "path/to/output/dir"; // 替换为实际的输出目录路径 try (JarFile jarFile = new JarFile(jarFilePath)) { Enumeration<JarEntry> entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); if (!entry.isDirectory()) { File outputFile = new File(outputDirPath, entry.getName()); outputFile.getParentFile().mkdirs(); try (InputStream input = jarFile.getInputStream(entry); OutputStream output = new FileOutputStream(outputFile)) { byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = input.read(buffer)) != -1) { output.write(buffer, 0, bytesRead); } } } } } } ``` 11. 替换代码中的“jarFilePath”和“outputDirPath”为实际的JAR文件路径和输出目录路径。 12. 运行该Java类,IntelliJ IDEA会将JAR包中的所有class文件反编译Java代码,并保存到指定的输出目录中。 注意:反编译后的Java代码可能不完整或有误,这取决于JAR包中的class文件是否被混淆等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值