三亚高端服务网站,阿里云服务器的网站备案流程图,产品营销策略有哪些,最新国际军事动态和军事战争 代码混淆一.基本概念java的bytecode很容易通过JAD等反编译工具还原出源代码。这样势必不满足安全的定义。如何一定程度上保护需要防止被反编译的源代码呢#xff1f;混淆#xff08;obfuscate#xff09;技术。注意#xff1a;用obfuscate防盗版是根本不可能#xff0c… 代码混淆一.基本概念java的bytecode很容易通过JAD等反编译工具还原出源代码。这样势必不满足安全的定义。如何一定程度上保护需要防止被反编译的源代码呢混淆obfuscate技术。注意用obfuscate防盗版是根本不可能连汇编这种东西都能被**掉而java代码基本上等同于开源的同义词。用obfuscate只是为了增加反编译的难度保护源代码的知识产权。混淆包照常运行没有任何问题。可以使用反编译工具如jd-gui查看混淆后的包验证混淆效果。
二.混淆技术名称混淆 name obfuscode将有意义的类字段、方法名称更改为无意义的字符串。生成的新名称越 短字节代码越小。在名称混淆的字节代码中包类字段和方法名称已重命名并且永远不能恢复原始名称。
流混淆 Flow Obfuscation用于if, switch, while,for等关键字对字节码进行细微的修改模糊控制流而不改变代码在运行时的行为。通常情况下选择和循环等逻辑构造会被更改因此它们不再具有直接等效的Java源代码。流模糊的字节码通常强制反编译器将一系列标签和非法的goto语句插入到它们生成的源代码中。源代码有时会因为反编译错误而变得更加模糊。
其他异常混淆 Exception Obfuscation字符串加密混淆 String Encryption引用混淆 Reference Obfuscation三.常用工具1.ipaguardproguard是一个免费的 混淆重签名优化混肴器。不需要ios app源码直接对ipa文件进行混淆加密。可对IOS ipa 文件的代码代码库资源文件等进行混淆保护。 可以根据设置对函数名、变量名、类名等关键代码进行重命名和混淆处理降低代码的可读性增加ipa破解反编译难度。可以对图片资源配置等进行修改名称修改md5。只要是ipa都可以不限制OCSwiftFlutterReact NativeH5类app
官网地址IpaGuard官网--IOS 应用程序ipa文件混淆加密保护工具
2.yGuardyGuard是一款免费的Java混淆器非开源它有Java和.NET两个版本。yGuard 完全免费基于 Ant 任务运行提供高可配置的混淆规则。官网地址www.yworks.com/products/yg…
3.allatori第二代Java混淆器。所谓第二代混淆器不仅仅能进行字段混淆还能实现流混淆。命名混淆流混淆调试信息混淆字符串编码以及水印技术。对于教育和非商业项目来说这个混淆器是免费的。支持war和jar格式支持对需要混淆代码的应用程序添加有效日期。官网地址www.allatori.com/…
4.总结推荐使用 proguard 开源 使用简单 文档丰富完善。
四.工具对比工具 官网地址 官方文档 开源免费 名称混淆 流混淆 maven支持 功能proguard www.guardsquare.com/proguard www.guardsquare.com/manual/home √ √ ✕ √ yGuard www.yworks.com/products/yg… yworks.github.io/yGuard/ √ √ ✕ √ allatori allatori.com/ ✕免费用于教育和非商业项目 √ √ √ 减小包大小混淆代码添加水印五.详细内容1.yGuardyworks.github.io/yGuard/易于设置yGuard 是一个 Ant 任务作为 Ant 任务yGuard 可以无缝集成到您在 Ant、Maven 和 Gradle 等众多构建系统中的部署过程中高级收缩yGuard 通过依赖分析提供精细的代码收缩功能。可配置/安全代码yGuard 提供高度可配置的名称混淆可保护您的知识产权免受逆向工程。开源yGuard 是完全开源的与昂贵的商业产品相反yGuard 是并且永远都是免费的。Java 兼容性要运行 yGuard 软件您需要 JDK 1.7.x 或更高版本以及 Ant 1.5.x 或更高版本它可能与任一软件的早期版本兼容但尚未经过测试。yGuard 与所有已发布的 Java 版本最高 Java 17兼容。但是根据使用的版本功能可能会略有不同。该文档包含不同版本支持的功能的详细说明。如果您打算将 yGuard 与 Java 以外的东西一起使用还有一个关于3rd 方 JVM 支持的部分。ProGuard是一个开源的 Java 类文件收缩器、优化器、混淆器和预验证器。因此ipaguard处理的应用程序和库更小、更快并且在一定程度上可以抵御逆向工程。
收缩步骤检测并删除未使用的类、字段、方法和属性。优化器 步骤优化字节码并删除未使用的指令。混淆步骤使用简短无意义的名称重命名剩余的类、字段和方法。最后的预验证步骤将预验证信息添加到类中这是 Java Micro Edition 和 Java 6 及更高版本所必需的。yGuard1.maven引用方式build plugins plugin !--结合ant run 来使用yguard -- artifactIdmaven-antrun-plugin/artifactId dependencies dependency groupIdcom.yworks/groupId artifactIdyguard/artifactId version3.1.0/version /dependency /dependencies executions execution phasepackage/phase goals goalrun/goal /goals configuration tasks property refidmaven.compile.classpath namemvn.classpath/ !-- echo messageUsing Maven Classpath: ${mvn.classpath} / -- taskdef nameyguard classnamecom.yworks.yguard.YGuardTask/ yguard !-- yguard配置 -- /yguard /tasks /configuration /execution /executions /plugin /plugins /build复制代码
2.yguard配置解析写在前面yguard共分为两大任务配置rename 混淆名称 主要用于修改类名属性名方法名以及参数名等。shrink 收缩代码 主要用于从多个入口点中删除所有无法访问的类、字段和方法。keep keep是rename和shrink的子元素用于指定从父级rename或shrink任务中排除的元素。注意事项注意事项1 如果项目需要shrink, shrink最好是配置在rename之前。即在进行代码混淆之前先进行代码压缩。 因为压缩代码需要指定压缩的根代码。举个例子比如制定main方法 。如果先混淆DplDbtransferApplication类名被修改的话比如为A.class该配置将会无效所有代码都会被 shrink 删除因为已经找不到DplDbtransferApplication这个类了类名被修改。其他配置请参考官方文档。配置说明基础配置 !-- yguard 是公用配置和rename以及shrink配置的容器标签 -- yguard !-- 必须至少指定一个inoutpair元素或一个非空inoutpairs元素才能运行yguard任务。此元素指定输入和输出 jar 文件的路径 in out 必须指定设置值不指定报错 1.in 指定一个现有的jar/war文件其中包含未收缩和未混淆的 .class文件。 2.out 指定一个 jar/war文件的路径该文件将被创建并用于放置收缩和混淆过程的结果。 3.resources 如何处理资源文件支持三种值copy,auto,none。 默认配置copy。 1.copy 直接复制资源文件 默认情况下只需将所有资源文件复制到输出 jar 中 2.auto 仅复制那些在压缩后仍包含一个或多个 .class 文件的目录中的资源文件。 3.none 丢弃所有资源文件。-- inoutpair in${project.build.directory}/${project.build.finalName}.${project.packaging} out${project.build.directory}/${project.build.finalName}.${project.packaging} / externalclasses /externalclasses !-- 用于配置一些属性 保存类的调试信息比如 LineNumberTable行号表LocalVariableTable本地变量表等。 -- attribute nameSourceFile, LineNumberTable, LocalVariableTable patternset include namecom.ewa.pipe.**/ /patternset /attribute !-- shrink 用于收缩代码配置。 1.logfile shrink过程的日志文件 2.在shrink过程中如果有错误代码,代码将会被替换为 throw new InternalError(Badly shrinked)。 比如当某些类的private属性被删除但是public方法中有引用该属性而属性被删除了即会输出该异常错误。 -- shrink logfile${project.build.directory}/yshrink.log.xml createStubstrue !-- shrink中的keep和rename中的keep一致。 -- keep method namevoid main(java.lang.String[]) class${mainclass} / /keep /shrink !-- 用于自定义某些配置和属性更改。 1.mainclass 用于设置主程序启动位置该文件将不会被混淆。 2.logfile 混淆过程中的日志文件保存地址。名称以“.gz”结尾yGuard 将自动创建文件的 gzip 压缩版本默认为yguardlog.xml 3.conservemanifest 当为false时重新生成 MANIFEST.MF的内容。默认为false。 4.replaceClassNameStrings 是否混淆代码中某些字符串跟类名相关的东西。默认为true 比如源码 System.out.print(com.ewa.pipe.dbtransfer.dpl.mapper.BlendMapper);混淆后 System.out.print(com.ewa.pipe.dbtransfer.dpl.A.B); 5.scramble 是否随机混淆代码,默认false。如果为true即每次打包生成的类名将随机替换。比如Test.class 第一次混淆为A.class,第二次就为B.class 6.annotationClass 某些不必要混淆的数据比如如下配置为Test注解当配置到类上时类中的所有东西不会被混淆当配置到属性时属性名称不会被混淆。 -- rename mainclasscom.ewa.pipe.dbtransfer.dpl.DplDbtransferApplication logfile${project.build.directory}/yguard.log.xml conservemanifest false replaceClassNameStringstrue scramble false annotationClasscom.ewa.pipe.dbtransfer.dpl.Test !-- -- keep /keep !-- 1.error-checking 用于检测错误检测到错误就失败停止。 -- property nameerror-checking valuepedantic/ !-- 2.error-checking 可用于告诉重命名引擎在混淆期间使用不同的命名方案。目前可以将此属性设置为以下值之一默认small,通常使用small就行了 small将产生非常短的名称即生成的 jar 文件将尽可能小。 best会产生很可能被反编译器和反汇编器误解的名称。使用这种命名方案在大多数文件系统上甚至不可能成功解压缩或解压缩生成的 jar 文件Windows、Standard Unix、Standard Linux、MacOS。然而这种方案占用了大量空间并且生成的 jar 可能会变大通常大约是两倍大小。 mix是其他两个值的混合这会导致合理的小但仍然难以反编译 jar 文件。 -- !-- 其他属性 language-conformity overload-enabledobfuscation-prefixdigestsexpose-attributes请参考官方文档。 -- property namenaming-scheme valuesmall/ /rename /yguard复制代码
keep配置说明
class元素
class用于在rename和shrink过程中排除某些类字段和方法。其是keep的子元素。以下是配置说明- 表示会被收缩即被删除
可见性是否被收缩 public protected friendly privatenone - - - -public * - - -protected * * - -friendly * * * -private * * * *属性说明
name 指定要保留的类名。 在shrink中只会保留类名称类中的属性和方法都会被删除掉。classes 保持类的可见性 其值是上述none , public , protected , friendly , private 。默认为nonemethods 保留方法的可见性 值同classes的描述。默认为nonefields 保留属性的可见性 值同classes的描述。默认为noneextends 保留对继承了该类的可见性 。1.在shrink中凡是继承了该类的子类都不会被删除。 2.在rename中凡是继承了该类的子类都不会被修改名称。implements 保留对实现该接口的可见性 。1.在shrink中凡是实现该接口的类都不会被删除。 2.在rename中凡是实现该接口的类都不会被修改名称。注意事项
以上属性可以单独使用一可以混合使用。其 extends/implements 可以和classes methodsfields混合使用。参考列2说明。列1: shrink logfile${project.build.directory}/yshrink.log.xml keep !-- 保留NameTest类不被删除但是内部的方法和会属性会被删除不论私有还是共有。 -- class namecom.arm.code.mix.base.NameTest/ !-- 保留所有公用的类方法和属性。其关联的类方法和属性会被保留不会被删除 -- class classespublic methodspublic fieldspublic/ !-- 保留所有继承了BaseClass的类不被删除但是内部的方法和会属性会被删除不论私有还是共有。 -- class extendscom.arm.code.mix.base.BaseClass/ /keep /shrink复制代码列2: shrink logfile${project.build.directory}/yshrink.log.xml keep !-- 保留NameTest类不被删除并保留其private级别的方法和属性 -- class namecom.arm.code.mix.base.NameTest methodsprivate fieldsprivate/ !-- 保留所有继承了BaseClass的类不被删除,并保留其private级别的方法和属性 -- class extendscom.arm.code.mix.base.BaseClass methodsprivate fieldsprivate/ /keep /shrink复制代码列3:
一下举列几个模式集的列子模式集可以参考ant。 !-- include shrink不需要被删除的类保留的类。rename不需要被混淆的类名 --class patternset include namecom.mycompany.**.*Bean/ exclude namecom.mycompany.secretpackage.*/ exclude namecom.mycompany.myapp.SecretBean/ !-- 由于 Ant$用作转义字符因此如果您想将一个作为参数传递给任务则必须使用两个连续的$s( )。$$-- exclude nameorg.w3c.sax?.**.*$$*/ /patternset/class复制代码method
method 用于在rename和shrink过程中排除方法。其是keep的子元素。以下是配置说明- 表示会被收缩即被删除
!-- 这将保留MyClass类的main和foo方法。此外所有readObject和writeObject方法用于序列化都将保存在com.mycompany.myapp.data包的所有类中。 请注意您必须指定返回参数的类型即使它是 void并且您必须为所有类使用完全限定名称即使是java.lang package. --method classcom.mycompany.myapp.MyClass namevoid main(java.lang.String[])/method classcom.mycompany.myapp.MyClass nameint foo(double[][], java.lang.Object)/method namevoid writeObject(java.io.ObjectOutputStream) patternset include namecom.mycompany.myapp.data.*/ /patternset/methodmethod namevoid readObject(java.io.ObjectInputStream) patternset include namecom.mycompany.myapp.data.*/ /patternset/method复制代码
field
field 您可以按名称指定应从收缩或名称混淆中要保留的字段
!-- 保留MyClass类中的所有字段。 此外所有serialVersionUID字段用于序列化都将保存在com.mycompany.myapp.data包的所有类中。 --field classcom.mycompany.myapp.MyClass namefield/field nameserialVersionUID patternset include namecom.mycompany.myapp.data.*/ /patternset/field复制代码package
package 用于从重命名过程中排除某些包的名称。它不能用于收缩shrink过程 。这对类、方法或字段名称没有影响。 package patternset !-- com.mycompany.myapp不被混淆。myapp下的包名还是会被混淆 -- include namecom.mycompany.myapp.*/ !-- com.mycompany.myapp不被混淆。myapp下的包名也不会被混淆 -- include namecom.mycompany.myapp.**/ /patternset /package复制代码3.几种情况下的使用方式springboot项目1.注意事项
yguard插件执行要放在 spring boot打包项目之前因为反置的话会造成jar中的springboot的启动相关类被混淆而造成启动项目失败。2.项目使用失败的问题收集总结
本地打包之后启动项目失败由于是本地idea将jdk设置成jdk17了导致打包失败。 设置为jdk8后成功启动。项目使用mybaties plus项目里只有一个接口public interface TimePullLogMapper extends BaseMapper{} , 造成混淆后打包报错spring至少一个bean实现。后面加上 后正常。service的接口和实现都要暴露不然spring的注入和nacos的服务发现都会存在问题。3.配置模版
keep !--包名不混淆配置-- package patternset include namecom.arm.oceansearch.**/ /patternset /package !--mybaites 相关的mapper混淆后会造成boot项目启动失败 -- class implementscom.arm.boot.core.base.BaseMapper/ !--mybaites默认生成sql时是使用的实体类的类名所以不能混淆-- class implementscom.arm.oceansearch.entity.BaseEntity/ !-- 本包的controller混淆后无法读取mapping映射原因未知。-- class patternset include namecom.arm.oceansearch.controller.*/ /patternset /class !-- service的接口和实现都要暴露不然spring的注入和nacos的服务发现都会存在问题。 -- class patternset include namecom.arm.oceansearch.service.**/ /patternset /class !--main方法配置-- method namevoid main(java.lang.String[]) classcom.arm.oceansearch.OceanSearchApplication/ /keep复制代码
简介ProGuard 是一个开源的 Java 类文件收缩器、优化器、混淆器和预验证器。因此ProGuard 处理的应用程序和库更小、更快并且在一定程度上可以抵御逆向工程。
收缩步骤检测并删除未使用的类、字段、方法和属性。优化器 步骤优化字节码并删除未使用的指令。混淆步骤使用简短无意义的名称重命名剩余的类、字段和方法。最后的预验证步骤将预验证信息添加到类中这是 Java Micro Edition 和 Java 6 及更高版本所必需的。对反射的处理反射和内省对于任何代码的自动处理都存在特殊的问题。在 ProGuard 中代码中动态创建或调用即按名称的类或类成员也必须指定为入口点。例如Class.forName()构造可以在运行时引用任何类。通常不可能计算必须保留哪些类使用它们的原始名称因为类名可能是从配置文件中读取的例如。因此您必须在 ProGuard 配置中指定它们同样简单-keep选项
Class.forName(SomeClass)SomeClass.classSomeClass.class.getField(someField)SomeClass.class.getDeclaredField(someField)SomeClass.class.getMethod(someMethod, null)SomeClass.class.getMethod(someMethod, new Class[] { A.class,... })SomeClass.class.getDeclaredMethod(someMethod, null)SomeClass.class.getDeclaredMethod(someMethod, new Class[] { A.class,... })AtomicIntegerFieldUpdater.newUpdater(SomeClass.class, someField)AtomicLongFieldUpdater.newUpdater(SomeClass.class, someField)AtomicReferenceFieldUpdater.newUpdater(SomeClass.class, SomeType.class, someField)支持可单独使用。首先下载一个ProGuard 版本或者构建 ProGuard从源头。然后可以通过调用目录中的脚本直接从命令行执行 ProGuard binlinux/macbin/proguard.sh -injars path/to/my-application.jar \ -outjars path/to/obfuscated-application.jar \ -libraryjars path/to/java/home/lib/rt.jarwindowsbin\proguard.bat -injars path/to/my-applicati^ -outjars path/to/obfuscated-application.jar ^ -libraryjars path/to/java/home/lib/rt.jarGradle 模式ant模式Maven模式没有正式提供 maven 集成也无法提供支持但有可用的解决方案但 Guardsquare 不保证它们提供的功能。来源实现github.com/wvengen/pro…github.com/dingxin/pro…错误解析[proguard] Error: The input doesnt contain any classes. Did you specify the proper -injars options?处理inFiltercom/ewa/pipe/**/inFilter inFilter标签设置为包路径地址把‘.’换成‘/’。 injar 指定target中的一个目标地址这里指定编译后的 classes文件夹。 inFilter 指定的是 classes的内部的文件夹package地址。!-- 加载文件的过滤器就是你的工程目录了-- inFiltercom/arm/code/**/inFilter !-- 对什么东西进行加载这里仅有classes成功毕竟你也不可能对配置文件及JSP混淆吧-- injarclasses/injar复制代码以下是一个例子说明如果你想更多的有用信息请查看文档www.guardsquare.com/manual/conf…
configuration !-- 是否将生成的PG文件安装部署-- attachfalse/attach !-- 是否混淆 -- obfuscatetrue/obfuscate !-- 指定生成文件分类 -- !--attachArtifactClassifierpg/attachArtifactClassifier-- !-- 加载文件的过滤器就是你的工程目录了-- inFiltercom/arm/code/**/inFilter !-- 对什么东西进行加载这里仅有classes成功毕竟你也不可能对配置文件及JSP混淆吧-- injarclasses/injar !-- 输出目录-- outputDirectory${project.build.directory}/outputDirectory outjar${project.build.finalName}.${project.packaging}/outjar options !-- JDK目标版本1.7-- option-target 1.8/option !-- 不做收缩删除注释、未被引用代码-- option-dontshrink/option !-- 不做优化变更代码实现逻辑-- option-dontoptimize/option !-- 不忽略非公用类文件及成员-- option-dontskipnonpubliclibraryclasses/option option-dontskipnonpubliclibraryclassmembers/option !-- 优化时允许访问并修改有修饰符的类和类的成员 -- option-allowaccessmodification/option !-- 确定统一的混淆类的成员名称来增加混淆,防止冲突-- option-useuniqueclassmembernames/option !-- 不混淆所有包名Spring配置中有大量固定写法的包名-- option-keeppackagenames/option !-- 不混淆所有特殊的类-- option-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod/option !-- 不混淆所有的set/get方法毕竟项目中使用的部分第三方框架例如Shiro会用到大量的set/get映射-- option-keepclassmembers public class * {void set*(***);*** get*();}/option !-- 不混淆的SpringBoot类及其中的方法 -- option-keep class com.arm.code.mix.base.SpringBoot{ lt;methodsgt;; }/option !-- 不混淆job包下的所有类名且类中的方法也不混淆-- !--option-keep class com.chinatelecom.gz.wy.zhukun.shiro_spring.job.** { lt;methodsgt;; }/option -- !-- 不混淆filter包下的所有类名这里主要是对Shiro的路踢人过滤器混淆对类的属性和方法进行了混淆-- !--option-keep class com.chinatelecom.gz.wy.zhukun.shiro_spring.filter.** /option -- !-- 不混淆model包中的所有类以及类的属性及方法实体包混淆了会导致ORM框架及前端无法识别-- !--option-keep class com.chinatelecom.gz.wy.zhukun.shiro_spring.model.** {*;}/option-- !-- com.test.prog.util, util包不混淆的类的属性及方法实体包 -- !--option-keep class com.test.prog.util.finals.Const{ *; }/option-- !-- 不混淆凭证包下的所有类名但对类中的属性、方法进行混淆原因是Spring配置中用到了这个类名-- !--option-keep class com.test.prog.util.SecCode/option-- !--option-keep class com.test.prog.util.exception.HihSoftHandlerException/option-- !-- 不混淆job包下的所有类名且类中的方法也不混淆-- !--option-keep class com.test.prog.controller.** { lt;methodsgt;; }/option-- /options !-- 添加依赖这里你可以按你的需要修改这里测试只需要一个JRE的Runtime包就行了 -- libs lib${java.home}/lib/rt.jar/lib lib${java.home}/lib/jce.jar/lib !--lib${java.home}/lib/security/local_policy.jar/lib-- !--lib${java.home}/lib/security/US_export_policy.jar/lib-- lib${java.home}/lib/ext/sunjce_provider.jar/lib /libs /configuration