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

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

本文采用的是对混淆后的代码,针对某些关键包的字节码数据计算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包中提前预制一个文件,通过修改文件内容来实现这个功能,这个办法也许行的通,明天早晨到公司一定要试试,这是下班回家路上想到的方案。

相关推荐
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象5 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了6 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王6 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康6 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神7 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342737 小时前
Java实现离线身份证号码OCR识别
java·开发语言