混淆技术研究笔记(五)混淆后如何反篡改?

有了上一节的基础工具后,接下来要考虑如何反篡改。

本文采用的是对混淆后的代码,针对某些关键包的字节码数据计算md5值,对所有类计算完成后对md5值进行排序,排序后拼接字符串再次计算md5值,最后通过私钥对md5进行RSA对称加密,加密后的内容要放到核心的jar包中。

程序在启动时,需要有一些入口点调用代码校验,代码校验时使用classloader搜索指定包中的所有class数据,对这些数据按照相同的规则计算md5值,用公钥解析核心jar包中的加密信息,比对该信息和运行时计算的md5值是否匹配,如果一致则正常运行,如果不一致就终止运行。

运行时获取类信息可以使用Hutool的ClassScanner,这里不再提供详细代码。

接下来的重点就是如何对混淆后的代码进行签名加密,并且把加密信息写入到jar包中。首先已经存在的jar包是无法编辑的,没法直接往里面加入新的文件,因此可行的方式就是创建一个新的jar,把旧jar里面的信息全部拷贝过去,然后再写入新的内容,删除旧jar,把新的重命名为原jar包的名字即可。为了解决何时执行并且写入加密信息,想了几个方案。

方案一

参考 ant 的 task,增加一个新的 task,然后加入到插件配置中,在新的task中读取混淆后的代码,然后替换jar。

在实现这个方案的时候,首先发现一个问题就是无法正确读取混淆后的代码,代码读取的都是混淆前的,似乎是 target/classes 目录的代码,即使能读取混淆后的代码,混淆部分包名的时候无法预先指定要混淆的名字,想要固定需要手动通过 map 指定映射的名字,为了测试方案先绕过了读取类,尝试向jar写入信息,结果删除旧jar的时候发现无法删除,竟然被yguard的任务占用了,这个方案行不通,只能放弃。

方案二

jar包被占用不能覆盖后,只能想别的办法,已经把 mvn clean deploypackage 单独分出去了,是不是先 package 打包,再设法执行代码生成签名,这样分开操作一定不会被占用,最后在执行 deploy 发布。

为了实现这个功能将 yguard 插件的配置挪到了 pom.xml 中的 <profiles>中,添加了一个配置进行混淆,又增加了一个配置仍然使用前面task的方式进行覆盖。经过测试发现可以写入到jar包文件了,占用的问题解决了。

此时前面绕过的问题还要面对,如何在执行 task 时能在类路径中获取到混淆后的代码呢?想了想使用task不知道该如何配置才能让classpath中包含这七十多个jar包,如果打一个可执行jar包,通过 java -cp 手动指定所有类,这种方式似乎可行,如果纯手工操作,虽然麻烦,也是一个办法,但是如何想要集成到CI/CD环境,这种方式就太麻烦了,为了解决这个问题愁了一下午,连微信公众号都差点断更。

对ant和yguard的理解也在不断加深,很多细节不了解导致在反篡改这个功能受阻。在尝试这些方案时,还没看过yguard的代码,混淆技术研究笔记(二)yGuard入门 中介绍的 <externalclasses> 我也不明白,如果当时看到这里,也许就有简单办法实现。

我在一些文章中表达过很多次这种想法,针对某个问题的解决方案,在不同时刻思考得出的方案是不一样的,遇到难题,放松一下再思考,也许能得到更好的解决办法。

方案三

终于看了yguard的源码,没看太明白,没找到合适的入口,在我解决混淆代码处理SPI接口文件名时,用到了<adjust>配置,这个配置可以修改文件名,还支持修改文件内容,能不能从这儿入手,写一个类似 <adjust> 的实现,我可能还需要预先在核心jar包中提前预制一个文件,通过修改文件内容来实现这个功能,这个办法也许行的通,明天早晨到公司一定要试试,这是下班回家路上想到的方案。

相关推荐
小屁孩大帅-杨一凡2 分钟前
java后端请求想接收多个对象入参的数据
java·开发语言
java1234_小锋9 分钟前
使用 RabbitMQ 有什么好处?
java·开发语言
TangKenny22 分钟前
计算网络信号
java·算法·华为
肘击鸣的百k路23 分钟前
Java 代理模式详解
java·开发语言·代理模式
城南vision30 分钟前
Docker学习—Docker核心概念总结
java·学习·docker
wyh要好好学习37 分钟前
SpringMVC快速上手
java·spring
尢词39 分钟前
SpringMVC
java·spring·java-ee·tomcat·maven
Mr. zhihao1 小时前
享元模式在 JDK 中的应用解析
java·享元模式
茶馆大橘1 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
wrx繁星点点1 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式