当前位置: 首页 > 科技观察

这是什么代码,看不懂,,

时间:2023-03-19 16:38:25 科技观察

大家好,我说的是北军。今天就和大家一起学习java中的代码混淆技术。以后还可以让自己的代码不再暴露,让人很容易窥探到代码混淆技术。当你需要读取jar文件的内容时,可能会使用一些反编译工具,比如jd-gui,但是你有没有遇到过反编译出来的内容和想象中的不一样,但是引用jar是正常的通常情况下?一开始,前段时间使用docx4j库操作.docx文件,进行一些复杂的操作,比如合并多个docx文件。在网上找了很多方法,发现最后生成的文件有很多冗余的内容,导致原本几兆的文件合并成了几十兆。我记得docx4j官网有办法提供商业版的。我打算窥探它的源代码来研究它。然而,当我下载了jar打开之后,一头雾水……我们知道的介绍一般情况下,编译打包后的jar文件可以通过反编译工具看到jar中的接口、类、方法可以被编辑,使得相关代码实现容易被模仿,企业的核心代码很可能被窃取。尤其是一些具有很强保密性或商业性的行业软件,当它被打入jar并反编译时,就像开源一样。然后,通过在字节码级别对class文件进行混淆加密,可以在一定程度上防止该技术被模仿或重用,从而对java软件起到很好的保护作用。实现方法对类文件进行了加密,但在加载类时需要特定的Classloader对其进行解密。对于class文件的反编译原理,防止文件被消费指令反编译。基于代码混淆技术,对代码中的包、类、方法等名称进行混淆,增加代码阅读成本实例今天主要介绍实现代码混淆的第三种方法。这里主要使用proguard工具对应的maven插件proguard-maven-plugin:Proguard是一个Java类文件压缩器、优化器、Obfuscator、prevalidator。缩小阶段检测并删除未使用的类、字段、方法和属性。优化部分对方法的字节码进行分析和优化。混淆过程使用无意义的短变量重命名类、变量和方法。这些步骤使代码更精简、更高效,也更难被逆向(破解)。比如我们基于Restful开发一个用户服务接口,你的项目结构可能是这样的:packages...├entity|├用户├dao|├用户道|├实施|├UserDaoImpl├服务|├用户服务|├实施|├UserServiceImpl├网站|├UserController通过命令mvnpackage打包后,结构如下:现在引入proguard:需要在pom.xml中的build标签中添加插件,具体配置如下:com.github.wvengenproguard-maven-plugin2.6.0packageproguardtrue${project.build.finalName}.jar${project.build.finalName}-pg.jartrue${project.basedir}/proguard.cfgpg${java.home}/lib/rt.jar!META-INF/**${项目。basedir}/target配置文件proguard.cfg所在的地方如下:#SpecifyJavaVersion-target1.8#proguard会对代码进行优化压缩,他会删除不用的类或者类成员变量等-dontshrink#是否关闭字节码级优化,如果不关闭,设置如下配置不生成大小写混写的类名,默认是case-mixed-dontusemixedcaseclassnames#对类成员的命名采取独特的混淆策略-useuniqueclassmembernames#混淆时不生成大小写混合的类名,默认是case-mixed-dontusemixedcaseclassnames#After混淆类名,替换掉使用Class.forName('className')的地方-adaptclassstrings#保留异常和注解信息-keepattributesExceptions,InnerClasses,Signnature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod#这个选项会保存界面中的所有原始名称(不混淆)-->#-keepnamesinterface**{*;}#这个选项会保存所有包的所有原始接口文件(不会混淆)#-keepinterface*extends*{*;}#保留参数名,因为如果controller或者Mybatis接口的参数混淆了,就不能接受参数,xml文件也找不到参数-keepparameternames#保留枚举成员和方法-keepclassmembersenum*{*;}#不要混淆所有类,保存原始定义注解--keepclassmembersclass*{@org.springframework.context.annotation.Bean*;@org.springframework.beans.factory.annotation.Autowired*;@org.springframework.beans.factory.annotation.Value*;@org.springframework.stereotype.Service*;@org.springframework.stereotype.Component*;}#忽略warn消息-ignorewarnings#忽略note消息-dontnote#打印配置信息-printconfiguration执行打包命令mvcpackage,可以看到target目录下增加了几个文件obfuscation-pg.jar,并输出jarproguard_map。混淆处理后的txt存放混淆前后的类和方法对应关系proguard_seed.txt存放不变的类。可见包的名称和类名称更改为短字母。目前的技术中通过proguard混淆class内容还是比较简单的。当然还有很多其他的技术手段,比如上面提到的类加密这种比较安全的技术手段。有兴趣的可以继续探索其他技术JockyretroguardandroidkillerClassFinal结语本文简单介绍java中的代码混淆技术。我们可以根据具体的项目需求,对编译后的代码进行混淆或加密,以保护我们的劳动成果。最开始看到的docx4j企业级功能提供的jar是专门实现代码保护的。目前我还没有找到是用什么技术来实现的。以后会继续研究的。