震动!三分钟内搞定ProGuard混淆Java代码全部题目!绝招大公开! ...

打印 上一主题 下一主题

主题 979|帖子 979|积分 2937

大家好,你的玉轮我的心,我是博主小阿金,接待各位工友。 我们公司的测试同砚,绝对是我的一生之敌,平常没事就喜欢给找点难搞的小bug来提提兴趣,这不昨天又给抛出来一个安全测试bug,闲着没事把我们的后端jar反编译了,拿到源码就是咔咔一顿测试,结果可想而知,博主这就来折腾反编译的工作了,固然有点烦,但是这位仁兄提出的题目也不无道理,值得深究一下。
一. 混淆

当前的天下抄袭不绝,固然本着开源的精神,我们也提倡代码共享,但是绝对拒绝代码抄袭,为了防止天下被破坏,为了保卫天下的和平,天然而然衍生了很多代码混淆的技能,那么何为代码混淆呢?
答案就是一种通过对代码进行修改和重构,使其变得难以明白和逆向工程的技能。重要被用于保护软件知识产权和防止恶意攻击者对代码进行逆向分析。
二. 选择工具

工欲善其事必先利其器,要想种地必须先挑好武器,在Java开发中,有一些常用的代码混淆工具,如ProGuard、Allatori Java Obfuscator、DashO等。这些工具可以帮助开发者对Java代码进行混淆处理,保护代码的安全性。综合以上对比,本次选择ProGuard这款工具进行解说,毕竟群众的眼睛是雪亮的,而且他照旧免费的!!!
反编译工具下载:http://java-decompiler.github.io/ 解压后直接打开jd-gui.exe文件即可,然后把打包好的jar直接丢进去,就可以完美的看到反编译后的代码布局了。


三. 代码混淆

3.1配置混淆规则

第一步, 在项目根路径下,新增一份混淆规则文件 proguard.cfg

  1. #指定Java的版本
  2. -target 1.8
  3. #proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
  4. -dontshrink
  5. #是否关闭字节码级别的优化,如果不开启则设置如下配置
  6. -dontoptimize
  7. #混淆时不生成大小写混合的类名,默认是可以大小写混合
  8. -dontusemixedcaseclassnames
  9. # 对于类成员的命名的混淆采取唯一策略
  10. -useuniqueclassmembernames
  11. # 保留异常、注解信息
  12. -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
  13. # 保留接口中的所有原始名称(不混淆)
  14. -keepnames interface ** { *; }
  15. # 保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
  16. -keepparameternames
  17. # 保留枚举成员及方法
  18. -keepclassmembers enum * { *; }
  19. # 保留特定注解的类和方法
  20. -keepclasseswithmembers class * {
  21.     @org.springframework.context.annotation.Bean <methods>;
  22.     @org.springframework.beans.factory.annotation.Autowired <fields>;
  23.     @org.springframework.beans.factory.annotation.Value <fields>;
  24.     @org.springframework.stereotype.Service <fields>;
  25.     @org.springframework.stereotype.Component <fields>;
  26. }
  27. # 忽略note消息
  28. -dontnote
  29. # 打印配置信息
  30. -printconfiguration
  31. # 保留主应用程序入口点
  32. -keep public class com.xx.xxApplication {
  33.     public static void main(java.lang.String[]);
  34. }
复制代码
3.2引入插件依赖

注意proguard依赖顺序应该在maven-plugin之上,否则编译不访问效。
  1. <build>
  2.     <plugins>
  3.         <plugin>
  4.             <groupId>com.github.wvengen</groupId>
  5.             <artifactId>proguard-maven-plugin</artifactId>
  6.             <version>2.6.0</version>
  7.             <executions>
  8.                 <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
  9.                 <execution>
  10.                     <phase>package</phase>
  11.                     <goals>
  12.                         <goal>proguard</goal>
  13.                     </goals>
  14.                 </execution>
  15.             </executions>
  16.             <configuration>
  17.                 <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
  18.                 <injar>${project.build.finalName}.jar</injar>
  19.                 <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
  20.                 <outjar>${project.build.finalName}.jar</outjar>
  21.                 <!-- 是否混淆 默认是true -->
  22.                 <obfuscate>true</obfuscate>
  23.                 <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
  24.                 <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
  25.                 <!-- 额外的jar包,通常是项目编译所需要的jar -->
  26.                 <libs>
  27.                     <lib>${java.home}/lib/rt.jar</lib>
  28.                     <lib>${java.home}/lib/jce.jar</lib>
  29.                     <lib>${java.home}/lib/jsse.jar</lib>
  30.                 </libs>
  31.                 <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
  32.                 <outputDirectory>${project.basedir}/target</outputDirectory>
  33.                 <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
  34.                 <options>
  35.                     <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
  36.                 </options>
  37.             </configuration>
  38.         </plugin>
  39.         <plugin>
  40.             <groupId>org.springframework.boot</groupId>
  41.             <artifactId>spring-boot-maven-plugin</artifactId>
  42.             <version>2.5.15</version>
  43.             <configuration>
  44.                 <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
  45.                 <includeSystemScope>true</includeSystemScope>
  46.             </configuration>
  47.             <executions>
  48.                 <execution>
  49.                     <goals>
  50.                         <goal>repackage</goal>
  51.                     </goals>
  52.                     <configuration>
  53.                         <mainClass>com.xx.xxApplication</mainClass>
  54.                     </configuration>
  55.                 </execution>
  56.             </executions>
  57.         </plugin>
  58.         <plugin>
  59.             <groupId>org.apache.maven.plugins</groupId>
  60.             <artifactId>maven-war-plugin</artifactId>
  61.             <version>3.1.0</version>
  62.             <configuration>
  63.                 <failOnMissingWebXml>false</failOnMissingWebXml>
  64.                 <warName>${project.artifactId}</warName>
  65.             </configuration>
  66.        </plugin>
  67.     </plugins>
  68.     <finalName>${project.artifactId}</finalName>
  69. </build>
复制代码
经过如上配置后可以发现,maven管理页面已经出现了proguard打包程序,proguard报红不要怕,一样平常是idea缓存题目导致,扫除一下缓存重启idea就可以了。

3.3验证

3.3.1:题目一

本来想着配置完事,直接打包应该就没题目了,惋惜天不遂人愿,一点打包就会莫名其妙的报错,而且没有一颔首绪,本着用新不用旧的题目,博主升级了一下依赖,发现完美的解决了这个题目,有相同题目的小同伴可以实行一下,把proguard版本升级到2.6.1。
  1. <groupId>com.github.wvengen</groupId>
  2. <artifactId>proguard-maven-plugin</artifactId>
  3. <version>2.6.1</version>
复制代码
3.3.2:题目二


完美打好jar包之后,拿到加密后的jar扔到反编译工具测试一下,也是完美的通过,末了在运行的时间又报了一个错误,
错误信息如下:
  1. Annotation-specified bean name 'a' for bean class [com.document.a.a.b.a] conflicts with existing, non-compatible bean definition of same name and class [com.document.a.a.a.a]
复制代码
这意味着在混淆过程中,com.document.a.a.b.a 和 com.document.a.a.a.a 被重定名为相同的名称 a,从而导致Spring容器中的Bean名称辩说。
为了制止这种情况,我们必要修改ProGuard的配置,以确保这些特定的类和包不被混淆。可以在proguard.cfg文件中添加如下配置后,题目完美解决。
  1. # 保留特定包中的类(假设你有一个特定的包需要完全保留)
  2. -keep class com.document.web.** { *; }
复制代码
到此项目完美乐成的运行起来,如有帮助到你,接待点赞评论转发哟!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表