代码混淆之class-winter
代码混淆之class-winter
- 代码混淆之class-winter
- 功能与特性
- 加密
- 加密参数
- 解密(启动)
- 解密参数
- 巧用loader.path
郑重声明
class-winter 是本人在学习完 class-final(v1.1.9) 后,仿照class-final进行编写的,部分思路与class-final一致
功能与特性
- 支持war(普通war+可执行war)加密
- 支持jar(普通jar+可执行jar)加密
- 支持xml加密(掩耳盗铃版)
加密
方式一:通过maven插件自动加密。
<!--class-winter插件注:自Maven3.0.3起, 绑定到同一phase的Maven插件将按照pom.xml中声明的顺序执行注:此插件最好放置在同一phase的最后执行。 --> <plugin><groupId>com.idea-aedi</groupId><artifactId>class-winter-maven-plugin</artifactId><version>2.6.6</version><!-- 相关配置 --><configuration><!-- <finalName></finalName>--><includePrefix>加密范围</includePrefix><!-- <excludePrefix></excludePrefix>--><!-- <includeXmlPrefix></includeXmlPrefix>--><!-- <excludeXmlPrefix></excludeXmlPrefix>--><!-- <toCleanXmlChildElementName></toCleanXmlChildElementName>--><!-- <password></password>--><!-- <includeLibs></includeLibs>--><!-- <alreadyProtectedLibs></alreadyProtectedLibs>--><!-- <supportFile></supportFile>--><!-- <jvmArgCheck></jvmArgCheck>--><!-- <tips></tips>--><!-- <debug></debug>--></configuration><executions><execution><phase>package</phase><goals><goal>class-winter</goal></goals></execution></executions> </plugin>
注:不必担心信息泄漏问题,使用此方式生成混淆的jar包时,会擦除pom.xml中关于class-winter-plugin的信息。
方式二:通过 class-winter-core.jar 主动加密。
java -jar class-winter-core-2.6.6.jar originJarOrWar=${要加密的项目.jar或.war包} includePrefix=${加密范围} [k3=v3 k4=v4 ...] # 对于复杂的参数值,可以使用引号引起来 # linux java -jar class-winter-core-2.6.6.jar k1='v1' k2='v2' # windows java -jar class-winter-core-2.6.6.jar k1="v1" k2="v2"
加密参数
参数 | 是否必填 | 说明 | 示例 |
originJarOrWar | 是 |
指定要加密的jar/war文件 注:当使用maven插件进行自动加密时,无此参数。 |
originJarOrWar=/my-project.jar |
includePrefix | 是 |
通过前缀匹配的形式定位要加密的class 注:多个通过逗号分割。 |
includePrefix=com includePrefix=com,org |
excludePrefix | 否 |
通过前缀匹配的形式排除class,不对其加密 注:多个通过逗号分割。 注:excludePrefix优先级高于includePrefix。 |
excludePrefix=com.example.service,com.example.util.StrUtil.class |
includeXmlPrefix | 否 |
通过打出来的包中条目的entryName前缀匹配的形式定位要加密的xml 注:多个通过逗号分割。 注:如果您打出来的加密包是准备作为一个lib包提供给第三方使用的,那么请不要使用此参数,因为解密时是不会解密项目所依赖的lib包中的xml的。 |
includeXmlPrefix=BOOT-INF/classes/ includeXmlPrefix=BOOT-INF/classes/com/demo/mapper/,BOOT-INF/classes/com/demo/dao/ |
excludeXmlPrefix | 否 |
通过打出来的包中条目的entryName前缀匹配的形式排除xml,不对其加密 注:多个通过逗号分割。 |
excludeXmlPrefix=BOOT-INF/classes/com/demo/mapper/ excludeXmlPrefix=BOOT-INF/classes/com/demo/mapper/,BOOT-INF/classes/com/demo/dao/UserDao.xml |
toCleanXmlChildElementName | 否 |
加密xml中的哪些一级元素 注:默认值为resultMap,sql,insert,update,delete,select 注:多个通过逗号分割。 |
toCleanXmlChildElementName=select,delete,resultMap |
finalName | 否 |
指定加密后生成的jar包名 注:若finalName与加密的包一致,那么生成的加密后的包会覆盖原来的包。 |
finalName=mine-project |
password | 否 |
主动指定密码 注:密码不能包含空格和逗号。 |
password=123456 |
includeLibs | 否 |
指定将lib包也纳入加密范围内 注:多个通过逗号分割。 注:lib中的class是否会被加密,还得由includePrefix和excludePrefix决定。 |
includeLibs=a.jar,b.jar |
alreadyProtectedLibs | 否 |
指明项目所依赖的lib中,哪些lib本身就已经是被class-winter加密了的 注:多个通过逗号分割。 注:主要用于处理第三方提供的由class-winter加密了的依赖包的场景。 注:若lib需要密码,那么需要在指定lib的同时通过冒号接上密码。 注:如果lib有密码,那么密码不能包含逗号。 |
alreadyProtectedLibs=a.jar,b.jar alreadyProtectedLibs=a.jar,b.jar:pwd123 alreadyProtectedLibs=a.jar:pwd1,b.jar:pwd2 |
supportFile | 否 |
指定一个加密辅助jar文件(或jar文件所在的目录) 注:当为目录时,该目录(含子孙目录)下的所有jar都会被作采集作为辅助文件。 注:主要用于解决因ClassNotFound导致的加密失败问题。 |
supportFile=/abc.jar supportFile=/libs |
jvmArgCheck | 否 |
设置当启动混淆包时,必须要有的jvm参数 注:多个通过逗号分割。 注:大小写不敏感。 如:通过设置-XX:+DisableAttachMechanism防止运行时dump class,以提高安全性。 |
jvmArgCheck=-XX:+DisableAttachMechanism,-Xms2048M |
tips | 否 |
指定提示语。 注:当直接使用加密后的jar/war时,用到了加密了的类后,会先System.err.println输出此tips,然后System.exit退出程序。 |
windows示例:tips="请不要直接使用混淆后的jar/war" linux示例:tips='请不要直接使用混淆后的jar/war' |
debug | 否 | 是否开启debug模式 | debug=true |
解密(启动)
通过-javaagent指定代理进行解密启动。
jar解密(启动)
# 假设your-project-encrypted.jar是由class-winter加密后的包,那么你可以这么启动 java -javaagent:/your-project-encrypted.jar -jar /your-project-encrypted.jar # 也可以用class-winter-core-2.6.6.jar # java -javaagent:/class-winter-core-2.6.6.jar -jar /your-project-encrypted.jar # 或者指定参数 # java -javaagent:/your-project-encrypted.jar=debug=true,password=pwd12345 -jar /your-project-encrypted.jar # 参数可以引起来(linux) # java -javaagent:/your-project-encrypted.jar='debug=true,password=pwd12345' -jar /your-project-encrypted.jar # 参数可以引起来(windows) # java -javaagent:/your-project-encrypted.jar="debug=true,password=pwd12345" -jar /your-project-encrypted.jar
war解密(启动)
以Tomcat9为例
linux方式一
编辑tomcat/bin/catalina.sh文件,在最上面加上
# 如果你有参数, 那么 -javaagent:/class-winter-core-2.6.6.jar=k1=v1,k2=v2 CATALINA_OPTS="$CATALINA_OPTS -javaagent:/class-winter-core-2.6.6.jar=debug=true"; export CATALINA_OPTS;
linux方式二
在tomcat/bin目录下创建setenv.sh文件,并写上
# 如果你有参数, 那么 -javaagent:/class-winter-core-2.6.6.jar=k1=v1,k2=v2 JAVA_OPTS="$JAVA_OPTS -javaagent:/class-winter-core-2.6.6.jar=debug=true"; export JAVA_OPTS;
windows方式一
编辑tomcat/bin/catalina.bat文件,在@echo off后加上catalina参数
rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-2.6.6.jar=k1=v1,k2=v2 set CATALINA_OPTS="-javaagent:D:/class-winter-core-2.6.6.jar"
windows方式二
在tomcat/bin目录下创建setenv.bat文件,并写上
rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-2.6.6.jar=k1=v1,k2=v2 set JAVA_OPTS="-javaagent:D:/class-winter-core-2.6.6.jar"
解密参数
参数 | 是否必填 | 说明 | 示例 |
password | 否 | 指定解密密码 | password=pwd123 |
passwordFromFile | 否 |
从指定文件中读取文本作为解密密码 注:此参数由2.4.0版本开始支持 |
passwordFromFile=/my-pwd-file.txt |
passwordFromShell | 否 |
执行shell文件中的代码,并以其返货值作为解密密码 注:此参数由2.4.0版本开始支持 |
passwordFromShell=/my-pwd-file.shell |
skipProjectPathPrefix | 否 |
是否跳过指定前缀的项目路径(当class-winter解密逻辑试图解析那些进入premain但是非class-winter加密项目时,会因为获取印章失败Obtain project seal fail而停止,此时如果确认这个项目没有加密文件的话,可以使用此参数跳过) 注:此参数由2.6.4版本开始支持 |
skipProjectPathPrefix=/D:/apache-tomcat-9.0.71/bin/ 多个通过___符号拼接:skipProjectPathPrefix=/D:/apache-tomcat-9.0.71/bin/___/D:/jd/classpath/lib/ |
decryptProjectPathPrefix | 否 |
是否仅解密指定前缀的项目路径(优先级低于skipProjectPathPrefix) 注:此参数由2.6.6版本开始支持 |
decryptProjectPathPrefix=/D:/apache-tomcat-9.0.71/bin/ 多个通过___符号拼接:decryptProjectPathPrefix=/D:/apache-tomcat-9.0.71/bin/___/D:/jd/classpath/lib/ |
debug | 否 | 是否开启debug模式 | debug=true |
巧用loader.path
需求描述
已加密的包,如何提供给客户使用?
- 方案一:class-winter加密时,使用
alreadyProtectedLibs
参数,但是要求客户的项目也需要使用class-winter加密(,哪怕客户的项目什么也不需要加密,也要求客户有使用class-winter这个动作) - 方案二:-Dloader.path与class-winter结合使用
- 方案一:class-winter加密时,使用
-Dloader.path方案实现
假设客户依赖了我们的加密包
客户使用maven插件,打包时将项目代码和依赖的lib分开
完整pom示例:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.demo</groupId><artifactId>encrypted-lib-no-pwd</artifactId><scope>system</scope><version>1.0.0</version><systemPath>${pom.basedir}/src/main/resources/lib/encrypted-lib-no-pwd-1.0.0.jar</systemPath></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 指定该Main Class为全局的唯一入口 --><mainClass>com.ideaaedi.demo.DemoApplication</mainClass><!-- 把systemPath指定的jar包也纳入lib --><includeSystemScope>true</includeSystemScope><fork>true</fork><!-- 设置为ZIP,此模式下spring-boot-maven-plugin会将MANIFEST.MF文件中的Main-Class设置为org.springframework.boot.loader.PropertiesLauncher --><layout>ZIP</layout><includes><include><groupId>nothing</groupId><artifactId>nothing</artifactId></include></includes></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><!-- 通过插件将所有依赖的lib包放到编译后的target/lib目录,并且在打包时候排除内部依赖 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.2.0</version><executions><execution><id>copy-dependencies</id><phase>prepare-package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory><overWriteReleases>false</overWriteReleases><overWriteSnapshots>false</overWriteSnapshots><overWriteIfNewer>true</overWriteIfNewer><includeScope>compile</includeScope></configuration></execution></executions></plugin></plugins></build></project>
打出来的包:
客户可以这样启动项目
java -Dloader.path=./lib/ -javaagent:./{class-winter.jar} -jar {客户项目.jar}
^_^ 本文已经被收录进《程序员成长笔记》 ,笔者JustryDeng
代码混淆之class-winter相关推荐
- python 代码混淆 代码保护 pyminifier
python 代码混淆 pyminifier 文章目录 python 代码混淆 pyminifier 安装 修改源码 混淆 python 代码 网站混淆 常用命令 安装 pip install pym ...
- 被黑客们使用的代码混淆技术
长久以来,代码混淆技术一直都被认为是不能登大雅之堂的奇巧淫技,没有哪个学者会拿正眼瞧它一眼.国际C语言混乱代码大赛(International Obfuscated C Code Contest,IO ...
- android代码混淆笔记
混淆处理的apk被反编译后代码中包名类名等都变成abcd之类.非常难看懂. 使用代码混淆.启用混淆器,对相关文件进行编辑,然后打包签名就能够了: ------------ 在2.3的版本号中,项目中有 ...
- python控制流_Python 的控制流代码混淆
聊下 Python 的代码混淆,对 Python 的代码做混淆感觉是不伦不类,但是对于外包项目交付型的,又有一些需要. 混淆的目的就是加大别人分析你代码逻辑和流程的难度,让代码看上去杂乱,逻辑混乱.但 ...
- Android笔记:防反编译、代码混淆中,解决第三方jar包不被混淆的一些心得,及gson防混淆方法...
为了防止代码被反编译,一般在签名导出前需要对代码进行混淆.最近发现自己的一个项目工程在代码混淆后,使用中出现了异常.以下是自己这几天在解决代码混淆以及引入第三方jar包导致混淆出现的问题处理的一些心得 ...
- android proguard 第三方jar,Android Studio代码混淆-第三方jar混淆汇总(持续更新)
前言 Android有非常多的优秀的第三方开源jar包,我们经常在我们的项目中使用了不少jar包,但是往往到了release的时候就忘了混淆第三方jar包了,会给我们开发带来不少麻烦,所有在这里汇总一 ...
- iOS应用安全之代码混淆实现篇
1.iOS应用安全之代码混淆设计篇 2.iOS应用安全之代码混淆实现篇 针对设计篇描述的大致思路,现在针对各个问题点,给出实现方法 该脚本大致使用的工具如下:vi.grep.sed.find.awk. ...
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读 ...
- 日积月累:ProguardGui进行jar包代码混淆
原文:http://blog.csdn.net/p106786860/article/details/12168703 前面文章<Proguard进行源代码混淆>讲解过怎么使用Progua ...
- android 第三方加密软件,Android实用图文教程之代码混淆、第三方平台加固加密、渠道分发...
第一步:代码混淆(注意引入的第三方jar) 在新版本的ADT创建项目时,混码的文件不再是proguard.cfg,而是project.properties和proguard-project.txt. ...
最新文章
- web中的cookies以及作用--web testing 学习笔记
- MMD_2a_FindSimilarSets
- 对计算机上的浏览器的介绍,Edge浏览器的前世今生 史上最全Edge浏览器介绍
- LeetCode Rotate Function(寻找规律)
- 设计模式复习-备忘录模式
- nginx 还是欢迎界面_初识Nginx性能安全优化
- Kotlin进行异步操作
- linux 服务器安装mysql5.6
- 设计模式第19篇:访问者模式
- hash table(开放寻址法-线性探查实现的哈希表)
- Java NIO学习篇之缓冲区Buffer详解
- js 阻止冒泡事件和默认事件
- 阿里云OSS创建Access,并连接到cloudreve
- c#里listview里如何获取点击的是哪一列
- 连接服务器打印机文件名无效,局域网打印机连接时显示打印机名无效是何原因? 求教数码高手!...
- u盘插上电脑显示计算机无响应,为什么u盘连接电脑没反应,u盘在电脑上显示不出来...
- 布丰投针实验(如何将Geogebra动态文件嵌入博客中)
- 本周最新文献速递20211226
- 【详细】阿里云Accesskey创建步骤记录
- Labview调用EXE形式COM组件
热门文章
- Android Vitamio的使用解析
- ci mysql操作_MySQL基础篇/第3篇:MySQL基本操作语句.md · icanci/MySQL-Review - Gitee.com...
- uniapp微信客服
- 计算机网络-自顶向下(学习笔记)
- 诺特定理:物理世界中的守恒定律与对称性关系
- 浅谈电磁学——高斯定理 环路定理
- 我国首次评选30名国医大师 享省部级劳模待遇
- Edge浏览器的主页被360篡改的解决办法
- ESC32硬件---电路分析二(电流检测和反电动势检测)
- 高分辨率光学遥感图像水体分类综述2022.03